如何将lvgl的虚拟按键与外置独立实体按键联动(基于lvgl V6.0.2)
lv_port_indev配置
lv_port_indev.c
//定义按键函数
static bool button_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static int8_t button_get_pressed_id(void);
static bool button_is_pressed(uint8_t id);
lv_indev_t * indev_btn;
//在初始化函数中注册按键,该初始化函数会在main主函数中调用
void lv_port_indev_init(void)
{
lv_indev_drv_t indev_drv;
/*Register a button input device*/
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_BUTTON;
indev_drv.read_cb = button_read;
indev_btn = lv_indev_drv_register(&indev_drv);
//指定具体坐标点,我使用了三个物理按键来跟屏幕的触摸按键对应,该坐标点必须在虚拟按键的触摸范围内。
static lv_point_t points_btn[3] = {
{SC_MENU_Addr_X1, SC_MENU_Addr_Y1},
{SC_MENU_Addr_X1+3*SC_Base_Addr_X36, SC_MENU_Addr_Y1},
{SC_MENU_Addr_X1+6*SC_Base_Addr_X36, SC_MENU_Addr_Y1},
};
lv_indev_set_button_points(indev_btn, points_btn);
}
//button_read 使用系统默认的即可
static bool 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 = button_get_pressed_id();
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;
/*Return `false` because we are not buffering and no more data to read*/
return false;
}
/*Get ID (0, 1, 2 ..) of the pressed button*/
//使用系统默认的即可
//注意此处i的最大值为数组最大有效值
static int8_t button_get_pressed_id(void)
{
uint8_t i;
/*Check to buttons see which is being pressed (assume there are 2 buttons)*/
for(i = 0; i < 3; i++) {
/*Return the pressed button's ID*/
if(button_is_pressed(i)) {
return i;
}
}
/*No button pressed*/
return -1;
}
//此处需要将ID号与你实体按键的IO口对应起来。例如我的PE2对应ID号为0,对应坐标点为{SC_MENU_Addr_X1, SC_MENU_Addr_Y1},
/*Test if `id` button is pressed or not*/
static bool button_is_pressed(uint8_t id)
{
uint8_t i;
if(id==0)
{
i=key_Scan_lvgl(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2),1,M_ONOFF_PRES);
if(i>0)
return true;
}else if(id==1)
{
i=key_Scan_lvgl(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3),1,M_UP_PRES);
if(i>0)
return true;
}
else if(id==2)
{
i=key_Scan_lvgl(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4),1,M_DOWN_PRES);
if(i>0)
return true;
}
return false;
}
以上是初学时对此的应用,如有不足,敬请谅解。