硬件:TG12232B (122*32)模拟口线接线方式
连接线图:
--------------------------------------------------|
|DB0-----P0.0 | DB4-----P0.4 | RW-------P1.1 | A0--------P1.0 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 | V0接1K电阻到GND |
|DB2-----P0.2 | DB6-----P0.6 | E1-------P1.3 |
|DB3-----P0.3 | DB7-----P0.7 | E2-------P1.2 |
---------------------------------------------------
[注:AT89x52使用22.1184M或11.0592M晶振,实测使用22.1184M或11.0592都可以]
编译平台:Keil uV2 7.08
- //可能看起来有点乱,不过效果还是不错的,显示图形总的来说比显示汉字要简单,当然显示汉字也不难。
- //希望此程序能给你一些帮助。
- #include <AT89X52.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define E1 P1_3 //块1 左边
- #define E2 P1_2 //块2 右边
- #define RW P1_1
- #define A0 P1_0 //A0为1时是数据,0时为指令数据
- #define DATA P0 //数据
- 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 bmp001[];
- 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 Bmp003[];
- 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);
- DATA=i;
- //delay(5);
- E1=0;
- }
- //左页
- //发送命令
- void OUTMI(unsigned char i)
- {
- A0=0; //写指令
- //delay(5);
- E1=1;
- //delay(10);
- DATA=i;
- //delay(5);
- E1=0;
- }
- //右页
- //发送数据
- void OUTSD(unsigned char i)
- {
- A0=1; //写数据
- //delay(5);
- E2=1;
- //delay(10);
- DATA=i;
- //delay(5);
- E2=0;
- }
- //右页
- //发送命令
- void OUTSI(unsigned char i)
- {
- A0=0; //写指令
- //delay(5);
- E2=1;
- //delay(10);
- 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>1;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);}
- }
- }
- //-----------------------------------------------------------
- //图片显示
- //采用字模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(uchar 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>1;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
- Draw_word(0,0,0,16); //
- Draw_word(1,16,0,16); //
- Draw_word(2,32,0,16); //
- Draw_word(3,48,0,16); //
- Draw_word(0,64,0,16); //
- Draw_word(1,80,0,16); //
- Draw_word(2,96,0,16); //
- DrawBmp(1,120,Bmp002); //
- clrscr(); //
- delay1s(3);
- DrawBmp1(0,122,Bmp012); //LOGO
- while(1)
- {
- delay1s(3);
- clrscr(); //
- DrawBmp1(10,101,Bmp07); //
- delay1s(8);
- clrscr(); //
- wait1(3);
- DrawBmp1(0,122,Bmp04); //
- delay1s(8);
- clrscr(); //
- wait1(3);
- DrawBmp1(0,122,Bmp03); //超前科技
- delay1s(8);
- clrscr(); //
- wait1(3);
- clrscr(); //
- DrawBmp1(10,101,Bmp05); //
- delay1s(8);
- clrscr(); //
- wait1(3);
- clrscr(); //
- DrawBmp1(10,101,Bmp06); //
- delay1s(8);
- clrscr(); //
- wait1(3);
- clrscr(); //
- DrawBmp1(10,101,Bmp08); //
- delay1s(8);
- clrscr(); //
- wait1(3);
- clrscr(); //
- DrawBmp1(0,122,Bmp01); //这仿真器真不错,用过都说好.
- wait1(8);
- }
- }