键盘设备通过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);
}
实例
打印大写字母B
和K
keyboard_send_multKeyValue(&otg_core_struct.dev, 3, KB_B, KB_AUX_LEFT_SHIFT, KB_K);