LCD显示汉字
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/***************************************************************\
|* 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
#include
构体数组定义的方法
#include
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; // 片选1
sbit CS1 =P3^3; // 片选2
sbit 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 可以在任意位置写入*|