📄 ps2_fullfill.c
字号:
//-------------单片机向PS/2设备发送数据程序代码如下:
void ps2_sentchar(unsigned char sentchar)
{
unsigned char sentbit_cnt = 0x00;
unsigned char sentchar_chk = 0x00;
EX1 =0;
//------------发起一个传送,发起始位
PS2_CLK = 0;
delay1us(100);
PS2_DIO = 0; //起始位
PS2_CLK = 1;
//------------发送DATA0-7
for(sentbit_cnt = 0; sentbit_cnt < 8; sentbit_cnt++)
{
while(PS2_CLK)_nop_(); //等待时钟线变为低
PS2_DIO = sentchar & 0x01; //发送数据
if(PS2_DIO)sentchar_chk++; //计算校验
while(!PS2_CLK)_nop_(); //等待时钟线变高
sentchar >>= 1; //待发送数据右移一位
}
//-------------发送校验位
while(PS2_CLK)_nop_(); //等待时钟线变为低
switch(sentchar_chk)
{
case 0:
case 2:
case 4:
case 6: PS2_DIO = 1; break; //奇校验
case 1:
case 3:
case 5:
case 7: PS2_DIO = 0; break; //奇校验
default: break;
}
while(!PS2_CLK)_nop_(); //等待时钟线变高
while(PS2_CLK)_nop_(); //等待时钟线变为低
//-------------发送停止位,停止位总为1
PS2_DIO = 1;
while(!PS2_CLK)_nop_(); //等待时钟线变高
while(PS2_CLK)_nop_(); //等待时钟线变为低
//----------接收ACK
if(PS2_DIO) error(); //ACK信号由键盘发出,总为低电平
while(!PS2_CLK)_nop_(); //等待时钟线变高
EX1 = 1;
}
//---------------单片机由PS/2键盘接收数据程序:外部中断0设置为下降沿触发
void int0() interrupt 0 using 3
{
EX1=0;
switch(ps2_revchar_cnt)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
mcu_revchar <<= 1;
if(PS2_DIO)
mcu_revchar |= 0x01;
ps2_revchar_cnt++;
break;
case 0:
ps2_revchar_cnt++;
break; //开始位,
case 9:
ps2_revchar_cnt++;
break; //校验位,可添加校验程序
case 10:
_nop_(); //停止位
ps2_revchar_cnt=0;
revchar_flag=1; //置接收到数据标志位
break;
default:
break;
}
EX1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -