前言
今天来分析一下矩阵键盘,关于矩阵键盘这部分,实际上原理不难。乐鑫做好了一个矩阵键盘的,其中编程思路非常值得推敲。这次咱们先看看库怎么用,下次再来分析一波这个库源码。
官方例程详细注释
#include <stdio.h>
#include "esp_log.h"
#include "matrix_keyboard.h"
const static char *TAG = "example";
/**
* @摘要 矩阵键盘事件处理函数
* @注意 此函数是在定时器里运行
*/
esp_err_t example_matrix_kbd_event_handler(matrix_kbd_handle_t mkbd_handle, matrix_kbd_event_id_t event, void *event_data, void *handler_args)
{
uint32_t key_code = (uint32_t)event_data;
switch (event) {
case MATRIX_KBD_EVENT_DOWN:
ESP_LOGI(TAG, "press event, key code = %04x", key_code);
break;
case MATRIX_KBD_EVENT_UP:
ESP_LOGI(TAG, "release event, key code = %04x", key_code);
break;
}
return ESP_OK;
}
void app_main(void)
{
matrix_kbd_handle_t kbd = NULL;
// 应用默认矩阵键盘配置
matrix_kbd_config_t config = MATRIX_KEYBOARD_DEFAULT_CONFIG();
// 设置矩阵键盘列使用的GPIO
config.col_gpios = (int[]) {
10, 11, 12, 13
};
// 设置列数
config.nr_col_gpios = 4;
// 设置矩阵键盘行使用的GPIO
config.row_gpios = (int[]) {
14, 15, 16, 17
};
// 设置行数
config.nr_row_gpios = 4;
// 安装矩阵键盘驱动
matrix_kbd_install(&config, &kbd);
// 绑定键盘事件处理函数
matrix_kbd_register_event_handler(kbd, example_matrix_kbd_event_handler, NULL);
// 键盘开始工作
matrix_kbd_start(kbd);
}
简析和吐槽
这个例程主代码非常简单是一个4*4矩阵键盘,总的来说就是使用默认配置初始化矩阵键盘,并且给它绑定好事件处理函数,调用开始函数就可以定时检测键盘并处理事件了。在使用的过程中,我们需要把matrix_keyboard文件夹整体copy到你自己的工程的components文件中去,根据例程初始化好键盘就可以使用啦。有点骚的地方在于这里整了一个匿名数组。
这种语法不常用,相比起来不匿名无非就是少写了一个变量,纯属写代码的人装逼。
// 匿名数组
config.col_gpios = (int[]) {
10, 11, 12, 13
};
// 等价于下面的写法
int a[] = {10, 11, 12, 13};
config.col_gpios = a;
总结
相关官方资料链接
矩阵键盘例程:https://github.com/espressif/esp-idf/tree/master/examples/peripherals/gpio/matrix_keyboard
gpio相关api:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/gpio.html
匿名数组:https://blog.csdn.net/nicai_xiaoqinxi/article/details/98391584