当前位置:文档之家› LCD显示汉字

LCD显示汉字

/***************************************************************\|* 12864LCD显示程序proteus6.9 仿真AMPIRE128*64 *||* 制作人:熊涛*||* 时间:2007年4月12日*||* 接口定义:P1接数据DB7~DB0 *||* P2.0 P2.1 P2.2 P2.3 P2.4 接控制线*||* 具体见定义*|\***************************************************************//***************************************************************\|* 注:本程序只能写16*16的汉字并且有一个小问题就是*||* 当字库中汉字的代码的第一个数据不是0x00时该汉字就不*||* 能显示出来调试时发现是因为不能检索到那个汉字具体原*||* 因还在调试中直接写汉字句子时注意两个字节一个字,不要*||* 弄半角的字符或标点符号否则后面的汉字将找不到*||* 2007年4月14日1时修改熊涛*|\***************************************************************/#include <reg52.h>#include <all_code.h> //包含字库该字库采用晓奇工作室液晶字模提取软件默认保存的文件采用结构体数组定义的方法#include <string.h>typedef unsigned char uchar;typedef unsigned int uint;struct word_BUFFER{ uchar word[2]; } ;struct word_BUFFER word_buf[33]; //定义结构体数组用来存储待显示的汉字共32个uchar bank=0; //设置第几行反显0表示不反显1~4表示各行的反显uchar key=0; //第几个键被按下sbit DI =P3^7; // 数据\指令选择sbit RW =P3^6; // 读\写选择sbit E =P3^5; // 读\写使能sbit CS2 =P3^4; // 片选1sbit CS1 =P3^3; // 片选2sbit RST =P3^2; // 复位keych(void) //检测是否有键按下子程序//{ uint n;if(P2==0xf0) return(0);else while(P2&0xf0!=0xf0) for(n=0;n<60000;n++);return(1);}keyscan() // 检测是哪个键按下子程序//{ uchar m,n;uchar code k[4]={0xfe,0xfd,0xfb,0xf7};for(m=0;m<4;m++){ P2=k[m];n=P2+(m*m+5)*m/6;//此处要注意m为整型switch(n){ case 0x7e:key=0+m*4;break;case 0xbe:key=1+m*4;break;case 0xde:key=2+m*4;break;case 0xee:key=3+m*4;break;}} }/**********************************************\|* 写命令子程序*||* 入口参数:cmd 控制命令数据*||* 出口参数:null *||* 调用函数: null *|\**********************************************/void write_cmd(uchar cmd) //写命令子程序{ RW=0;DI=0; //DI=0 写命令E=1;P1=cmd;E=0; //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR}/**********************************************\|* 写数据子程序*||* 入口参数:dat 显示字符的数据*||* oppo 标志位1:显示阳文*||* 0:显示阴文*||* 出口参数:null *||* 调用函数: null *|\**********************************************/void write_dat(uchar dat,bit oppo) //写数据子程序{ RW=0;DI=1; //DI=1 写数据E=1;if(oppo==0) P1=~dat; //按位取反得阴文if(oppo==1) P1=dat;oppo=1;E=0; //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR}/**********************************************\|* 设置显示起始行X地址和Y地址*||* 入口参数:st_line 显示起始行0~63 *||* x_add 页地址8行为一页0~7 *||* y_add Y地址0~128 *||* 出口参数:null *||* 调用函数: write_cmd() *|\**********************************************/void set_dis(uchar st_line,uchar x_add,uchar y_add) //设置显示起始行X地址和Y地址{write_cmd(st_line+0xc0); //+0xc0是参照设置起始行的格式write_cmd(x_add+0xb8); //+0xb8是参照设置页地址的格式if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);} //Y_add地址实际上只有0~63 采用CS1和CS2选左右半屏else { CS1=1;CS2=0;write_cmd(y_add);}}/***********************************************\|* 写汉字子程序1 可以在任意位置写入*||* 入口参数:st_line 显示起始行0~63 *||* x_add 页地址8行为一页0~7 *||* y_add Y地址0~128 *||* Index[2] 字符串数组用来存储汉字*||* 出口参数:null *||* 调用函数: write_cmd() set_dis() *||* strcmp() write_dat() *|\***********************************************/void write_word_all(uchar st_line,uchar x_add,uchar y_add,uchar Index[2]) //写入汉字{ uchar i,j;bit oppo=1;if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);}else { CS1=1;CS2=0;write_cmd(y_add);}set_dis(st_line, x_add,y_add);if(bank%5==0) oppo=1;if(bank%5==1&&(x_add==0||x_add==1)) oppo=0;if(bank%5==2&&(x_add==2||x_add==3)) oppo=0;if(bank%5==3&&(x_add==4||x_add==5)) oppo=0;if(bank%5==4&&(x_add==6||x_add==7)) oppo=0;for(i=0;i<255;i++){ if (GB_16[i].Index[0]==Index[0] && GB_16[i].Index[1]==Index[1]) //汉字作为双字节字符串处理采用顺序检索方式查找结构体名{ for(j=0;j<16;j++) write_dat(GB_16[i].Msk[j],oppo); //逐字节写入set_dis(st_line, x_add+1,y_add); //下一页写字的下半部分for(j=16;j<32;j++) write_dat(GB_16[i].Msk[j],oppo);break;} //此处用break是为了能跳出for循环}}/***********************************************\|* 写汉字子程序2 只能在指定位置写入*||* 入口参数:n 指定地址0~31 全屏32字(16*16) *||* Index[2] 字符串数组用来存储汉字*||* 出口参数:null *||* 调用函数: write_word_all() *||* *|\***********************************************/void write_word(uchar n,uchar Index[2]) //写入汉字{ uchar st_line=0,x_add=n%32/8*2,y_add=n%32%8*16;write_word_all(st_line,x_add,y_add,Index);}/***********************************************\|* 写句子子程序*||* 入口参数:sentence[] 待写入汉字组成字符串*||* 按照0~31的顺序写入*||* 出口参数:null *||* 调用函数: strlen() write_word() *||* *|\***********************************************/void write_sentence(uchar sentence[255]){uchar i,j=0;if(keych()==1){keyscan();if(key==0) bank++;if(key==1) bank--;}for(i=0;i<strlen(sentence)/2;i++){ word_buf[i].word[0]=sentence[i*2];word_buf[i].word[1]=sentence[i*2+1];//从sentence中两个两个的取字符串即汉字注意不要弄半角的字符或标点符号,否则后面的汉字将找不到write_word(j++,word_buf[i].word);} }/*void Scrolling(uchar sentence[255]) //滚动显示子程序{ uchar i,j=0;int k=2000;for(i=0;i<strlen(sentence)/2;i++){ for(j=0;j<=i;j++){ word_buf[i].word[0]=sentence[i*2];word_buf[i].word[1]=sentence[i*2+1];write_word(i,word_buf[i].word); ; } } } *//**********************************************\|* 初始化子程序*||* 入口参数:null *||* 出口参数:null *||* 调用函数: null *|\**********************************************//*void initial(void) //初始化子程序{ write_cmd(0x3e); //关显示} *//****************************************************\|* 主程序入口*||* 12864LCD显示程序proteus6.9 仿真AMPIRE128*64 *||* 制作人:熊涛*||* 时间:2007年4月12日*||* *|\****************************************************/void main(void) //主程序{P0=0xaa;// uint n=65535;//write_cmd(0x3e); //关显示// 故人西辞黄鹤楼,烟花三月下扬州。

相关主题