目录
一、简介
以esp32 idf导出的hello world例程,移植lvgl disp和indev驱动的学习笔记。
二、修改工程
继上篇文章,这里是继续使用该工程
把indev.c和.h文件放入lvgl_porting文件夹中,
同样的,先把两个文件的if 0 改成 1。再在main文件中添加#include "./driver/gpio.h",配置对应的按键。
gpio_config_t pGPIOConfig =
{
.intr_type = GPIO_INTR_DISABLE, // 中断不开启
.mode = GPIO_MODE_INPUT,
.pin_bit_mask = GPIO_SEL_4,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.pull_up_en = GPIO_PULLDOWN_ENABLE};
gpio_config(&pGPIOConfig);
pGPIOConfig.pin_bit_mask = GPIO_SEL_5;
gpio_config(&pGPIOConfig);
pGPIOConfig.pin_bit_mask = GPIO_SEL_16;
gpio_config(&pGPIOConfig);
接下来写按下按键对应的处理,这部分我们放到indev.c文件里
这里使用的一些函数需要包含头文件并把原来的lvgl.h删除,.h里已经包含过了
另外,这里只使用了一个按键功能,所以把其他功能函数注释掉,需要注释的是Touchpad、Mouse、Encoder、Button。使用的是 Keypad
然后在主程序中,初始化,记得包含indev.h头文件。
删除build,重新编译,通过。
此时,配置完毕但是想要在屏幕上显示出来,还需要添加按键。
这里我们添加一个group接收按键,和按键的回调,group放在app_main函数里
lv_group_t *group = lv_group_create(); // 創建group
lv_indev_set_group(indev_keypad, group);
lv_obj_t *btnm1 = lv_btnmatrix_create(lv_scr_act());
lv_btnmatrix_set_map(btnm1, btnm_map);
lv_btnmatrix_set_btn_width(btnm1, 10, 2); /*Make "Action1" twice as wide as "Action2"*/
lv_btnmatrix_set_btn_ctrl(btnm1, 10, LV_BTNMATRIX_CTRL_CHECKABLE);
lv_btnmatrix_set_btn_ctrl(btnm1, 11, LV_BTNMATRIX_CTRL_CHECKED);
lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);
lv_group_add_obj(group, btnm1);
回调放在外部
// 按鍵回調
static void event_handler(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *obj = lv_event_get_target(e);
if (code == LV_EVENT_VALUE_CHANGED)
{
uint32_t id = lv_btnmatrix_get_selected_btn(obj);
const char *txt = lv_btnmatrix_get_btn_text(obj, id);
LV_LOG_USER("%s was pressed\n", txt);
}
}
static const char *btnm_map[] = {"1", "2", "3", "4", "5", "\n",
"6", "7", "8", "9", "0", "\n",
"Action1", "Action2", ""};
这里的indev_keypad识别不到,把lv_porting_indev.c里的定义放到.h里
编译成功,按键可以选择左右、确定三个功能,并显示在屏幕上