求指教,小弟用stm8模拟ps2键盘发送数据
时间:10-02
整理:3721RD
点击:
如题:发送一个字节可以,但是连续发送多个字节就会出现数据数据混乱,这是我的发送程序,求指教。谢谢
void PsSendByte(unsigned char Byte)
{
PsOut(Byte);
PsOut(0xf0);
PsOut(Byte);
}
void test()
{
PsSendByte(PS_KEY[1]);
PsSendByte(PS_KEY[2]);
PsSendByte(PS_KEY[3]);
PsSendByte(PS_KEY[4]);
PsSendByte(PS_KEY[5]);
PsSendByte(PS_KEY[6]);
PsSendByte(PS_KEY[7]);
PsSendByte(PS_KEY[8]);
PsSendByte(PS_KEY[9]);
PsSendByte(0x5A);
}
void PsOut(unsigned char Byte)
{
unsigned char ik;
unsigned char Oddparity = 0;
GPIOC->DDR &= 0XE7; //设置输入
GPIOC->CR1 &= 0XE7; //带下拉输入
Nop(4);
while(!(Wieg0PORT->IDR & 0x10)); Nop(35); //clk
if(!(Wieg0PORT->IDR &0X08)) return; //data
GPIOC->DDR |= 0x18; //设置输出
GPIOC->CR1 |= 0x18; //上拉输出
PsdataLow; Nop(20); //发送start位要多用20us
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20); //释放时钟
for(ik=0; ik<8; ik++) //高电平的中间即20US,DATA改变
{
if(Byte & 0x01)
{
PsdataHigh;
Oddparity++;
}
else
PsdataLow;
Nop(20);
Byte>>=1;
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20); //释放时钟
}
if(Oddparity & 0x01) {PsdataLow;} //校验位
else {PsdataHigh;}
Nop(20);
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20);
PsdataHigh; Nop(20); //输出停止位,总为1
PsClkLow; Nop(40);
PsClkHigh; Nop(20);
Nop(500);
}
void PsSendByte(unsigned char Byte)
{
PsOut(Byte);
PsOut(0xf0);
PsOut(Byte);
}
void test()
{
PsSendByte(PS_KEY[1]);
PsSendByte(PS_KEY[2]);
PsSendByte(PS_KEY[3]);
PsSendByte(PS_KEY[4]);
PsSendByte(PS_KEY[5]);
PsSendByte(PS_KEY[6]);
PsSendByte(PS_KEY[7]);
PsSendByte(PS_KEY[8]);
PsSendByte(PS_KEY[9]);
PsSendByte(0x5A);
}
void PsOut(unsigned char Byte)
{
unsigned char ik;
unsigned char Oddparity = 0;
GPIOC->DDR &= 0XE7; //设置输入
GPIOC->CR1 &= 0XE7; //带下拉输入
Nop(4);
while(!(Wieg0PORT->IDR & 0x10)); Nop(35); //clk
if(!(Wieg0PORT->IDR &0X08)) return; //data
GPIOC->DDR |= 0x18; //设置输出
GPIOC->CR1 |= 0x18; //上拉输出
PsdataLow; Nop(20); //发送start位要多用20us
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20); //释放时钟
for(ik=0; ik<8; ik++) //高电平的中间即20US,DATA改变
{
if(Byte & 0x01)
{
PsdataHigh;
Oddparity++;
}
else
PsdataLow;
Nop(20);
Byte>>=1;
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20); //释放时钟
}
if(Oddparity & 0x01) {PsdataLow;} //校验位
else {PsdataHigh;}
Nop(20);
PsClkLow; Nop(40); //拉低时钟
PsClkHigh; Nop(20);
PsdataHigh; Nop(20); //输出停止位,总为1
PsClkLow; Nop(40);
PsClkHigh; Nop(20);
Nop(500);
}
太长了 而且没 注释大神都没时间的
