LCD显示汉字
时间:10-02
整理:3721RD
点击:
/*---LCD128*64---T6963C*/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define C_ADD XBYTE [0x3fff] /*设置LCD指令口地址*/
#define D_ADD XBYTE [0x3ffe] /*设置LCD数据口地址*/
uchar code zka[]={0x20,0x21,0x22,0x23,0x24,0x25,0xee};
uchar code zkb[]={0x26,0x27,0x28,0xee};
uchar code zkc[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xee};
uchar code zkd[]={0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0xee};
uchar code *hzp;
bdata uchar flag;
sbit flag0=flag^0;
sbit flag1=flag^1;
sbit flag2=flag^2;
sbit flag3=flag^3;
sbit flag4=flag^4;
sbit flag5=flag^5;
sbit flag6=flag^6;
sbit flag7=flag^7;
bdata uchar STA; /*设置LCD状态字,将变量定位在片内RAM中*/
sbit STA0=STA^0; /*设置LCD状态字位s0*/
sbit STA1=STA^1; /*设置LCD状态字位s1*/
sbit STA2=STA^2; /*设置LCD状态字位s2*/
sbit STA3=STA^3; /*设置LCD状态字位s3*/
void chinese();
void wait1 (void) { /*查LCD状态字s0,s1位*/
do {STA=C_ADD;} while(!(STA0&STA1)); /*s0,s1位与(指令,数据读写)为0则忙*/
}
/*void wait2 (void) { 查状LCD态字s2位
do {STA=C_ADD;} while(!STA2);s2自动读为0则忙
}*/
void wait3 (void) { /*查状LCD态字s3位*/
do {STA=C_ADD;} while(!STA3);/*s3自动写为0则忙*/
}
void wcode0(uchar y) /*写LCD无参数指令代码*/
{
wait1();
C_ADD=y;
}
void wcode1(uchar x1,y) /*写LCD单参数指令代码*/
{
wait1();
D_ADD=x1;
wait1();
C_ADD=y;
}
void wcode2(uchar x1,x2,y) /*写LCD双参数指令代码*/
{
wait1();
D_ADD=x1;
wait1();
D_ADD=x2;
wait1();
C_ADD=y;
}
void init_lcd(void) { /*LCD初始化设置*/
/* wcode0(0xb2); 关自动写*/
/* wcode0(0x9c); 文本开,图形开,光标闪烁、显示关闭*/
/* wcode0(0x80); 文本,图形或合成,选CGR0M*/
wcode2 (0x00,0x00,0x40);
wcode2 (0x10,0x00,0x41);
wcode2 (0x00,0x08,0x42); /*设置图形显示区域首地址*/
wcode2 (0x10,0x00,0x43); /*设置图形显示区域宽度16字节*/
/* wcode2 (0x00,0x08,0x42); 设置图形显示区域首地址*/
/* wcode2 (0x20,0x00,0x43); 设置图形显示区域宽度*/
/* wcode2 (0x00,0x00,0x24); 设置地址指针为0000H*/
/* wcode2 (0x04,0x00,0x22); 设置CG偏移指针使CGRAM首地址为2000H*/
wcode0 (0xa7); /*光标形状为一行(底线)*/
wcode0 (0x80);
wcode0 (0x9f);
}
void qp_lcd(void) { /*清屏*/
uchar i;
uint j;
wcode2 (0x00,0x00,0x24); /*设置显示缓冲区地址指针为0000H*/
wcode0(0xb0); /*设置自动写*/
for(i=0;i<32;i++) {
for(j=0;j<256;j++) {
wait3();
D_ADD=0x0; /*写入0*/
}
}
wcode0(0xb2); /*关自动写*/
}
dispaline(linex,roly,hz) /*显示一个汉字子程序*/
uchar linex; /*LCD上开始显示的字符列数:0--15*/
uchar roly; /*LCD上开始显示的字符行数:0--8*/
uchar code *hz;
{
uchar i;
uchar w,j;
uchar shu;
uint add;
uint chadd;
uchar addl;
uchar addh;
w=*hz; /*取该句的第一个汉字*/
while(w!=0xee){ /*该句未结束则等待*/
add=linex*256+2*roly; /*w*roly为LCD行首在显示缓冲器中的列偏移地址*/
chadd=w*32+(uint)&chinese; /*linex*256为LCD行首在显示缓冲器中的行偏移地址*/
/*256为128*64一行汉字所占的字节数*/
/*480为240*64一行汉字所占的字节数*/
addl=2*roly; /*取汉字库地址*/
for (i=0;i<16;i++){
addl=add%256; /*LCD上所在的行列在显示缓冲器中低地址*/
addh=add/256+8; /*LCD上所在的行列在显示缓冲器中高地址*/
wcode2(addl,addh,0x24); /*写入显示缓冲器的地址*/
shu=CBYTE[chadd]; /*取该汉字的32个字节*/
if(!flag0) shu=~shu;
// for(j=0;j<16;j++)
wcode1(shu,0xc0); /*数据一次写*/
chadd++; /*汉字库地址加1*/
shu=CBYTE[chadd]; /*取该汉字的32个字节*/
if(!flag0) shu=~shu;
wcode1(shu,0xc0); /*数据一次写*/
chadd++; /*汉字库地址加1*/
add=add+16; /*显示该汉字的下一行*/
}
hz++;roly++; /*取下一个汉字,字数加1*/
w=*hz;
}
}
void main (void){
uchar O_x; /*行号*/
uchar O_y; /*列号*/
init_lcd(); /*LCD初始化设置*/
qp_lcd(); /*清屏*/
O_x=0x00; /*第一行*/
O_y=0x01;
hzp=zka; /*第一句*/
flag0=0; /*反写*/
dispaline(O_x,O_y,hzp); /*显示第一句*/
O_x=0x02; /*第二行*/
O_y=0x02;
hzp=zkb; /*第2句*/
flag0=1;
dispaline(O_x,O_y,hzp); /*显示第2句*/
while(1){;}
O_x=0x02; /*第三行*/
O_y=0x00;
hzp=zkc;
dispaline(O_x,O_y,hzp);
O_x=0x03; /*第四行*/
O_y=0x00;
hzp=zkd;
dispaline(O_x,O_y,hzp);
while(1){}
}
32
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define C_ADD XBYTE [0x3fff] /*设置LCD指令口地址*/
#define D_ADD XBYTE [0x3ffe] /*设置LCD数据口地址*/
uchar code zka[]={0x20,0x21,0x22,0x23,0x24,0x25,0xee};
uchar code zkb[]={0x26,0x27,0x28,0xee};
uchar code zkc[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xee};
uchar code zkd[]={0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0xee};
uchar code *hzp;
bdata uchar flag;
sbit flag0=flag^0;
sbit flag1=flag^1;
sbit flag2=flag^2;
sbit flag3=flag^3;
sbit flag4=flag^4;
sbit flag5=flag^5;
sbit flag6=flag^6;
sbit flag7=flag^7;
bdata uchar STA; /*设置LCD状态字,将变量定位在片内RAM中*/
sbit STA0=STA^0; /*设置LCD状态字位s0*/
sbit STA1=STA^1; /*设置LCD状态字位s1*/
sbit STA2=STA^2; /*设置LCD状态字位s2*/
sbit STA3=STA^3; /*设置LCD状态字位s3*/
void chinese();
void wait1 (void) { /*查LCD状态字s0,s1位*/
do {STA=C_ADD;} while(!(STA0&STA1)); /*s0,s1位与(指令,数据读写)为0则忙*/
}
/*void wait2 (void) { 查状LCD态字s2位
do {STA=C_ADD;} while(!STA2);s2自动读为0则忙
}*/
void wait3 (void) { /*查状LCD态字s3位*/
do {STA=C_ADD;} while(!STA3);/*s3自动写为0则忙*/
}
void wcode0(uchar y) /*写LCD无参数指令代码*/
{
wait1();
C_ADD=y;
}
void wcode1(uchar x1,y) /*写LCD单参数指令代码*/
{
wait1();
D_ADD=x1;
wait1();
C_ADD=y;
}
void wcode2(uchar x1,x2,y) /*写LCD双参数指令代码*/
{
wait1();
D_ADD=x1;
wait1();
D_ADD=x2;
wait1();
C_ADD=y;
}
void init_lcd(void) { /*LCD初始化设置*/
/* wcode0(0xb2); 关自动写*/
/* wcode0(0x9c); 文本开,图形开,光标闪烁、显示关闭*/
/* wcode0(0x80); 文本,图形或合成,选CGR0M*/
wcode2 (0x00,0x00,0x40);
wcode2 (0x10,0x00,0x41);
wcode2 (0x00,0x08,0x42); /*设置图形显示区域首地址*/
wcode2 (0x10,0x00,0x43); /*设置图形显示区域宽度16字节*/
/* wcode2 (0x00,0x08,0x42); 设置图形显示区域首地址*/
/* wcode2 (0x20,0x00,0x43); 设置图形显示区域宽度*/
/* wcode2 (0x00,0x00,0x24); 设置地址指针为0000H*/
/* wcode2 (0x04,0x00,0x22); 设置CG偏移指针使CGRAM首地址为2000H*/
wcode0 (0xa7); /*光标形状为一行(底线)*/
wcode0 (0x80);
wcode0 (0x9f);
}
void qp_lcd(void) { /*清屏*/
uchar i;
uint j;
wcode2 (0x00,0x00,0x24); /*设置显示缓冲区地址指针为0000H*/
wcode0(0xb0); /*设置自动写*/
for(i=0;i<32;i++) {
for(j=0;j<256;j++) {
wait3();
D_ADD=0x0; /*写入0*/
}
}
wcode0(0xb2); /*关自动写*/
}
dispaline(linex,roly,hz) /*显示一个汉字子程序*/
uchar linex; /*LCD上开始显示的字符列数:0--15*/
uchar roly; /*LCD上开始显示的字符行数:0--8*/
uchar code *hz;
{
uchar i;
uchar w,j;
uchar shu;
uint add;
uint chadd;
uchar addl;
uchar addh;
w=*hz; /*取该句的第一个汉字*/
while(w!=0xee){ /*该句未结束则等待*/
add=linex*256+2*roly; /*w*roly为LCD行首在显示缓冲器中的列偏移地址*/
chadd=w*32+(uint)&chinese; /*linex*256为LCD行首在显示缓冲器中的行偏移地址*/
/*256为128*64一行汉字所占的字节数*/
/*480为240*64一行汉字所占的字节数*/
addl=2*roly; /*取汉字库地址*/
for (i=0;i<16;i++){
addl=add%256; /*LCD上所在的行列在显示缓冲器中低地址*/
addh=add/256+8; /*LCD上所在的行列在显示缓冲器中高地址*/
wcode2(addl,addh,0x24); /*写入显示缓冲器的地址*/
shu=CBYTE[chadd]; /*取该汉字的32个字节*/
if(!flag0) shu=~shu;
// for(j=0;j<16;j++)
wcode1(shu,0xc0); /*数据一次写*/
chadd++; /*汉字库地址加1*/
shu=CBYTE[chadd]; /*取该汉字的32个字节*/
if(!flag0) shu=~shu;
wcode1(shu,0xc0); /*数据一次写*/
chadd++; /*汉字库地址加1*/
add=add+16; /*显示该汉字的下一行*/
}
hz++;roly++; /*取下一个汉字,字数加1*/
w=*hz;
}
}
void main (void){
uchar O_x; /*行号*/
uchar O_y; /*列号*/
init_lcd(); /*LCD初始化设置*/
qp_lcd(); /*清屏*/
O_x=0x00; /*第一行*/
O_y=0x01;
hzp=zka; /*第一句*/
flag0=0; /*反写*/
dispaline(O_x,O_y,hzp); /*显示第一句*/
O_x=0x02; /*第二行*/
O_y=0x02;
hzp=zkb; /*第2句*/
flag0=1;
dispaline(O_x,O_y,hzp); /*显示第2句*/
while(1){;}
O_x=0x02; /*第三行*/
O_y=0x00;
hzp=zkc;
dispaline(O_x,O_y,hzp);
O_x=0x03; /*第四行*/
O_y=0x00;
hzp=zkd;
dispaline(O_x,O_y,hzp);
while(1){}
}
32
支持一下……
这个程序是不是就有点复杂啊!
这个程序下载进去好像不显示哦
我们公司的LCD 里面自带字库 可以节省很多开发时间
我司是专业生产单片机接口 的TFT-LCD 液晶模块 主要应用于工业自动化,仪表,仪器,医疗设备和军工产品。
武汉谷鑫科技有限公司 QQ1026821311 手机;18702705869 欢迎咨询
不错哦,小编挺好的,现在学习中
支持一下
不错的文档,值得收藏
棒,好帖子,不知道好不好用