#申请原创# @21小跑堂
7.基于官方USB例程和矩阵按键实现数字小键盘
上个帖子已经实现了对鼠标的模拟,接下来再做个键盘的,官方已经提供了一个键盘的例程,但是是针对MINI board的并且用的IO也与TINY board的不同,先以TINY board的鼠标例程为基础改一个针对TINY board的键盘例程出来
需要改动的地方不多,都在usbd_descriptor.c这个文件里,首先是USBD_HS_PID要改为1004
之后把USBD_HID_ITF_PORTOCOL_MOUSE换为USBD_HID_ITF_PORTOCOL_KEYBOARD,USBD_HID_MOUSE_REPORT_DESC_SIZE换为USBD_HID_KEYBOARD_REPORT_DESC_SIZE,这两个都有两处要替换,注意查找
之后将usbd_hid_keyboard.c加入工程并删掉原来的usbd_hid.c
最后将键盘消息处理函数复制过来替换掉原来鼠标的就行了,注意把里面的MINI替换成TINY
- void USB_DevUserApplication(void)
- {
- static uint8_t userAppState = USER_APP_INIT;
- static uint8_t interval = 0;
- static uint8_t report[8] = { 0 };
- static uint8_t i = 4;
-
- switch (userAppState)
- {
- case USER_APP_INIT:
- interval = USBD_HID_ReadInterval(&gUsbDeviceFS);
- report[0] = 0;
- report[1] = 0;
- report[2] = 0;
- report[3] = 0;
- userAppState = USER_APP_RUN;
- break;
- case USER_APP_RUN:
- if (!APM_TINY_PBGetState(BUTTON_KEY1))
- {
- APM_DelayMs(10);
- if (!APM_TINY_PBGetState(BUTTON_KEY1))
- {
- if(i > 29)
- {
- i = 4;
- report[2] = KEYBOARD_ENTER;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
- APM_DelayMs(20);
- report[2] = 0;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
- APM_DelayMs(20);
- }
-
- report[2] = i;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
-
- APM_DelayMs(20);
-
- report[2] = 0;
- USBD_HID_TxReport(&gUsbDeviceFS, (uint8_t*)report, 8);
-
- i++;
-
- while(!APM_TINY_PBGetState(BUTTON_KEY1));
- }
- }
- APM_DelayMs(interval);
- break;
- }
- }
实现效果
再来实现一下矩阵按键的驱动
矩阵按键和普通按键不一样,不是一个IO对应一个按键,我用的这个是4行4列,在行线和列线的每个交叉点上设置一个按键,使用8个IO口来进行16个按键的控制读取
读取键值的方法:
先把行配置成上拉输入模式,列配置成输出模式并输出低电平,有按键按下的那一行IO输入为低电平
再把列配置成上拉输入模式,行配置成输出模式并输出低电平,有按键按下的那一列IO输入为低电平
当然上面的检测方法中你也可以输入配置成下拉输入,输出配置为推挽输出高电平,检测IO为高电平
通过行和列就能确定是哪个按键被按下了
代码实现
|