回答

收藏

【Telink-泰凌微电子 B91通用开发套件】(三)矩阵键盘适配

泰凌微电子 泰凌微电子 2309 人阅读 | 0 人回复 | 2023-10-22

本帖最后由 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 接口配置

按照上面的读取原理,我们只要基本的配置gpio 的输入输出状态即可实现矩阵键盘的功能,TLSR9518 的gpio 配置如下寄存器即可实GPIO 的输入输出,上下拉电阻,输出驱动状态的配置。

GPIO 寄存器
GPIO 逻辑框图

SDK 驱动库内的接口直接调用即可完成gpio 的配置输出,按照上面的扫描原理,在((二)FreeRtos 适配SHELL)的基础上创建任务扫面按键状态,代码如下:
  1. void keyba_scan(void)
  2. {
  3.         static uint8_t key[4] = {0x00,0x00,0x00,0x00};

  4.         /* keyboard row0 init as output */
  5.         gpio_function_en(KEY_BOARD_ROW1);
  6.         gpio_output_en(KEY_BOARD_ROW1);
  7.         gpio_set_level(KEY_BOARD_ROW1,1);

  8.         /* keyboard row1 col1 col2 init as input */
  9.         gpio_function_en(KEY_BOARD_ROW2);
  10.         gpio_input_en(KEY_BOARD_ROW2);
  11.         gpio_set_up_down_res(KEY_BOARD_ROW2,GPIO_PIN_PULLDOWN_100K);
  12.         gpio_function_en(KEY_BOARD_COL1);
  13.         gpio_input_en(KEY_BOARD_COL1);
  14.         gpio_set_up_down_res(KEY_BOARD_COL1,GPIO_PIN_PULLDOWN_100K);
  15.         gpio_function_en(KEY_BOARD_COL2);
  16.         gpio_input_en(KEY_BOARD_COL2);
  17.         gpio_set_up_down_res(KEY_BOARD_COL2,GPIO_PIN_PULLDOWN_100K);

  18.         vTaskDelay(100);

  19.         /* read row status */
  20.         if(gpio_get_level(KEY_BOARD_COL1) != key[0])
  21.         {
  22.                 key[0] = gpio_get_level(KEY_BOARD_COL1);
  23.                 printf("KEY1 %s\r\n",key[0] ? "DOWN" : "UP");
  24.         }

  25.         if(gpio_get_level(KEY_BOARD_COL2) != key[1])
  26.         {
  27.                 key[1] = gpio_get_level(KEY_BOARD_COL2);
  28.                 printf("KEY2 %s\r\n",key[1] ? "DOWN" : "UP");
  29.         }

  30.         gpio_set_level(KEY_BOARD_ROW1,0);

  31.         /* keyboard row0 init as output */
  32.         gpio_function_en(KEY_BOARD_ROW2);
  33.         gpio_output_en(KEY_BOARD_ROW2);
  34.         gpio_set_level(KEY_BOARD_ROW2,1);

  35.         /* keyboard row1 col1 col2 init as input */
  36.         gpio_function_en(KEY_BOARD_ROW1);
  37.         gpio_input_en(KEY_BOARD_ROW1);
  38.         gpio_set_up_down_res(KEY_BOARD_ROW1,GPIO_PIN_PULLDOWN_100K);
  39.         gpio_function_en(KEY_BOARD_COL1);
  40.         gpio_input_en(KEY_BOARD_COL1);
  41.         gpio_set_up_down_res(KEY_BOARD_COL1,GPIO_PIN_PULLDOWN_100K);
  42.         gpio_function_en(KEY_BOARD_COL2);
  43.         gpio_input_en(KEY_BOARD_COL2);
  44.         gpio_set_up_down_res(KEY_BOARD_COL2,GPIO_PIN_PULLDOWN_100K);

  45.         vTaskDelay(100);
  46.         /* read row status */
  47.         if(gpio_get_level(KEY_BOARD_COL1) != key[2])
  48.         {
  49.                 key[2] = gpio_get_level(KEY_BOARD_COL1);
  50.                 printf("KEY3 %s\r\n",key[2] ? "DOWN" : "UP");
  51.         }

  52.         if(gpio_get_level(KEY_BOARD_COL2) != key[3])
  53.         {
  54.                 key[3] = gpio_get_level(KEY_BOARD_COL2);
  55.                 printf("KEY4 %s\r\n",key[3] ? "DOWN" : "UP");
  56.         }
  57.         gpio_set_level(KEY_BOARD_ROW2,0);
  58. }


  59. static void led_task(void *pvParameters){

  60.         while(1){
  61.                 keyba_scan();
  62.                 vTaskDelay(100);
  63.         }
  64.         (void)(pvParameters);
  65. }
复制代码

下载验证

上述代码运行后可以按照期待的方式读取到按键的按下抬起动作,本示例只是单纯验证矩阵键盘功能,并没有加入按键的去抖处理。





==================资料分割线==================
官方的sdk文档及文档整理至如下路径,里面的所有资料也都可以从官方的wiki获取



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

3859 积分
6 主题
+ 关注
关闭

站长推荐上一条 /3 下一条