发新帖本帖赏金 0.10元(功能说明)我要提问
返回列表
打印
[STM32F1]

STM32实现USB键盘的问题

[复制链接]
7167|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我在STM32 USB库的基础上,参考圈圈的书,移植了一个USB键盘的程序。
可是不太好使,打开记事本,第一次按下按键没反应,第二次按下则一直打印数字1
我本来是想按下一次按键,只输出一个1.
请高手指教,哪里出了问题。
谢谢。
贴出部分代码和图片。

主程序:
int main(void)
{
        unsigned int i;
#ifdef DEBUG
  debug();
#endif

  Set_System();
  USB_Interrupts_Config();

  Set_USBClock();
        uart1_init(115200);
  USB_Init();
        //Uart1_SendByte(0x55);
  while (1)
  {
    //Delay(10000);
    if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
    {
                        for(i=0;i<10000;i++);
                        if ((JoyState() != 0) & (bDeviceState == CONFIGURED))
                                while(JoyState() != 0);
      Joystick_Send(JoyState());
    }
  }
}

void Joystick_Send(u8 Keys)
{
  u8 Buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  u8 i;
  i=2;


        switch (Keys)
  {
    case LEFT:
      Buffer=0x52; //Keyboard UpArrow
                        i++;
      break;
    case RIGHT:

      Buffer=0x51; //Keyboard DownArrow
                        i++;
      break;
    case UP:
      Buffer=0x59;                 //0x50; //Keyboard LeftArrow
                        i++;
      break;
    case DOWN:
      Buffer=0x53;                  //0x4F; //Keyboard RightArrow
      break;
    default:
      return;
  }
  /*copy mouse position info in ENDP1 Tx Packet Memory Area*/
  UserToPMABufferCopy(Buffer, GetEPTxAddr(ENDP1), 8);   //?8???
  /* enable endpoint for transmission */
  SetEPTxValid(ENDP1);
}


沙发
JY-DX-JY|  楼主 | 2016-1-15 15:38 | 只看该作者
自己顶

使用特权

评论回复
板凳
xfcjava2| | 2016-1-15 21:24 | 只看该作者
请参考我的程序部分:
u8 Buffer_Scan1[8] =  {0, 0, 0, 0,  0, 0, 0, 0};  

void KeyBoard_Send(u8 *buffer_out,u8  count)
{
  
  USB_SIL_Write(EP1_IN, buffer_out, count);

  /* enable endpoint for transmission */   
  SetEPTxValid(ENDP1);  
}


void Task_USB_Scan(void *pdata)
{         
  u8 press_status_1=0;
  
  u8 press_status_8=0;   
  u8  chk_num1=2;
   
  pdata= pdata;

  while(1)
  {        

     if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0x00)
      {     
        if(press_status_1==0)
          {
             press_status_1=1;
            
             chk_num1=2;

             while((Buffer_Scan1[chk_num1]!=0)&&(chk_num1<7))
             {
               chk_num1++;
             }
              
             Buffer_Scan1[chk_num1]=0x5F;    //KeyPad   ----> number--7              
  
             KeyBoard_Send(Buffer_Scan1,8);               
             CoTickDelay(2);           
          }                           
       }
      else
       {
         if(press_status_1==1)
         {
           Buffer_Scan1[chk_num1]=0;  

           KeyBoard_Send(Buffer_Scan1,8);
           CoTickDelay(2);
         }        
                  
         press_status_1=0;      
       }      

    ......

  CoTickDelay(1);                                
}  
     

使用特权

评论回复

打赏榜单

JY-DX-JY 打赏了 0.10 元 2016-01-16
理由:很给力

地板
xfcjava2| | 2016-1-15 21:26 | 只看该作者
这是我完全测试过的代码部分,请放心使用。

使用特权

评论回复
5
JY-DX-JY|  楼主 | 2016-1-16 08:32 | 只看该作者
xfcjava2 发表于 2016-1-15 21:26
这是我完全测试过的代码部分,请放心使用。

看不懂

使用特权

评论回复
6
weimina1022| | 2016-1-16 09:04 | 只看该作者
发送完以后,把发送标志清掉

使用特权

评论回复
7
JY-DX-JY|  楼主 | 2016-1-16 09:13 | 只看该作者
搞好了,谢谢!

使用特权

评论回复
8
xytrd| | 2016-2-22 17:05 | 只看该作者
能否把程序发给我,参考我,我也在学习USB键盘。
xytrd@163.com

使用特权

评论回复
9
waronder| | 2016-4-18 11:30 | 只看该作者
好东西,学习了,不知道是否有延时!

使用特权

评论回复
10
Micachl| | 2016-4-18 22:21 | 只看该作者
发送完数据之后再发送一次0才可以

使用特权

评论回复
发新帖 本帖赏金 0.10元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝