|
用STM32模拟PS2键盘,发给电脑的通码有一部分可以识别,一部分不能识别,有的的识别错误(发送某个通码,却识别成另外的按键)。求大神指导
void PS2_Send(u8 ps2byte)
{
u8 i=0;
u8 temp=ps2byte;
u8 parity_data;
EXTI->IMR &=~(1<<8);//关中断
PS2_CLK_H();
PS2_DATA_H();
parity_data = Parity(temp); //校验位
//====================检测主机是否发送请求====================
PS2_CLK_IN();
PS2_DATA_IN();
while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
delay_us(50);
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
EXTI->IMR |= 1<<8;// 开中断
return;
}
else break;
}
PS2_DATA_IN();
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8))
{
EXTI->IMR |= 1<<8;//开中断
return;
}
//=========================================================
else //开始发送数据
{
delay_us(15);
PS2_DATA_L(); //起始位
delay_us(15);
PS2_CLK_L();
delay_us(30);
PS2_CLK_H();
delay_us(15);
PS2_CLK_IN();
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)) //判断主机是否抑制通信
{
EXTI->IMR |= 1<<8;//开中断
return ;
}
//===============================================
for(i=0;i<8;i++) //8位数据位
{
if(temp&0x01)
{
PS2_DATA_H();
}
else
{
PS2_DATA_L();
}
temp>>=1;
delay_us(15);
PS2_CLK_L();
delay_us(30);
PS2_CLK_H();
delay_us(15);
PS2_CLK_IN();
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
EXTI->IMR |= 1<<8;//开中断
return ;
}
}
//============================================================
if(parity_data)// 校验位
{
PS2_DATA_H();
}
else
{
PS2_DATA_L();
}
delay_us(15);
PS2_CLK_L();
delay_us(30);
PS2_CLK_H();
delay_us(15);
PS2_CLK_IN();
if(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{
EXTI->IMR |= 1<<8;//开中断
return;
}
//============================================================
PS2_DATA_H(); //停止位
delay_us(15);
PS2_CLK_L();
delay_us(30);
PS2_CLK_H();
delay_ms(80); //等待主机处理
//============================================================
EXTI->IMR |= 1<<8;//开中断
return;
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|