源代码修正版>> [龙啸九天] [332次] 01-4-16 下午 09:12:28 /*———————————————————— 〖说明〗12232点阵信利液晶基本驱动程序,国内很多122×32的液晶与之完全兼容, 该液晶左右分MASTER和SLAVE,上下共分4页,左边列地址从0-61, 右边列地址从0-61,由于芯片内部线路的落后,所以使用较麻烦。 〖文件〗12232lcd.c ﹫2001/03/23 〖作者〗龙啸九天 c51@yeah.net http://mcs51.yeah.net 〖修改〗修改建议请到论坛公布 http://c51bbs.yeah.net 〖版本〗V1.00A Build 0323 —————————————————————*/ #define E2 P3_5 #define E1 P3_6 #define A0 P3_7 #define DATA P2 /*---------------------------------------------------------------------------- 调用方式:void OutMI(uchar i) 函数说明:发指令i到主窗口。(内函数,私有,用户不直接调用) ------------------------------------------------------------------------------*/ void OutMI(uchar i) { E1=1;_nop_();_nop_(); A0=0;_nop_();_nop_(); DATA=i;_nop_();_nop_(); E1=0;_nop_();_nop_(); } /*------------------------------------------------------------------------------ -- 调用方式:void OutMD(uchar i) 函数说明:发数据i到主窗口。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void OutMD(uchar i) { E1=1;_nop_();_nop_(); A0=1;_nop_();_nop_(); DATA=i;_nop_();_nop_(); E1=0;_nop_();_nop_(); } /*------------------------------------------------------------------------------ -- 调用方式:void OutSI(uchar i) 函数说明:发指令i到从窗口。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void OutSI(uchar i) { A0=0;_nop_();_nop_(); E2=1;_nop_();_nop_(); DATA=i;_nop_();_nop_(); E2=0;_nop_();_nop_(); } /*------------------------------------------------------------------------------ -- 调用方式:void OutSD(uchar i) 函数说明:发数据i到从窗口。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void OutSD(uchar i) { A0=1;_nop_();_nop_(); E2=1;_nop_();_nop_(); DATA=i;_nop_();_nop_(); E2=0;_nop_();_nop_(); } /*------------------------------------------------------------------------------ -- 调用方式:void LcdIni(void) 函数说明:12232点阵液晶初始化,开机后仅调用一次。 -------------------------------------------------------------------------------- -*/ void LcdIni(void) { OutMI(0XE2);OutSI(0XE2);//复位 OutMI(0XAE);OutSI(0XAE);//POWER SAVE OutMI(0XA4);OutSI(0XA4);//动态驱动 OutMI(0XA9);OutSI(0XA9);//1/32占空比 OutMI(0XA0);OutSI(0XA0);//时钟线输出 OutMI(0XEE);OutSI(0XEE);//写模式 OutMI(0X00);OutMI(0XC0); OutSI(0X00);OutSI(0XC0); OutMI(0XAF);OutSI(0XAF); } /*------------------------------------------------------------------------------ -- 调用方式:void SetPage(uchar page0,uchar page1) 函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void SetPage(uchar page0,uchar page1) { OutMI(0xB8|page1);OutSI(0xB8|page0); } /*------------------------------------------------------------------------------ -- 调用方式:void SetAddress(uchar address0,uchar address1) 函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void SetAddress(uchar address0,uchar address1) { OutMI(address1&0x7F);OutSI(address0&0x7F); } /*------------------------------------------------------------------------------ -- 调用方式:void PutChar0(uchar ch) 函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void PutChar0(uchar ch) { OutSD(ch); } /*------------------------------------------------------------------------------ -- 调用方式:void PutChar1(uchar ch) 函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void PutChar1(uchar ch) { OutMD(ch); } /*------------------------------------------------------------------------------ -- 调用方式:void DrawBmp(uchar x,bit layer,uchar width,uchar *bmp) 函数说明:画一个图,横坐标是x,layer表示上下层,width是图形的宽,高都是16,bmp是 图形指针 使用zimo21软件,采用纵向取模得到bmp数据。 -------------------------------------------------------------------------------- -*/ void DrawBmp(uchar x0,bit layer,uchar width,uchar *bmp) { uchar x,address,i=0; //address表示显存的物理地址 uchar page=0; bit window=0; //page表示上下两页,window表示左右两页 if (layer) page=2; for (x=x0;x60) {window=1;address=x%61;} else address=x; SetPage(page,page); SetAddress(address,address); if (window) PutChar1(bmp[i]); else PutChar0(bmp[i]);//画上层 SetPage(page+1,page+1); SetAddress(address,address); if (window) PutChar1(bmp[i+width]); else PutChar0(bmp[i+width]);//画下层 i++; } } /*------------------------------------------------------------------------------ -- 调用方式:void clrscr(void) 函数说明:清屏 -------------------------------------------------------------------------------- -*/ void clrscr(void) { uchar i; uchar page; for (page=0;page<4;page++) { SetPage(page,page); SetAddress(0,0); for (i=0;i<61;i++){PutChar0(0);PutChar1(0);} } }