LCD显示汉字

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 可以在任意位置写入*|

相关文档
最新文档