LVGL的Button外部按键
这个Button是没有触摸屏的情况下用外部的按键来对应屏幕上的按键,比如屏幕上有个确定键,你按下外部某个按键,屏幕的确定键也相应显示按下。
工作原理其实就是LVGL把外部按键转换成屏幕的按键坐标的点按,需要注意的是这个坐标是要屏幕按键组件的中心点,需要自己计算。
代码的实现
//外部按键的初始化,这里配置成IO12
uint8_t button_init(void)
{
pinMode(12,INPUT);
return 1;
}
//按键扫描函数,也就是实际按键的读取函数
uint8_t btn_scan(void)
{
return digitalRead(12);
}
//按键操作后返回的状态值
static void button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static uint8_t last_btn = 0;
/*Get the pressed button's ID*/
int8_t btn_act = btn_scan();
if(btn_act >= 0) {
data->state = LV_INDEV_STATE_PR;//按下
last_btn = btn_act;
} else {
data->state = LV_INDEV_STATE_REL;//松开
}
/*Save the last pressed button's ID*/
data->btn_id = last_btn;
}
static lv_indev_t *indev_button; //定义一个按键
// 输入设备初识化函数
void lv_port_indev_init(void)
{
// 初识化按键
button_init();
// 注册输入设备
static lv_indev_drv_t indev_drv;
lv_indev_drv_init( &indev_drv );
indev_drv.type = LV_INDEV_TYPE_BUTTON; //定义为Button类型
indev_drv.read_cb = button_read; //绑定按键值返回函数
indev_button = lv_indev_drv_register( &indev_drv ); //注册按键
static const lv_point_t btn_points[1] = {
{50,25},//这个就是按键对应的一个屏幕上按键组件的中心坐标点
};
lv_indev_set_button_points(indev_button,btn_points); //将实体按键和坐标点绑定
}
然后在初始化时调用lv_port_indev_init函数即可运行。
LVGL按键初始化的解释
lv_indev_drv_t indev_drv; //初始化一个结构体用来存放需要初始化的按键的参数
lv_indev_drv_init(&indev_drv); /*Basic initialization*///首先进行初始化这个结构体,赋予一些初始化的参数
indev_drv.type =... /*See below.*///按键的类型
indev_drv.read_cb =... /*See below.*///按键的回调函数,用来读取按键状态
/*Register the driver in LVGL and save the created input device object*/
lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv);
//lv_indev_t 就是声明注册好的一个按键的句柄,可以理解为这个句柄就是指这个按键。
参考链接
LVGL button 类型输入坐标
lvgl8.x 对接实体按键驱动
《ESP32-Arduino》LVGL之输入设备详解及实例(触摸屏,实体按键,编码器,多功能按键)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)