📄 keyread.c
字号:
#include"reg51.h"
sbit KEY_CLK=P3^6;
sbit KEY_DATA=P3^7;
//PS2每次发送11个数据位分别为起始位+八个数据位+奇偶校验位+停止位
bit keyread(unsigned char *keyborad);
bit keyread(unsigned char *keyborad)
{
static unsigned char passnumber=0;
xdata unsigned char key;
xdata unsigned int wi=0;
xdata unsigned char i=0;
EA=0; //每次扫描PS2协议时,都要关总中断允许位,PS2通信时不能被中断,否则会读错数据
KEY_CLK=1;
while(KEY_CLK){if(++wi>50) { KEY_CLK=0; EA=1;return(0);} } //拉高时钟线,如果键盘有数据要发,要在50微秒内拉低时钟线
while(!KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1;return(0);}} //跳过始位
for(i=0;i<10;i++)
{ while(KEY_CLK){if(++wi>500) { KEY_CLK=0;EA=1; return(0); }} //return(0);
if(i>=0&&i<=7) //只接收八位数据位,跳过奇偶校验位和停止位
{ key=key>>1;
if(KEY_DATA) key=key|0x80;}
while(!KEY_CLK)
{
if(++wi>500) { KEY_CLK=0;EA=1;return(0);}
}
}
KEY_CLK=0;EA=1; //拉低时钟线,抑制键盘发送数据,再开总中断允许位
if(key==0xE1) //第三类键
passnumber=passnumber+2;
if(key==0xE0) //第二类键
++passnumber; //这里有passnumber是为了只接后一组数据中的第一个,屏蔽每两个
if(key==0xF0)
passnumber=passnumber+2;
if(passnumber==0)
{ *keyborad=key;
return(1); //如果成功接收一个键盘通码,就把flagre置1
}
else
{
--passnumber;
return(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -