台湾产全新带背光12232液晶显示屏驱动程序(C语言) /*============================================================ MCU:at89c2051 接线图: --------------------------------------------------| |DB0-----P1.0 | DB4-----P1.4 | RW-------P3.5 | RST接VCC | |DB1-----P1.1 | DB5-----P1.5 | A0-------P3.7 | V0接1K电阻到GND | |DB2-----P1.2 | DB6-----P1.6 | E1-------P3.3 | |DB3-----P1.3 | DB7-----P1.7 | E2-------P3.4 | --------------------------------------------------- 液晶接口: 1--VDD 2--VSS 3--V0 4--RST 5--E1 6--E2 7--RW 8--A0 9--DB0 - - - - 16--DB7 17--A 18--K =============================================================*/ #i nclude <reg51.h> #define uchar unsigned char #define uint unsigned int sbit E1=P3^3; //块1 左边 sbit E2=P3^4; //块2 右边 sbit RW=P3^5; sbit A0=P3^7; //A0为1时是数据,0时为指令数据 #define LCD_DATA P1 //数据 /* extern unsigned char code Bmpt1[]; extern unsigned char code Bmpt2[]; extern unsigned char code Bmpt3[]; extern unsigned char code Bmpt4[]; extern unsigned char code Bmpt5[]; extern unsigned char code Bmpt6[]; extern unsigned char code Bmpt7[]; extern unsigned char code Bmptc[]; extern unsigned char code Bmp08[]; extern unsigned char code Bmp07[]; extern unsigned char code Bmp06[]; extern unsigned char code Bmp05[]; extern unsigned char code Bmp04[]; extern unsigned char code Bmp03[]; extern unsigned char code Bmp02[]; extern unsigned char code Bmp01[]; extern unsigned char code Bmp012[]; */ extern unsigned char code bmp001[]; extern unsigned char code Bmp002[]; //延时 void delay(unsigned int i) { unsigned char k=200; while(i>0) { i--; } while(k>1)k--; }
//左页 //发送数据 void OUTMD(unsigned char i) { A0=1; //写数据 //delay(5); E1=1; //delay(10); LCD_DATA=i; //delay(5); E1=0; } //左页 //发送命令 void OUTMI(unsigned char i) { A0=0; //写指令 //delay(5); E1=1; //delay(10); LCD_DATA=i; //delay(5); E1=0; } //右页 //发送数据 void OUTSD(unsigned char i) { A0=1; //写数据 //delay(5); E2=1; //delay(10); LCD_DATA=i; //delay(5); E2=0; } //右页 //发送命令 void OUTSI(unsigned char i) { A0=0; //写指令 //delay(5); E2=1; //delay(10); LCD_DATA=i; //delay(5); E2=0; } //初始化 void lcdini(void) { RW=0; 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); } /* 函数说明:同时设置主从显示页为0-3页。(内函数,私有,用户不直接调用) ------------------------------------------------------------------------ */ void SetPage(uchar page0,uchar page1) { OUTMI(0xB8|page1);OUTSI(0xB8|page0); } /* -------------------------------------------------------------------------------- 函数说明:同时设置主从列地址为0-121。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- */ void SetAddress(uchar address0,uchar address1) { OUTMI(address1);OUTSI(address0); } /* -------------------------------------------------------------------------------- 调用方式:void PutChar0(uchar ch) 函数说明:在右页当前地址画一个字节8个点。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void PutCharR(uchar ch) { OUTSD(ch); } /* -------------------------------------------------------------------------------- 调用方式:void PutChar1(uchar ch) 函数说明:在左页当前地址画一个字节8个点。(内函数,私有,用户不直接调用) -------------------------------------------------------------------------------- -*/ void PutCharL(uchar ch) { OUTMD(ch); } /* -------------------------------------------------------------------------------- 调用方式:void DrawBmp(bit layer,uchar width,uchar *bmp) 函数说明:画一个图,layer表示上下层,width是图形的宽,高都是16,bmp是 图形指针 使用zimo3软件,纵向取模,字节倒序/240字节 -------------------------------------------------------------------------------- -*/ void DrawBmp(bit layer,uchar width,uchar *bmp) { uchar x,address,i=0; //address表示显存的物理地址 uchar page=0; //page表示上下两页 bit window=0; //window表示左右两页 //putcharR //右边 //putcharL //左边 for (x=width;x>0;x--) { if (i>60) {window=1;address=i%61;} else address=i; if(layer==0) //显示一行八个字 { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(bmp[i+width]); } else { //显示第二行八个汉字 SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(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++){PutCharR(0);PutCharL(0);} } } /* //----------------------------------------------------------- //图片显示,h=32dot //采用字模2生成或字模3生成的都可以. //----------------------------------------------------------- void DrawBmp1(uint x_add, uchar width,uchar *bmp) { uchar x,address,i=0; //address表示显存的物理地址 uchar page=0; //page表示上下两页 bit window=0; //window表示左右两页 //putcharR //右边 //putcharL //左边 for (x=width;x>1;x--) { if (x_add>60) {window=1;address=x_add%61;} else address=x_add; SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp[i]); else PutCharL(bmp[i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width]); else PutCharL(bmp[i+width]);
SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width+width]); else PutCharL(bmp[i+width+width]); SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp[i+width+width+width]); else PutCharL(bmp[i+width+width+width]); i++; x_add++;
} } */ //--------------------------------------------------------------- //--------------------------------------------------------------- //采用zimo2 显示汉字,以汉字的显示方式 //void Draw_word(uchar d_where,uint x_add,bit layer,uchar width) //d_where表示在码表中第几个汉字,x_add横坐标位置,layer显示的层, width显示的宽度。 //void Draw_word(0-。。。。。,显存的物理地址0-121,0=第一行,非0=第二行,字的宽度) //--------------------------------------------------------------- void Draw_word(uint d_where,uint x_add,bit layer,uchar width) { uchar x,i=0,address; //address表示显存的物理地址 uchar page=0; //page表示上下两页 bit window=0; //window表示左右两页 //putcharR //右边 //putcharL //左边 d_where=d_where*32; for (x=width;x>0;x--) { if (x_add>60) {window=1;address=x_add%61;} else address=x_add; if(layer==0) //显示一行八个字 { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where]);//右边 else PutCharL(bmp001[d_where]);//左边 SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where+width]); else PutCharL(bmp001[d_where+width]); } else { //显示第二行八个汉字 SetPage(2,2); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where]);//右边 else PutCharL(bmp001[d_where]);//左边 SetPage(3,3); SetAddress(address,address); if(window==1)PutCharR(bmp001[d_where+width]); else PutCharL(bmp001[d_where+width]); } x_add++; d_where++; } } /* //------------------------------------------------------------------ //字模2显示一个汉字 //纵向取模,字节倒序 void disp_one(bit top_low,bit widows,uchar address,uchar width,uchar*bmp) { if(top_low==0) { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i]); else PutCharL(bmp001[next][i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i+width]); else PutCharL(bmp001[next][i+width]); } else { SetPage(0,0); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i]); else PutCharL(bmp001[next][i]); SetPage(1,1); SetAddress(address,address); if(window==1)PutCharR(bmp001[next][i+width]); else PutCharL(bmp001[next][i+width]); } } */ //液晶显示规则 // M(左) S(右) // page page // 0 | 0 // 1 | 1 // 2 | 2 // 3 | 3
void delay1s(unsigned char i) { while(i>1) { i--; delay(65530); } } /* //显示动态的等待图标 void wait1(unsigned char i) { for(;i>1;i--) {delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt1); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt2); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt3); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt4); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt5); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt6); // delay1s(2); clrscr(); // DrawBmp1(0,60,Bmptc); // DrawBmp1(76,19,Bmpt7); // } } */ //演示程序 void main() { lcdini(); //reset clrscr(); //clr while(1) { Draw_word(0,13,0,16); // Draw_word(1,29,0,16); // Draw_word(2,45,0,16); // Draw_word(3,61,0,16); // Draw_word(4,77,0,16); // Draw_word(3,93,0,16); // DrawBmp(1, 122,Bmp002); delay1s(20000); clrscr(); //clr //DrawBmp(0, 32,Bmp002); } } unsigned char code bmp001[]= { /*-- 0文字: 图 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFE,0x42,0x42,0x22,0x1E,0xAA,0x4A,0xAA,0x9A,0x0A,0x02,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x42,0x42,0x41,0x41,0x48,0x72,0x54,0x40,0x41,0x43,0x41,0xFF,0x00,0x00, /*-- 1文字: 像 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x20,0xF8,0x17,0x02,0xF8,0x4C,0x4B,0xCA,0x7A,0x4E,0x4A,0xC8,0x78,0x00,0x00, 0x00,0x00,0xFF,0x00,0x2A,0x2A,0x16,0x15,0x49,0x86,0x7A,0x05,0x09,0x31,0x10,0x00, /*-- 2文字: 显 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, 0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, /*-- 3文字: 示 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, 0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, /*-- 4文字: 演 --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x21,0x86,0x60,0x00,0x0C,0xD4,0x54,0x55,0xF6,0x54,0x54,0xD4,0x0C,0x04,0x00, 0x04,0xFC,0x03,0x00,0x00,0x00,0x8F,0x69,0x09,0x0F,0x09,0x29,0xCF,0x00,0x00,0x00, //字模软件V2.1,纵向取模,字节倒序 。 }; unsigned char code bmp002[]= { /*-- 调入了一幅图像:这是您新建的图像 --*/ /*-- 宽度x高度=122x16 --*/ 0xFF,0x83,0x45,0x29,0xF1,0x99,0x55,0x33,0x33,0x55,0x99,0xF1,0x29,0x45,0x83,0xFF, 0x00,0x00,0x00,0x80,0x60,0x18,0x06,0x01,0x06,0x18,0x60,0x80,0x00,0x00,0x00,0x01, 0x02,0x0C,0x3C,0xF8,0x78,0xB0,0x50,0xB0,0x50,0xB0,0x78,0xF8,0x3C,0x0C,0x02,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x03,0x00,0x80,0x48,0x24,0x48, 0x80,0x00,0x03,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xFF,0x0C,0x0C,0x8F,0xCF,0xEC,0x6C,0xEF,0xCF,0x8C,0x0C,0x0F,0xEF,0xEC, 0x0C,0x0F,0x0F,0xEC,0xEC,0x0F,0x0F,0xEC,0xEC,0x6F,0x6F,0x6C,0x6C,0x6F,0x0F,0x0C, 0xEC,0xEF,0x6F,0x6C,0x6C,0xEF,0xCF,0x0C,0x0C,0xFF,0xFF,0xC1,0xA2,0x94,0x8F,0x99, 0xAA,0xCC,0xCC,0xAA,0x99,0x8F,0x94,0xA2,0xC1,0xFF,0x00,0x00,0x00,0x01,0x06,0x18, 0x60,0x80,0x60,0x18,0x06,0x01,0x00,0x00,0x00,0x80,0x40,0x30,0x3C,0x1F,0x1E,0x0D, 0x0A,0x0D,0x0A,0x0D,0x1E,0x1F,0x3C,0x30,0x40,0x80,0x00,0x00,0x00,0xC0,0x30,0x0C, 0x03,0x00,0x00,0x00,0x80,0x48,0x24,0x12,0x09,0x12,0x24,0x48,0x80,0x00,0x00,0x00, 0x03,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x1F, 0x3F,0x70,0x60,0x70,0x3F,0x1F,0x00,0x00,0x0F,0x1F,0x38,0x70,0x38,0x1F,0x0F,0x00, 0x00,0x7F,0x7F,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x7F,0x7F,0x0E,0x1E,0x3E,0x77, 0x63,0x00,0x00,0xFF, //字模软件V2.1,纵向取模,字节倒序 。 }; 12232的资料(其它厂家的资料,与该屏完全兼容): 程序中使用的字模软件为:字模V2.1 硬件电路图: 点亮后的图片: |
发表评论