12232液晶汉字图形显示程序
2012-06-02

硬件: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

#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);

}

}

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号