📄 lcd_elbe.c
字号:
/***************************************************************\
|* 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; // 片选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 可以在任意位置写入 *|
|* 入口参数: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); //关显示
// 故人西辞黄鹤楼,烟花三月下扬州。孤帆远影碧空尽唯见长江天际流
// write_sentence("单片机液晶显示 武汉理工大学余区熊涛制作 悠悠苍天奈何独立苍茫");
// write_sentence("故人西辞黄鹤楼,烟花叁月下扬州。");
// write_sentence("孤帆远影碧空尽,唯见长江天际流。");
// write_word(31,"。");
// write_word_all(0,6,112,"黄");
//Scrolling("单片机控制液晶武汉理工大学熊涛制作");
while(1)
{ P2=0xf0;
P0=~P0;
write_sentence("单片机液晶显示 武汉理工大学余区熊涛 制作 悠悠苍天独立苍茫");
// while(n--);
// n=65535;
// while(n--);
// n=65535;
// P0=0x55;
// write_sentence(" ");
// write_sentence("悠悠苍天 奈何独立苍茫 熊涛制作 单片机液晶显示 ");
// while(n--);
// n=65535;
// while(n--);
// write_sentence(" ");
// n=65535;
CS1=CS2=1;
write_cmd(0x3f); } //开显示
/* while(1)
{ write_sentence("故人西辞黄鹤楼,烟花叁月下扬州。");
while(k--);
write_sentence("孤帆远影碧空尽,唯见长江天际流。");
while(k--);
}*/ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -