STM32F103C8 USB键盘 numLock capLock 灯如何实现

2019-07-20 22:45发布

STM32F103C8 USB键盘 numLock capLock 灯如何实现? 最近研究了一下 STM32 USB键盘程序,从论坛下载了几个例程.基本上可以实现普通的键盘功能.只差LED了.USB 报告描述符已经是正确的.有05 08的LED宣告.例程是一个鼠标程序.目前找不到LED的报告事件或者函数.知道的朋友请指点一下.谢谢..
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
32条回答
xfcjava3
1楼-- · 2019-07-21 03:35
请看我用过的USB HID键盘描述符c文件:(也是用原来的Joystick描述符,修改过用的)
usb_desc.rar (2.34 KB, 下载次数: 605) 2017-2-11 20:41 上传 点击文件名下载附件



正点原子
2楼-- · 2019-07-21 08:07
帮顶
xfcjava3
3楼-- · 2019-07-21 09:56
 精彩回答 2  元偷偷看……
xfcjava3
4楼-- · 2019-07-21 14:29
请看我曾经用过的程序实现:【注:已用到实际的应用中,请放心参考使用!】

typedef struct tag_caps_find{
        u8 caps_row;
        u8 caps_col;
        u8 caps_chk;
}CAPS_FIND_ST;


CAPS_FIND_ST   caps_find;


/****************************************************************************       
* 功    能: 查找模式按键是否具备,分析其键的位置
*---------------------------------------------------------------------------*
* 入口参数: pdata        A pointer to parameter passed to task.
* 出口参数: None
****************************************************************************/

void  Find_ModeKey_Function(void)
{
    //...............................

    //........矩阵键盘扫描{
     if(keycode==KC_LCAP){        //Caps Lock按键按下                                                         
                caps_find.caps_row=i; //USB键盘中---Caps按键所在的行位置数值
                caps_find.caps_col=j;         //USB键盘中---Caps按键所在的行位置数值
                if(caps_find.caps_chk==0){ //Caps按键没有按下
                   caps_find.caps_chk=1; //识别Caps按键按下
                }                                               
      }


     if(keycode==KC_LSFT){        //左SHIT按键
         //.................................
         //.................................
         //.................................
     }

     if(keycode==KC_RSFT){        //右SHIT按键       
         //.................................
         //.................................
         //.................................
     }

     if(keycode==KC_LCTL){        //左CTRL按键
         //.................................
         //.................................
         //.................................
     }

     if(keycode==KC_RCTL){        //右CTRL按键       
         //.................................
         //.................................
         //.................................
      }  

     if(keycode==KC_LGUI){        //左GUI按键
         //.................................
         //.................................
         //.................................
     }

     if(keycode==KC_RGUI){        //右GUI按键
         //.................................
         //.................................
         //.................................
     }


    if(keycode==KC_LALT){        //左ALT按键
        //.................................
         //.................................
         //.................................
    }

    if(keycode==KC_RALT){        //右ALT按键
        //.................................
         //.................................
         //.................................

     }

   } //........矩阵键盘扫描

}

/****************************************************************************       
* 功    能:  模式按键---模式功能查找执行任务
*---------------------------------------------------------------------------*
* 入口参数: pdata        A pointer to parameter passed to task.
* 出口参数: None
****************************************************************************/

void Task_ModeKey_Find(void *pdata)
{  
   u8 i;               
  pdata = pdata;
  while(1)
  {        

       Find_ModeKey_Function();


       //.................................
       //.................................

       //.................................
       //.................................

       switch(caps_find.caps_chk){                       
         case 0:
            break;
         case 1:  //找到caps按键键位
               if(key_matrix[caps_find.caps_row][caps_find.caps_col] == 0x00){  //如果caps按键按下
                    flag_caps_press=1;       
                    caps_find.caps_chk=2; //按下caps按键---转换状态               
                    CAPS_LED_ON(); //点亮CAPS指示灯       

                    CoOS_ENTER_CRITICAL();  
                    Buffer0_Scan[0] |=0x02; //输出为大写状态
                    CoOS_EXIT_CRITICAL();         
                                       
                    do{
                        CoTickDelay(100);                                
                    }while(key_matrix[caps_find.caps_row][caps_find.caps_col] == 0x00);//等待caps按键抬起
                }                                       
                break;
          case 2: //Caps按键按下过后----直到Caps按键释放
               if(key_matrix[caps_find.caps_row][caps_find.caps_col] == 0x00){  //如果caps按键按下
                    flag_caps_press=0;       
                    caps_find.caps_chk=1; //回复初始状态       
                    CAPS_LED_OFF(); //熄灭CAPS指示灯       
                    CoOS_ENTER_CRITICAL();  
                    Buffer0_Scan[0] &=~0x02; //输出为小写状态
                    CoOS_EXIT_CRITICAL();     
                                       
                    do{
                         CoTickDelay(100);                                
                    }while(key_matrix[caps_find.caps_row][caps_find.caps_col] == 0x00);//等待caps按键抬起
                }                                       
                break;                               
        } //end:switch(caps_find.caps_chk)               

      //.................................
       //.................................

       //.................................
       //.................................


       CoTickDelay(100);

     }//end: while(1)
}



xfcjava3
5楼-- · 2019-07-21 16:16
 精彩回答 2  元偷偷看……
xfcjava3
6楼-- · 2019-07-21 19:29
请看:
   usb键盘固件升级_使用说明:

   usb键盘固件升级_使用说明.jpg

一周热门 更多>