📄 key.c
字号:
#include<reg51.h>
#define WAITFORKEYBOARDPULSE while(!scl); while(scl);
#define uchar unsigned char
#define uint unsigned int
#define DE 0x40
#define PDATA P0
uchar read_key (void);
//sbit led = P1^2;
sbit scl = P1^0;
sbit sda = P1^1;
void setkey(uchar row,uchar col);
uchar te;
void Delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0) //for 12M
{ usn = 2;
while(usn!=0)
{
us=0xf5;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
main ()
{
Delay(250);
// setkey(1,3);
while(1)
{
switch(read_key())
{
case 0x69: //1
setkey(0,0);
while(read_key()==0x69 || read_key()==0xF0);
break;
case 0x72: //2
setkey(0,1);
while(read_key()==0x72 || read_key()==0xF0);
break;
case 0x7A: //3
setkey(0,2);
while(read_key()==0x7A || read_key()==0xF0);
break;
case 0x6B: //4
setkey(1,0);
while(read_key()==0x6B || read_key()==0xF0);
break;
case 0x73: //5
setkey(1,1);
while(read_key()==0x73 || read_key()==0xF0);
break;
case 0x74: //6
setkey(1,2);
while(read_key()==0x74 || read_key()==0xF0);
break;
case 0x6C: //7
setkey(2,0);
while(read_key()==0x6C || read_key()==0xF0);
break;
case 0x75: //8
setkey(2,1);
while(read_key()==0x75 || read_key()==0xF0);
break;
case 0x7D: //9
setkey(2,2);
while(read_key()==0x7D || read_key()==0xF0);
break;
case 0x70: //0
setkey(3,0);
while(read_key()==0x70 || read_key()==0xF0);
break;
case 0x71: //.
setkey(3,1);
while(read_key()==0x71 || read_key()==0xF0);
break;
case 0x06: //设置 F2
setkey(0,3);
while(read_key()==0x06 || read_key()==0xF0);
break;
case 0x05: //F1
setkey(1,3);
while(read_key()==0x05 || read_key()==0xF0);
break;
case 0x79: //X 小+
setkey(2,3);
while(read_key()==0x79 || read_key()==0xF0);
break;
case 0xE0: //确认 小回车
if(read_key()==0x5A)
{
setkey(3,3);
while(read_key()==0xE0 || read_key()==0x5A);
}
break;
case 0x0C: //查询 F4
setkey(3,2);
while(read_key()==0x0C || read_key()==0xF0);
break;
case 0x5A: //结账 大回车
setkey(4,3);
while(read_key()==0x5A || read_key()==0xF0);
break;
case 0x76: //退出 ESC
setkey(4,0);
while(read_key()==0x76 || read_key()==0xF0);
break;
case 0x03: //总清 F5
setkey(4,1);
while(read_key()==0x03 || read_key()==0xF0);
break;
case 0x66: //清除 退格键
setkey(4,2);
while(read_key()==0x66 || read_key()==0xF0);
break;
}
}
}
void setkey(uchar row,uchar col)
{
uchar tmp;
//led=0;
tmp=row+(col<<3);
tmp&=~DE;
PDATA=tmp;
Delay(58);
tmp|=DE;
PDATA=0xFF;
// led=1;
}
uchar read_key (void)
{
uchar KeyCode;
uchar Rbit;
while(scl); // 等待键盘把时钟第一次拉低
for(Rbit = 8; Rbit != 0; Rbit --) // 把起始位算入
{
WAITFORKEYBOARDPULSE; // 等待一个有效的下跳沿
KeyCode >>= 1; // 按照PS2格式,数据低位在前
scl = 1;
sda = 1;
if(sda == 1)
{
KeyCode |= 0x80; // 得到有效的数据位
}
}
WAITFORKEYBOARDPULSE; // 等待按键发送效验位
WAITFORKEYBOARDPULSE; // 等待按键发送终止位
while(!scl); // 等待键盘把时钟线拉高
return(KeyCode); // 返回按键扫描
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -