hid设备做键盘设备时键值上报

文章描述了一种键盘设备通过USB上报数据的固定8字节格式,其中字节1控制辅助按键如Shift,字节2以后存储普通按键值。在AT32F423平台上,最多可同时处理14个按键,包括8个辅助和6个普通按键。软件实现部分展示了如何发送多个按键值的函数,以及如何释放按键。示例中演示了如何打印大写B和K字母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

键盘设备通过usb上报数据固定格式为8个字节,普通键值的字母的大小写有Shift按键控制实现

  • 字节1:辅助按键控制,如shift按键,Ctrl按键,win按键等,由每个bit控制
    • LEFT_CTRL :左侧Ctrl按键
    • LEFT_SHIFT :左侧shift按键
    • LEFT_ALT :左侧Alt按键
    • LEFT_GUI :左侧GUI按键
    • RIGHT_CTRL :右侧Ctrl按键
    • RIGHT_SHIFT:右侧shift按键
    • RIGHT_ALT :右侧Alt按键
    • RIGHT_GUI :右侧GUI按键
  • 字节2:预留
  • 字节3~8:普通按键值

实验平台

雅特力AT32F423

多按键

最多可以同时发送14个按键,8个辅助按键,6个普通按键

按键释放

发送8个0x00释放按键,不然会一直触发

键值定义

#define        KB_ERROR            0x01
#define        KB_A                0x04
#define        KB_B                0x05
#define        KB_C                0x06
#define        KB_D                0x07
#define        KB_E                0x08
#define        KB_F                0x09
#define        KB_G                0x0A
#define        KB_H                0x0B
#define        KB_I                0x0C
#define        KB_J                0x0D
#define        KB_K                0x0E
#define        KB_L                0x0F
#define        KB_M                0x10
#define        KB_N                0x11
#define        KB_O                0x12
#define        KB_P                0x13
#define        KB_Q                0x14
#define        KB_R                0x15
#define        KB_S                0x16
#define        KB_T                0x17
#define        KB_U                0x18
#define        KB_V                0x19
#define        KB_W                0x1A
#define        KB_X                0x1B
#define        KB_Y                0x1C
#define        KB_Z                0x1D
#define        KB_1                0x1E
#define        KB_2                0x1F
#define        KB_3                0x20
#define        KB_4                0x21
#define        KB_5                0x22
#define        KB_6                0x23
#define        KB_7                0x24
#define        KB_8                0x25
#define        KB_9                0x26
#define        KB_0                0x27
#define        KB_ENTER            0x28
#define        KB_ESC                0x29
#define        KB_BACKSPACE        0x2A
#define        KB_TAB                0x2B
#define        KB_SPACE            0x2C
#define        KB_MIUS                0x2D    //-_
#define        KB_EQUAL            0x2E    //=+
#define        KB_LSQUBRACKET        0x2F    //[{
#define        KB_RSQUBRACKET        0x30    //]}
#define        KB_BACKSLASH        0x31    //\|

#define        KB_SEMICOLON        0x33    //;:
#define        KB_APOSTROPHE        0x34    //'"
#define        KB_TILDE            0x35    //`~
#define        KB_COMMA            0x36    //,<
#define        KB_FULLSTOP            0x37    //.>
#define        KB_SLASH            0x38    ///?
#define        KB_CAPSLOCK            0x39   
#define        KB_F1                0x3A
#define        KB_F2                0x3B
#define        KB_F3                0x3C
#define        KB_F4                0x3D
#define        KB_F5                0x3E
#define        KB_F6                0x3F
#define        KB_F7                0x40
#define        KB_F8                0x41
#define        KB_F9                0x42
#define        KB_F10                0x43
#define        KB_F11                0x44
#define        KB_F12                0x45
#define        KB_PRTSCR            0x46
#define        KB_SCOLLLOCK        0x47
#define        KB_PAUSE            0x48
#define        KB_INSERT            0x49
#define        KB_HOME                0x4A
#define        KB_PAGEUP            0x4B
#define        KB_DELETE            0x4C
#define        KB_END                0x4D
#define        KB_PAGEDOWN            0x4E
#define        KB_RARROW            0x4F
#define        KB_LARROW            0x50
#define        KB_DARROW            0x51
#define        KB_UARROW            0x52
#define        KB_NUMLOCK            0x53
#define        KB_PAD_DIV            0x54    ///
#define        KB_PAD_MUL            0x55    //、*
#define        KB_PAD_MINUS        0x56    //-
#define        KB_PAD_PLUS            0x57    //+
#define        KB_PAD_ENTER        0x58
#define        KB_PAD_1            0x59
#define        KB_PAD_2            0x5A
#define        KB_PAD_3            0x5B
#define        KB_PAD_4            0x5C
#define        KB_PAD_5            0x5D
#define        KB_PAD_6            0x5E
#define        KB_PAD_7            0x5F
#define        KB_PAD_8            0x60
#define        KB_PAD_9            0x61
#define        KB_PAD_0            0x62
#define        KB_PAD_DEL            0x63

#define        KB_APPLICATION        0x65    //RWin右边键

#define        KB_AUX_LEFT_CTRL         0x81    //
#define        KB_AUX_LEFT_SHIFT        0x82    //
#define        KB_AUX_LEFT_ALT          0x83    //
#define        KB_AUX_LEFT_GUI          0x84    //
#define        KB_AUX_RIGHT_CTRL        0x85    //
#define        KB_AUX_RIGHT_SHIFT       0x86    //
#define        KB_AUX_RIGHT_ALT         0x87    //
#define        KB_AUX_RIGHT_GUI         0x88    //

软件实现

该软件实现需要配合键值定义

#include <stdarg.h>

void keyboard_send_multKeyValue(void *udev, int count, uint8_t value1, ...)
{
  uint8_t index = 0;
	int i;
	int valueCount = 1;
  va_list va;
  usbd_core_type *pudev = (usbd_core_type *)udev;
  vcp_keyboard_type *vcpkybrd = (vcp_keyboard_type *)pudev->class_handler->pdata;
  uint8_t keyboard_buf[8] = {0, 0, 0, 0, 0, 0, 0, 0};

  va_start(va, value1);
  {
    if (value1 & 0x80)
    {
      keyboard_buf[0] |= (1 << ((value1 & 0x0f) - 1));
    }
    else
    {
      keyboard_buf[2] = value1;
    }
    for (i = 1; i < count; ++i)
    {
      value1 = va_arg(va, unsigned char);
      if (value1 & 0x80)
      {
        keyboard_buf[0] |= (1 << ((value1 & 0x0f) - 1));
      }
      else
      {
        keyboard_buf[2 + valueCount] = value1;
        valueCount ++;
      }
    }
    while(1)
    {
      if(vcpkybrd->g_keyboard_tx_completed == 1)
      {
        vcpkybrd->g_keyboard_tx_completed = 0;
        usb_vcpkybrd_class_send_report(&otg_core_struct.dev, keyboard_buf, 8);
        break;
      }
    }
    /* send 0x00 */
    memset(keyboard_buf, 0, sizeof(keyboard_buf));
    while(1)
    {
      if(vcpkybrd->g_keyboard_tx_completed == 1)
      {
        vcpkybrd->g_keyboard_tx_completed = 0;
        usb_vcpkybrd_class_send_report(&otg_core_struct.dev, keyboard_buf, 8);
        break;
      }
    }
  }
  va_end(va);
}

实例

打印大写字母BK

keyboard_send_multKeyValue(&otg_core_struct.dev, 3, KB_B, KB_AUX_LEFT_SHIFT, KB_K);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值