andeyqi 发表于 2023-10-22 22:00:28

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

本帖最后由 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)的基础上创建任务扫面按键状态,代码如下:void keyba_scan(void)
{
      static uint8_t key = {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)
      {
                key = gpio_get_level(KEY_BOARD_COL1);
                printf("KEY1 %s\r\n",key ? "DOWN" : "UP");
      }

      if(gpio_get_level(KEY_BOARD_COL2) != key)
      {
                key = gpio_get_level(KEY_BOARD_COL2);
                printf("KEY2 %s\r\n",key ? "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)
      {
                key = gpio_get_level(KEY_BOARD_COL1);
                printf("KEY3 %s\r\n",key ? "DOWN" : "UP");
      }

      if(gpio_get_level(KEY_BOARD_COL2) != key)
      {
                key = gpio_get_level(KEY_BOARD_COL2);
                printf("KEY4 %s\r\n",key ? "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获取https://gitee.com/andeyqi/telink-b91


页: [1]
查看完整版本: 【Telink-泰凌微电子 B91通用开发套件】(三)矩阵键盘适配