📄 复件 lcd_elbe.c
字号:
/***************************************************************\
|* 12864LCD显示程序 proteus6.9 仿真AMPIRE128*64 *|
|* 制作人:熊涛 *|
|* 时间:2007年4月12日 *|
|* 接口定义:P1接数据 DB7~DB0 *|
|* P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 接控制线 *|
|* 具体见定义 *|
\***************************************************************/
#include <reg52.h>
#include <string.h>
#include <Asc8_16.h>
#include <start.h>
#include <scancodes.h>
typedef unsigned char uchar;
typedef unsigned int uint;
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; // 复位
sbit KEY_DATA = P2^0;
sbit KEY_CLK = P2^1;
/**********************************************\
|* 写命令子程序 *|
|* 入口参数: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 *|
|* ASC 字符的ACSII码 *|
|* 出口参数:null *|
|* 调用函数: write_cmd() set_dis() *|
|* strcmp() write_dat() *|
\***********************************************/
void write_num_all(uchar st_line,uchar x_add,uchar y_add,uchar ASC)
{ uchar 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);
for(j=0;j<8;j++) write_dat(nAsciiDot[(ASC-32)*16+j],oppo); //逐字节写入
set_dis(st_line, x_add+1,y_add); //下一页 写字的下半部分
for(j=8;j<16;j++) write_dat(nAsciiDot[(ASC-32)*16+j],oppo); //此处用break是为了能跳出for循环
}
/***********************************************\
|* 写数字标点字母子程序2 只能在指定位置写入 *|
|* 入口参数:n 指定地址 0~63 全屏32字(16*16) *|
|* ASC 字符的ACSII码 *|
|* 出口参数:null *|
|* 调用函数: write_num_all() *|
|* *|
\***********************************************/
void write_num(uchar n,uchar ASC) //写入汉字
{ uchar st_line=0,x_add=n%64/16*2,y_add=n%64%16*8;
write_num_all(st_line,x_add,y_add,ASC);
}
/***********************************************\
|* 画图子程序 全屏画图 *|
|* 入口参数:图片数据代码数组 1024的数组 *|
|* *|
|* 出口参数:null *|
|* 调用函数: set_dis() *|
|* write_dat( ) *|
\***********************************************/
void draw_picture(uchar picture[1024])
{ int i;
uchar j=0;
for(j=0;j<8;j++)
{ set_dis(0,j,0);
for(i=j*128;i<j*128+64;i++) write_dat(picture[i],1);
set_dis(0,j+1,64);
for(i=j*128+64;i<j*128+128;i++) write_dat(picture[i],1); }
}
/**********************************************\
|* 初始化子程序 *|
|* 入口参数:null *|
|* 出口参数:null *|
|* 调用函数: null *|
\**********************************************/
void initial(void) //初始化子程序
{ write_cmd(0x3e); //关显示
KEY_CLK=0;
KEY_DATA=0; }
wait_key(void)
{ unsigned int n;
unsigned char Key_code=0;
unsigned char KEY_CODE;
KEY_CLK=1;
KEY_DATA=1;
for(n=60000;n>0;n--); //在设备开始传输数据之前,时钟线 必须持续为 高电平的 时间 必须 至少50ms
if(KEY_CLK==0||KEY_DATA==0) //如果数据线为低说明有数据传
{ for(n=0;n<11;n++)
{ if(n>0&&n<9)
{ Key_code=Key_code>>1;
if(KEY_DATA) Key_code=Key_code|0x80; }
while(!KEY_CLK);
while(KEY_CLK); }
KEY_CODE=Key_code; }
else KEY_CODE=0;
KEY_CLK=0;
KEY_DATA=0;
return(KEY_CODE);
}
/****************************************************\
|* 主程序入口 *|
|* 12864LCD显示程序 proteus6.9 仿真AMPIRE128*64 *|
|* 制作人:熊涛 *|
|* 时间:2007年4月12日 *|
|* *|
\****************************************************/
void main(void) //主程序
{ unsigned char key;
unsigned char n;
unsigned char position=48;
initial();
P0=0xaa;
write_cmd(0x3e); //关显示
draw_picture(nBitmapDot);
CS1=CS2=1;
write_cmd(0x3f); ; //开显示
while(1)
{ if(position==64) position=48;
if(wait_key())
{key=wait_key(); P0=key;
for(n=0;n<127;n++)
{ if(key==UnShifted[n][0]) { write_num(position++,UnShifted[n][1]);write_num(63,'y');}
else write_num(63,'N'); }
} }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -