微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求指教,小弟用stm8模拟ps2键盘发送数据

求指教,小弟用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);
}

太长了   而且没 注释大神都没时间的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top