📄 lcdandkey.c
字号:
#include <reg51.h>
#define uchar unsigned char
#include <1602lcd.ini>
//按键说明:A,B:左右移,C:上/下移,D:切换输入,E:删除,F:确定
uchar key,x=0,keypre;
uchar instate=0; //instate为输入状态 0为大写字母,1为小写字母,2为数字,3为标点
uchar selectN,selectK;
unsigned int wait_count;
bit y=0;
bit affirm=0;
//------------------------------------------------------------------------------------
void delay(uchar ms){
uchar i;
while(ms--){
for(i=0;i<125;i++);
}
}
//------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int getkey(){
return ((~P1)&0xf0);
}
//-----------------------------------------------------------------------------------
//判断是否有键按下
void chkkey(){
if (getkey()) {
delay(0x2); //延时,去抖
delay(0x02);
}
}
//-----------------------------------------------------------------------------------
void findkey(){ //扫描法得出键值
uchar i,k,j;
i=(~P1)&0xf0;
j=0x10;
for (k=0;k<4;k++) {
if (i&j) key=k; //得出行号
j<<=1;
}
key=key*4;
P1=0xfe;
if ((~P1)&0xf0) key=key; //得出行键值=行号+列号
P1=0xfd;
if ((~P1)&0xf0) key=key+1;
P1=0xfb;
if ((~P1)&0xf0) key=key+2;
P1=0xf7;
if ((~P1)&0xf0) key=key+3;
//}
P1=0xf0;
}
//------------------------------------------------------------------------------------
void addchar(){
if (!selectK) return;
Send_Data_LCM(selectK);
x++;
if (x==16) {x=0;y=!y;}
selectK=0;
selectN=0;
affirm=0;
}
//------------------------------------------------------------------------------------
void keyfun(){
uchar temp1;
bit temp2;
if (key<=9) {
if (key!=keypre) addchar();
selectN++;
wait_count=0;
if (selectN==4) selectN=1;
if (instate==0) selectK=0x41+selectN+key*3-1;
if (instate==1) selectK=0x61+selectN+key*3-1;
if (instate==2) selectK=0x30+key;
if (instate==3) selectK=0x21+key;
Send_Data_LCM(selectK);
affirm=1;
Set_LCM_XY(x,y);
keypre=key;
return;
}
if (key==10) {x--;
if (x==255) x=0;
Set_LCM_XY(x,y);
selectN=0;
return;
}
if (key==11) {x++;
if (x==16) x=0;
Set_LCM_XY(x,y);
selectN=0;
return;
}
if (key==12) {
y=!y;
Set_LCM_XY(x,y);
selectN=0;
return;
}
if (key==13) {instate++;
if (instate==4) instate=0;
Set_LCM_XY(15,1);
if (instate==0) Send_Data_LCM(0x41);
if (instate==1) Send_Data_LCM(0x61);
if (instate==2) Send_Data_LCM(0x30);
if (instate==3) Send_Data_LCM(0x3b);
selectN=0;
Set_LCM_XY(x,y);
return;
}
if (key==14) {
if (affirm) { affirm=0;
Send_Data_LCM(0x00);
Set_LCM_XY(x,y);
return;
}
temp1=x-1;
temp2=y;
if (temp1==255) if (y==1) {temp2=0;temp1=15;}
else return;
Set_LCM_XY(temp1,temp2);
Send_Data_LCM(0x00);
Set_LCM_XY(temp1,temp2);
x=temp1;
y=temp2;
selectN=0;
return;
}
if (key==15) {
addchar();
return;
}
}
//------------------------------------------------------------------------------------
main(){
Init_LCM();
P1=0xf0;
Set_LCM_XY(15,1);
Send_Data_LCM(0x41);
Set_LCM_XY(0,0);
x=0;y=0;
while (1){
if (!getkey()) P1=0xf0;
chkkey(); //判断是否有键按下
if (getkey()) { //若有键按下
findkey(); //求键值
keyfun();
}
while (getkey()) {}; //Wait for Key UP
if (affirm) {
wait_count++;
if (wait_count==0x2fff) {wait_count=0;addchar(); }
}
} //while(1)
} //main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -