+ ESP32S3-输入设备Keypad +
+ + +配置
++硬件:ESP32S3N16R8开发板 + 2.8寸TFT显示屏(ST7789) + 拨轮
+
软件:Visual Studio Code + PlatformIO + Squareline Studio
UI界面
使用Squareline Studio
设计如下简单界面
设置工程导出路径,然后导出文件
+ +导出文件结构如下
+ +PlatforIO工程
复制工程
复制前面写好的触摸屏工程
+删除原工程中的UI文件,将新UI复制过来
+ +优化结构
VS Code
打开工程
为了让main.cpp
更简洁,这里将屏幕初始化的内容写到单独的screen.cpp
文件中,然后在main.cpp
中引入screen.h
头文件
修改后screen.h
文件内容如下
1 |
|
screen.cpp
内容如下
1 |
|
输入设备
+打开如下目录文件
+ +打开lv_port_indev_template.c
文件后,可以看到一共有五种输入方式
1 | lv_indev_t * indev_touchpad; |
分别是触摸,鼠标,键盘,编码器,按键,具体内容请查看上方百问网lvgl中文文档链接
+++本次使用的是
+keypad
来控制屏幕上的控件
Keypad设置
在lv_port_indev_template.c
中关于keypad
一共有这几个函数
1 | static void keypad_init(void); |
分别是键盘初始化,键盘回调,键值获取
+screen.h
把lv_port_indev_template.c
中这三个函数声明复制到screen.h
中,修改如下
1 |
|
screen.cpp
把lv_port_indev_template.c
中三个函数的定义复制到screen.cpp
中
1 | /*------------------ |
在我自制的ESP32S3N16R8开发板中使用的是如下图所示的多功能开关
+ +原理图如下,三个按键被下拉,IO为低电平,当按键按下时IO将检测到高电平
+ +在screen.cpp
中最开始定义如下
1 | static lv_indev_drv_t indev_drv; |
keypad_init
内容如下
1 | static void keypad_init(void) |
keypad_read
内容如下
1 | static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) |
keypad_get_key
内容如下
1 | static uint32_t keypad_get_key(void) |
下一步修改screen_init
内容如下
1 | void screen_init(void) |
主要修改如下
+-
+
+indev_drv.type
输入设备类型改为LV_INDEV_TYPE_KEYPAD
+
+indev_drv.read_cb
回调函数改为keypad_read
+
+lv_indev_drv_register(&indev_drv)
赋值给最开始定义的indev_keypad1
+创建组
+group1 = lv_group_create()lv_group_create()
+将组与输入设备关联
+lv_indev_set_group(indev_keypad1, group1)
+
添加对象
只有将控件对象添加到组中,才能通过keypad
控制
打开如下目录界面文件lvgl/screens/ui_mainpage.c
可以看到在设计界面时一共添加了四个控件
+1 | ui_Button2 |
在#include "../ui.h"
下添加如下代码
1 | extern lv_group_t * group1; |
在ui_mainpage_screen_init
函数中最后添加如下代码
1 | lv_group_add_obj(group1, ui_Button2); |
main.cpp
因为前面优化了代码结构,这里还需要在main.cpp
中引入screen.h
修改代码如下
+1 |
|
效果
修改程序后,编译烧录
+ + + + +