【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]