//EDM12864B DRIVE//
/**************************************
PAGEADD 为页地址起使
TIERADD 为行地址起使
DIS_STARTADD 为开始命令
CTABLE 为汉字字库数组
ETABLE 为英文字库数组
***************************************/
#include
#define uchar unsigned char
#define uint unsigned int
#define High 1
#define Low 0
#define _nop {}
#define PAGEADD 0xb8
#define TIERADD 0x40
#define DIS_STARADD 0xc0
uint key_value;
sbit DI=P3^4;
sbit E=P3^2;
sbit CS1=P3^1;
sbit CS2=P3^0;
sbit RW=P3^3;
sbit k1=P1^2;
sbit k2=P1^3;
sbit k3=P1^4;
sbit k4=P1^5;
sbit beep=P1^7;
sbit k5=P1^6;
//uchar ntable[]={61,49,57,60,19,49,62,49,60,63,55,2,0,0,6,22,56,
//63,68,61,49,57,60,17,51,63,61};//email:analog2006@hotmail.com
//uchar data voltage_display[8];
bit flag;
uchar num;
//标志位
/****************************
中文字符表
显示"欢迎使用液晶模块"
*****************************/
uchar code table2[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x60,0x00,0xFC,0x04,0x24,0x24,0x24,
0x25,0xE6,0x24,0x24,0x34,0xA6,0x04,0x00,
0x04,0x42,0x31,0x0F,0x00,0xFF,0x01,0x11,
0x09,0x07,0x09,0x51,0x81,0x7F,0x01,0x00,//病(0)
0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x45,
0xFE,0x44,0x44,0x44,0x64,0x46,0x04,0x00,
0x40,0x30,0x0F,0x20,0x10,0x08,0x04,0x03,
0xFF,0x01,0x02,0x04,0x18,0x30,0x10,0x00,//床(1)
0x00,0xFC,0x04,0x04,0xFE,0x04,0x14,0x64,
0x04,0xFC,0x44,0x22,0x33,0x82,0x00,0x00,
0x00,0x1F,0x08,0x08,0x1F,0x01,0x01,0x41,
0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x00,//呼(2)
0x00,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0xFC,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,
0x00,0x1F,0x08,0x08,0x08,0x1F,0x00,0x00,
0x1F,0x08,0x08,0x04,0x04,0xFF,0x00,0x00,//叫(3)
0x00,0x02,0x22,0x22,0x32,0x2E,0xA2,0x62,
0x22,0x22,0x91,0x09,0x01,0x00,0x00,0x00,
0x00,0x00,0x42,0x22,0x1A,0x43,0x82,0x7E,
0x02,0x02,0x0A,0x13,0x66,0x00,0x00,0x00,//系(4)
0x20,0x30,0xAC,0x63,0x30,0x88,0xC8,0xA8,
0x99,0x8E,0x88,0xA8,0xCC,0x88,0x00,0x00,
0x22,0x67,0x22,0x12,0x92,0x40,0x30,0x0F,
0x00,0x00,0x3F,0x40,0x40,0x41,0x70,0x00,//统(5)
0x80,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,
0xA2,0xA2,0xA2,0xBF,0x82,0xC0,0x80,0x00,
0x00,0x00,0x00,0x04,0x06,0x05,0x04,0x04,
0x44,0x84,0x44,0x3E,0x04,0x00,0x00,0x00,//号(6)
0x00,0x00,0xFC,0x44,0x44,0x44,0x44,0x45,
0xFE,0x44,0x44,0x44,0x64,0x46,0x04,0x00,
0x40,0x30,0x0F,0x20,0x10,0x08,0x04,0x03,
0xFF,0x01,0x02,0x04,0x18,0x30,0x10,0x00,//床(7)
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//一(7)
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,//二(7)
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,
0x84,0x84,0x84,0xC4,0x86,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,//三(7)
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,
0x04,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x7F,0x20,0x28,0x24,0x23,0x20,0x20,
0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,//四(7)
0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,
0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B,
0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00 //!(7)
};
/********************************
显示用的延时函数
延时长度有参数 n 决定
*********************************/
Delay_nms(uchar n)
{ uchar a;
for(;n>0;n--)
{
for(a=0;a<100;a++)
{
_nop;
_nop;
_nop;
_nop;
};
};
}
/*****************************************
DEM12864B 状态检测,从 EDM12864B 读出数
据检测标志位 BF
******************************************/
void LCD_Busy()
{
uchar busy;
E=Low;
DI=Low;
RW=High;
while(1)
{
E=High;
_nop;
_nop;
busy=P2;//读状态标志寄存器
_nop;
E=Low;
if((busy&0x90)==0)//检测 BF 和 RES 位,两者都为零时表示可进行写入
break;
};
}
/*********************************
写指令
**********************************/
void WRCommand_L(uchar command)
{
CS1=High;
CS2=Low;
LCD_Busy();
DI=Low;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=command;
_nop;
E=Low;
_nop;
}
void WRCommand_R(uchar command)
{
CS1=Low;
CS2=High;
LCD_Busy();
DI=Low;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=command;
_nop;
E=Low;
_nop;
}
/***********************************
写一个字节的显示数据
************************************/
void WRdata_L(uchar ucdata)
{
}
CS1=High;
CS2=Low;
LCD_Busy();
DI=High;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=ucdata;
_nop;
E=Low;
_nop;
void WRdata_R(uchar ucdata)
{
CS1=Low;
CS2=High;
LCD_Busy();
DI=High;
_nop;
RW=Low;
_nop;
E=High;
_nop;
P2=ucdata;
_nop;
E=Low;
_nop;
}
/****************************************************
字符为 16*16 显示,分为两个部分写入 32 个字节
前 16 个字节写入第一页(16*8),后 16 个字节写入
第二页(16*8)
左侧写入"欢迎",右侧写入"使用"
*****************************************************/
C_display_L(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
{
uchar k;
C_Pagenum=PAGEADD|C_Pagenum;
C_Tiernum=TIERADD|C_Tiernum;
WRCommand_L(C_Pagenum);
WRCommand_L(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_L(table2[C_Temp*32+k]);
};
C_Pagenum=C_Pagenum+1;
WRCommand_L(C_Pagenum);
WRCommand_L(C_Tiernum);
for(k=0;k<16;k++)
{
}
WRdata_L(table2[C_Temp*32+k+16]);
};
C_display_R(uchar C_Pagenum,uchar C_Tiernum,uchar C_Temp)
{
uchar k;
C_Pagenum=PAGEADD|C_Pagenum;
C_Tiernum=TIERADD|C_Tiernum;
WRCommand_R(C_Pagenum);
WRCommand_R(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_R(table2[C_Temp*32+k]);
};
C_Pagenum=C_Pagenum+1;
WRCommand_R(C_Pagenum);
WRCommand_R(C_Tiernum);
for(k=0;k<16;k++)
{
WRdata_R(table2[C_Temp*32+k+16]);
};
}
/*********************************
清除所有显示 RAM 内容
**********************************/
CLR_DisplayRAM()
//清除显示
{
uchar C_page,i,k;
for(i=0;i<8;i++)
{
C_page=PAGEADD|i;//清除起始页为 0
WRCommand_L(C_page);//清除起始页写入
WRCommand_L(TIERADD);//清除起始行地址写入
WRCommand_R(C_page);
WRCommand_R(TIERADD);
for(k=0;k<64;k++)
WRdata_L(0x00);
WRdata_R(0x00);//lcm 的 ram 自动加一,只许循环 64 次即可
};
{
};
}
/*********************************
初始化 设置启使行
**********************************/
void Init_LCD(void)
{
CLR_DisplayRAM();//清除所有显示寄存器
WRCommand_L(DIS_STARADD);
WRCommand_R(DIS_STARADD);//设置显示起始行地址
WRCommand_L(0x3f);
WRCommand_R(0x3f);//开显示
}
void key()
{
if(k1==0)
//判断有无按键按下
{
Delay_nms(10);
if(k1==0)
{
while(!k1);
num=1;
}
}
if(k2==0)
{
Delay_nms(10);
if(k2==0)
{
while(!k2);
num=2;
}
//判断有无按键按下
}
{
}
{
if(k3==0)
//判断有无按键按下
Delay_nms(10);
if(k3==0)
{
while(!k3);
num=3;
}
if(k4==0)
//判断有无按键按下
Delay_nms(10);
if(k4==0)
{
while(!k4);
num=4;
}
}
if(k5==0)
{
Delay_nms(10);
if(k5==0)
{
while(!k5);
num=0;
}
}
//判断有无按键按下