📄 key_lcd-1.c
字号:
#include<reg52.h>
sfr WDT=0xC0;
sbit P0_0=0x80;
sbit P0_1=0x81;
sbit P0_2=0x82;
sbit P0_3=0x83;
sbit P0_4=0x84;
sbit P0_5=0x85;
sbit P0_6=0x86;
sbit P0_7=0x87;
sbit P2_4=0xA4;
sbit P2_5=0xA5;
sbit P2_6=0xA6;
sbit P1_7=0x97;
#define LCM_RW P2_5
#define LCM_RS P2_6
#define LCM_E P2_4
#define LCM_Data P1
#define Busy P1_7
void ReadStatusLCM(void); //函数声明
void Delay5Ms(void);
void display_lcd(unsigned char P,unsigned char A);
unsigned char AD;
unsigned int M=0;
unsigned char v,sum,co[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //重键值存放数组
void keyscan(){ //键盘扫描程序
unsigned char i;
sum=0;
P0=0xFF;
P0_0=0;
if(P0_4==0){
v='0'; co[0]=1;}
if(P0_5==0){
v='1'; co[1]=1;}
if(P0_6==0){
v='2'; co[2]=1;}
if(P0_7==0){
v='3'; co[3]=1;}
P0=0xFF;
P0_1=0;
if(P0_4==0){
v='4'; co[4]=1;}
if(P0_5==0){
v='5'; co[5]=1;}
if(P0_6==0){
v='6'; co[6]=1;}
if(P0_7==0){
v='7'; co[7]=1;}
P0=0xFF;
P0_2=0;
if(P0_4==0){
v='8'; co[8]=1;}
if(P0_5==0){
v='9'; co[9]=1;}
if(P0_6==0){
v='A'; co[10]=1;}
if(P0_7==0){
v='B'; co[11]=1;}
P0=0xFF;
P0_3=0;
if(P0_4==0){
v='C'; co[12]=1;}
if(P0_5==0){
v='D'; co[13]=1;}
if(P0_6==0){
v='E'; co[14]=1;}
if(P0_7==0){
v='F'; co[15]=1;}
for(i=0;i<16;i++){
sum+=co[i];
co[i]=0; }
}
void WriteDataLCM(unsigned char WDLCM) //写数据 无忙信号时约6us
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
Delay5Ms();
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //小的延时
LCM_E = 1;
}
void WriteCommandLCM(unsigned char WCLCM,BuysC) //写指令BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
Delay5Ms();
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 1;
}
void ReadStatusLCM(void) //读忙状态
{
LCM_Data = 0x00;
Delay5Ms();
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 1;
while(Busy); //检测忙信号
}
void KEYS(unsigned int M) //按键次数程序显示
{
unsigned int i,c=10,a,b,d=1,z;
unsigned char cl[16];
for(i=0,a=0xCF;i<16;i++,a--){
b=M%c;
z=b/d+48;
c=c*10;
d=d*10;
cl[i]=z;
display_lcd(z,a); b=0;
}
}
void pkeys(void) //重键判断显示
{
unsigned char m[10]={0x50,0x72,0x65,0x73,0x73,0x00,0x4b,0x65,0x79,0x73},a=0x80,i;
WriteCommandLCM(0x01,1);
for(i=0;i<10;i++,a++){
display_lcd(m[i],a);
}
while(sum>1) keyscan();
WriteCommandLCM(0x01,1);
AD=0x80;
}
void xym(void) //显示制作人
{
unsigned char X[13]={0x4D,0x61,0x6B,0x65,0x72,0x3A,0x58,0x75,0x59,0x75,0x4D,0x69,0x6E},a=0x80,i;
WriteCommandLCM(0x01,1);
for(i=0;i<13;i++,a++){
display_lcd(X[i],a);
}
for(i=0;i<100;i++){
Delay5Ms();
}
WriteCommandLCM(0x01,1);
}
void Delay5Ms(void) //5ms延时
{
unsigned char i;
for(i=0;i<27;i++){
TMOD=0X02;
TH0=0X38;
TL0=0X38;
EA=0X00;
ET0=0X00;
TF0=0X00;
TR0=0X01;
while(TF0!=1);
}
}
void LCMInit(void) //LCM初始化 约10ms
{
WriteCommandLCM(0x01,0); //清除屏幕
WriteCommandLCM(0x38,0); //三次功能设置8位 dan行 5*7不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x0C,1); // 控制光标,显示 开,闪烁
WriteCommandLCM(0x06,1); // 控制光标和文字的移动
}
void display_lcd(unsigned char P,unsigned char A) //显示程序
{
WriteCommandLCM(A,1);
WriteDataLCM(P);
}
void main()
{
unsigned char pan;
unsigned int i,j;
WDT=0x00;
AD=0x80;
Delay5Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
xym();
do{
for(i=0;i<6;i++){ while(v==0) keyscan();
while(sum>1) pkeys();
pan=v;
v=0;
for(j=0;j<20;j++){
Delay5Ms();
}
keyscan();
if(v==0){ v=pan; break;};
Delay5Ms();
}
display_lcd(v,AD); M++;
AD++;
KEYS(M);
v=0;
if(AD==0x90){ WriteCommandLCM(0x01,1); AD=0X80; }
}while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -