📄 ps2.h
字号:
#define uchar unsigned char
#define uint unsigned int
uchar keyv; //键值暂存器
uchar keyram[6]; //键值存放缓冲区
uchar intNum; //位计数器
uchar dnum;
bit BF=0; //有键按下标志
bit shift=0; //切换标志
sbit key_data=P3^4; //数据线
sbit key_clk=P3^2; //时钟线
/*********************中断接收程序****************************************/
//说明:键盘向主机发送一个数据,主机是通过中断接收的,而且每来一位数据就中断一次
//所以,传输一位数据要中断11次
void key_scan() interrupt 0 using 1 //使用外部中断0
{
EX0=0; //关中断
if((intNum>0)&&(intNum<9)) //第1-8个数据位
{
keyv=keyv>>1; //右移一位
if(key_data)
keyv=keyv|0x80; //如果数据为1,键值暂存器最高位置1
}
intNum++; //位计数器
if(intNum>10) //当一位数据传输完成
{ keyram[dnum]=keyv;
intNum=0; //位计数器清零
BF=1; //置有键按下标志
EA=0;
//关总中断 等待处理
}
EX0=1; //开中断
}
/*********************ps2命令发送程序*********************************/
void ps2_sentchar(unsigned char sentchar)
{
uchar i;
uchar sentbit_cnt=0x00;
uchar sentchar_chk=0x00; //奇校验计数器
EX0=0; //禁止中断
IT0=0;
key_clk= 0;
for(i=0;i<200;i++) _nop_(); //将时钟线拉低并保持100 us抑制通信
key_data= 0; //起始位 "请求发送"
key_clk= 1; //释放时钟线
for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++)
{
while(key_clk) _nop_(); //等待时钟线变为低 主设备总是在时钟线为低电平时改变数据线的状态,
key_data = sentchar & 0x01; //发送数据 从设备在时钟上升沿读人数据线状态.
if(key_data) sentchar_chk++; //校验计数
while(!key_clk) _nop_(); //等待时钟线变高
sentchar>>=1; //待发送数据右移一位
}
while(key_clk) _nop_(); //等待时钟线变低
switch(sentchar_chk) //奇校验
{
case 0:
case 2:
case 4:
case 6:key_data=1;break;
case 1:
case 3:
case 5:
case 7:key_data = 0;break; //奇校验
default:break;
}
while(!key_clk) _nop_(); //等待时钟线变高
while(key_clk) _nop_(); //等待时钟线变低
key_data =1; //发送停止位,停止位总为1
while(!key_clk) _nop_(); //等待时钟线变高
while(key_clk) _nop_(); //等待时钟线变低
while(!key_clk) _nop_(); //等待时钟线变高
key_clk=1;
key_data=1; //释放数据线
EX0=1; //开中断
IT0=1;
}
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -