TA的每日心情 | 奋斗 8 小时前 |
---|
签到天数: 213 天 连续签到: 1 天 [LV.7]常住居民III
|
本帖最后由 andeyqi 于 2023-10-23 18:18 编辑
简介:
B91的开发套件上自带了2*2 的矩阵键盘,原理图如下,TL_KEY1,TL_KEY2可以作为矩阵键盘的行信号,TL_KEY3,TL_KEY4可以作为矩阵键盘的列信号,我们逐行扫描TL_KEY1,TL_KEY2,读取TL_KEY3,TL_KEY4 列信号状态即可获取案件状态,扫描TL_KEY1 时将TL_KEY1设置为高,将其他三组信号设置为输入,读取TL_KEY3,TL_KEY4信号状态即可判断按键是否按下,如果被按下对应的回去取到高电平状态,释放读取到低电平从而判断按键状态。
按照上面的读取原理,我们只要基本的配置gpio 的输入输出状态即可实现矩阵键盘的功能,TLSR9518 的gpio 配置如下寄存器即可实GPIO 的输入输出,上下拉电阻,输出驱动状态的配置。
- void keyba_scan(void)
- {
- static uint8_t key[4] = {0x00,0x00,0x00,0x00};
- /* keyboard row0 init as output */
- gpio_function_en(KEY_BOARD_ROW1);
- gpio_output_en(KEY_BOARD_ROW1);
- gpio_set_level(KEY_BOARD_ROW1,1);
- /* keyboard row1 col1 col2 init as input */
- gpio_function_en(KEY_BOARD_ROW2);
- gpio_input_en(KEY_BOARD_ROW2);
- gpio_set_up_down_res(KEY_BOARD_ROW2,GPIO_PIN_PULLDOWN_100K);
- gpio_function_en(KEY_BOARD_COL1);
- gpio_input_en(KEY_BOARD_COL1);
- gpio_set_up_down_res(KEY_BOARD_COL1,GPIO_PIN_PULLDOWN_100K);
- gpio_function_en(KEY_BOARD_COL2);
- gpio_input_en(KEY_BOARD_COL2);
- gpio_set_up_down_res(KEY_BOARD_COL2,GPIO_PIN_PULLDOWN_100K);
- vTaskDelay(100);
- /* read row status */
- if(gpio_get_level(KEY_BOARD_COL1) != key[0])
- {
- key[0] = gpio_get_level(KEY_BOARD_COL1);
- printf("KEY1 %s\r\n",key[0] ? "DOWN" : "UP");
- }
- if(gpio_get_level(KEY_BOARD_COL2) != key[1])
- {
- key[1] = gpio_get_level(KEY_BOARD_COL2);
- printf("KEY2 %s\r\n",key[1] ? "DOWN" : "UP");
- }
- gpio_set_level(KEY_BOARD_ROW1,0);
- /* keyboard row0 init as output */
- gpio_function_en(KEY_BOARD_ROW2);
- gpio_output_en(KEY_BOARD_ROW2);
- gpio_set_level(KEY_BOARD_ROW2,1);
- /* keyboard row1 col1 col2 init as input */
- gpio_function_en(KEY_BOARD_ROW1);
- gpio_input_en(KEY_BOARD_ROW1);
- gpio_set_up_down_res(KEY_BOARD_ROW1,GPIO_PIN_PULLDOWN_100K);
- gpio_function_en(KEY_BOARD_COL1);
- gpio_input_en(KEY_BOARD_COL1);
- gpio_set_up_down_res(KEY_BOARD_COL1,GPIO_PIN_PULLDOWN_100K);
- gpio_function_en(KEY_BOARD_COL2);
- gpio_input_en(KEY_BOARD_COL2);
- gpio_set_up_down_res(KEY_BOARD_COL2,GPIO_PIN_PULLDOWN_100K);
- vTaskDelay(100);
- /* read row status */
- if(gpio_get_level(KEY_BOARD_COL1) != key[2])
- {
- key[2] = gpio_get_level(KEY_BOARD_COL1);
- printf("KEY3 %s\r\n",key[2] ? "DOWN" : "UP");
- }
- if(gpio_get_level(KEY_BOARD_COL2) != key[3])
- {
- key[3] = gpio_get_level(KEY_BOARD_COL2);
- printf("KEY4 %s\r\n",key[3] ? "DOWN" : "UP");
- }
- gpio_set_level(KEY_BOARD_ROW2,0);
- }
- static void led_task(void *pvParameters){
- while(1){
- keyba_scan();
- vTaskDelay(100);
- }
- (void)(pvParameters);
- }
复制代码
上述代码运行后可以按照期待的方式读取到按键的按下抬起动作,本示例只是单纯验证矩阵键盘功能,并没有加入按键的去抖处理。
==================资料分割线================== 官方的sdk文档及文档整理至如下路径,里面的所有资料也都可以从官方的wiki获取
|
|