打印

USB键盘的实现-请圈圈及众高手们解惑,谢谢!

[复制链接]
4027|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xueshizi|  楼主 | 2011-11-5 07:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
移植了圈圈及NTHQ2004的 USB键盘实验在STM32上。

按键测试的时候,发现了这样的问题:

打开一个word文档,定位光标。然后按下一个键“KEY”,结果发现文档一直持续不停的写入“G”。

应该是没有发送按键释放消息,在按键松开以后,键盘还应该发一个“对应按键位置数据清0”的消息。

请教如何发送“对应按键位置数据清0”的消息。谢谢!

参考http://bbs.**/BLOG_ARTICLE_1445921.HTM

相关帖子

沙发
computer00| | 2011-11-5 13:36 | 只看该作者
发一个全0的包。

使用特权

评论回复
板凳
xueshizi|  楼主 | 2011-11-5 19:20 | 只看该作者
感谢圈圈。我贴一下代码,您可以详细些告诉我要在哪里增加吗?我不是很清楚USB数据发送流程。
mian函数中while(1)
{                  
    key=KEY_Scan(); //扫描一次键盘  
    if (key==1)  
    {
        Joystick_Send(1); //发送按键
    }
}

void Joystick_Send(u8 keys)
{
    u8 Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    u8 i=2;     
    switch(keys)
        {
            case 1 : Buffer[i]=c_usbKeyCode[10]; break;         //0x0a,   //key g
            default:                                 return;
        }         
    UserToPMABufferCopy(Buffer,GetEPTxAddr(ENDP1), 8);               
    SetEPTxValid(ENDP1);               
}

使用特权

评论回复
地板
xueshizi|  楼主 | 2011-11-7 16:37 | 只看该作者
众位高手请帮帮忙看一下,我到现在还是没有找到在哪里发送全0数据包。

使用特权

评论回复
5
computer00| | 2011-11-7 19:06 | 只看该作者
if(扫描到按键按下)
Joystick_Send(按键码); //发送按下事件
else if(扫描到按键抬起)
  Joystick_Send(0); //发送抬起事件

使用特权

评论回复
6
yaoohui| | 2012-4-16 10:47 | 只看该作者
我也遇到了这样的情况

请问圈圈,我发按您的方法写了按键抬起的检测,发现整个板子都不工作了,好像一直再发“0”一样

int main(void)
{
  __IO uint8_t keyold = 0;
  
  Set_System();
  
  USB_Interrupts_Config();
  
  Set_USBClock();
  
  USB_Init();

  delay_ms(2000);
  
  while (1)
  {
    delay_ms(100);
    if (bDeviceState == CONFIGURED)
    {
      if ((JoyState() != 0) && (PrevXferComplete))
      {
        keyold = ((GPIO_ReadInputData(GPIOB)>>6) & 0x0F);
        Joystick_Send(JoyState());
      }
      else if (keyold != ((GPIO_ReadInputData(GPIOB)>>6) & 0x0F))
      {
        Joystick_Send(0);
      }
    }
  }
}

使用特权

评论回复
7
yaoohui| | 2012-4-16 11:10 | 只看该作者
重新改了一下程序,上面的初始键值没有确定,程序就一直发0
int main(void)
{
  __IO uint8_t keyold = 0;
  
  Set_System();
  
  USB_Interrupts_Config();
  
  Set_USBClock();
  
  USB_Init();

  delay_ms(2000);

  keyold = ((GPIO_ReadInputData(GPIOB)>>6) & 0x0F);
  printf("keyold = %x\r\n",keyold);
  
  while (1)
  {
    delay_ms(100);
    if (bDeviceState == CONFIGURED)
    {
      if ((JoyState() != 0) && (PrevXferComplete))
      {
        keyold = ((GPIO_ReadInputData(GPIOB)>>6) & 0x0F);
        UsbDevice_Send(JoyState());
      }
      if (keyold != ((GPIO_ReadInputData(GPIOB)>>6) & 0x0F))
      {
        UsbDevice_Send(0);
      }
    }
  }
}

是不是程序还是不对,现在还是一个劲的发,好像就没有进入发0的这个步骤。

使用特权

评论回复
8
xfcjava2| | 2012-4-16 22:33 | 只看该作者
给你们参考:
  u8 Buffer_Scan1[8] =  {0, 0, 0, 0,  0, 0, 0, 0};  
  u8 Buffer_Scan2[8] =  {0, 0, 0, 0,  0, 0, 0, 0};

if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0x00) //按键按下
      {         
         Buffer_Scan1[2]=0x52;    //key----> UP
         
         while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0x00) //按键持续按下
         {
            KeyBoard_Send(Buffer_Scan1,8);
            delay(5);   //延时5ms
          }                        
         KeyBoard_Send(Buffer_Scan2,8);
         CoTickDelay(100);
         delay(100);   //延时100ms         
       }

使用特权

评论回复
9
xfcjava2| | 2012-4-16 22:33 | 只看该作者
void KeyBoard_Send(u8 *buffer_out,u8  count)
{
  
  USB_SIL_Write(EP1_IN, buffer_out, count);
  /* enable endpoint for transmission */   
  SetEPTxValid(ENDP1);  
}

使用特权

评论回复
10
xfcjava2| | 2012-4-16 22:36 | 只看该作者
也可以看看我的帖子:STM32 USB键盘定制

使用特权

评论回复
11
yaoohui| | 2012-4-17 09:39 | 只看该作者
谢谢,我发现是发数以后进不了USB中断,这样就无法进行下一次发数了,该怎么办呢?请指点。

使用特权

评论回复
12
usbyt| | 2012-5-21 11:45 | 只看该作者
有按键时发送按键码
没按键时发0
如果当前数据和上次数据一样,不发

使用特权

评论回复
13
geyuhuan| | 2017-8-1 16:46 | 只看该作者
无论是谁也只能提示你关键的原因,剩下的调试过程的小BUG只能靠自己查,别人也不知所以啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝