EN=1; /*EN下降沿*/ _nop_(); _nop_(); EN=0; }
/*设置页 0xb8是页的首地址*/ void SetLine(uchar page) {
page=0xb8|page; /*1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页*/ SendCommandToLCD(page); }
/*设定显示开始行,0xc0是行的首地址*/ void SetStartLine(uchar startline) { startline=0xc0|startline; /*1100 0000*/
SendCommandToLCD(startline); /*设置从哪行开始:0--63,一般从0 行开始显示*/ }
/*设定列地址--Y 0-63 ,0x40是列的首地址*/ void SetColumn(uchar column) {
column=column &0x3f; /*column最大值为64,越出 0= /*开关显示,0x3f是开显示,0x3e是关显示*/ void SetOnOff(uchar onoff) { onoff=0x3e|onoff; /*0011 111x,onoff只能为0或者1*/ SendCommandToLCD(onoff); } /*写显示数据 */ void WriteByte(uchar dat) { CheckState();/*状态检查,LCD是否忙*/ RS=1; /*RS=0写指令,RS=1写数据*/ RW=0; /*R/W=“L” ,E=“H→L”数据被写到 IR 或 DR */ if(!Reverse_Display) /*根据Reverse_Display决定是否反相显示*/ Databus=dat; /*dat:显示数据*/ else Databus=~dat; EN=1; /*EN下降沿*/ _nop_(); _nop_(); EN=0; } /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ void SelectScreen(uchar screen) { switch(screen) { case 0: cs1=0;/*全屏*/ _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; case 1: cs1=0;/*左屏*/ _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); break; case 2: cs1=1;/*右屏*/ _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); break; } } /*清屏screen: 0-全屏,1-左屏,2-右*/ void ClearScreen(uchar screen) { uchar i,j; SelectScreen(screen); for(i=0;i<8;i++) /*控制页数0-7,共8页*/ { SetLine(i); SetColumn(0); for(j=0;j<64;j++) /*控制列数0-63,共64列*/ { WriteByte(0x00); /*写点内容,列地址自动加1*/ } } } /*初始化LCD*/ void InitLCD() { CheckState(); SelectScreen(0); SetOnOff(0); /*关显示*/ SelectScreen(0); SetOnOff(1); /*开显示*/ SelectScreen(0); ClearScreen(0); /*清屏*/ SetStartLine(0);/*开始行:0*/ } /*--------------------------显示全角汉字-----------------------*/ /*ss选屏参数,pagr选页参数,column选列参数,number选第几汉字输出*/ /*ss=1右屏2左屏,pagr=0,2,4,6第0~3行,column=0~3汉子出现的列,number选第几汉字输出*/ void Display(uchar ss,uchar page,uchar column,uchar number) { uchar i; SelectScreen(ss); column=column&0x3f; SetLine(page); /*写上半页*/ SetColumn(column); /*控制列*/ for(i=0;i<16;i++) /*控制16列的数据输出*/ { WriteByte(Hzk[i+32*number]);/*i+32*number汉字的前16个数据输出*/ } SetLine(page+1); /*写下半页*/ SetColumn(column); /*控制列*/ for(i=0;i<16;i++) /*控制16列的数据输出*/ { WriteByte(Hzk[i+32*number+16]);/*i+32*number+16汉字的后16个数据输出*/ } } /*---------------------显示半角汉字和数字和字母----------------------*/ /*选屏参数,pagr选页参数,column选列参数,number选第几汉字输出*/ void Displayen(uchar ss,uchar page,uchar column,uchar number) { uchar i; SelectScreen(ss); column=column&0x3f; SetLine(page); /*写上半页*/ SetColumn(column); for(i=0;i<8;i++) { WriteByte(Ezk[i+16*number]); } SetLine(page+1); /*写下半页*/ SetColumn(column); for(i=0;i<8;i++) { WriteByte(Ezk[i+16*number+8]); } } /******************************************** 内部函数,延时1 ********************************************/ void Delay() { // {P10=1;_nop_();P10=0;} _nop_(); _nop_(); /*根据晶振频率制定延时时间*/ } /******************************************** 内部函数,I2C开始 ********************************************/ void P8563_Start() { EA=0; SDA=1; SCL=1; Delay(); SDA=0; Delay(); SCL=0; } /******************************************** 内部函数,I2C结束 ********************************************/ void P8563_Stop() { SDA=0; SCL=0; Delay(); SCL=1; Delay(); SDA=1; Delay(); EA=1; } /******************************************** 内部函数,输出ACK ,每个字节传输完成,输出ack=0,结束读书据,ack=1; ********************************************/ void P8563_WriteACK(uchar ack) { SDA=ack; Delay(); SCL=1; Delay(); SCL=0; } /******************************************** 内部函数,等待ACK ********************************************/ void P8563_WaitACK() { uchar errtime=20; SDA=1; Delay(); /*读ACK*/ SCL=1; Delay(); while(SDA) { errtime--; if(!errtime) P8563_Stop(); } SCL=0; Delay(); } /******************************************** 内部函数.输出数据字节 入口:B=数据 ********************************************/ void P8563_writebyte(uchar wdata) { uchar i; for(i=0;i<8;i++) { if(wdata&0x80) SDA=1; else SDA=0; wdata<<=1; SCL=1; Delay(); SCL=0;