1、简介
LVGL支持多种外部输入设备,包括键盘、鼠标、触控面板、旋转按钮、按键,用于向LVGL应用输入操作状态,如按键点击、区域触控、候选轮询等,以下介绍实体按键在LVGL的注册过程。
2、操作步骤
实体按键在LVGL的注册方式分为两种,一种是LV_USE_INDEV_BUTTON,另一种是LV_USE_INDEV_KEYPAD,我们以LV_USE_INDEV_KEYPAD方式来注册实体按键,因为这种方式相对LV_USE_INDEV_BUTTON容易些,除了完成按键输入检测及LVGL注册输入设备外,还要将实体按键与LVGL控件绑定,才能够实现外部按键输入对UI控件进行状态控制。
其中,按键输入检测可参考这篇帖子
【换取手持示波器】用户按键管理-使用结构体-电子产品世界论坛
以下将按键检测值更改为LVGL可识别的实体按键指令
Struct_KEY_List Key_List[]={
{LV_KEY_PREV,GPIOI,GPIO_PIN_8},
{LV_KEY_LEFT,GPIOI,GPIO_PIN_9},
{LV_KEY_NEXT,GPIOI,GPIO_PIN_10},
{LV_KEY_RIGHT,GPIOF,GPIO_PIN_11},
{LV_KEY_ENTER,GPIOC,GPIO_PIN_13}
};以下是keypad设备检测外部输入状态的代码,默认实现了前向、后向、左向、右向、回车功能的检测
![1744979517179975.png KX][DIOW%H(6XFIV0T6FUEL.png](http://uphotos.eepw.com.cn/1709346044/pics/1744979517179975.png)
本次实体按键输入设备注册的重点内容如下:
完成按键输入状态的捕获,非0值表示有按键按下并返回对应按键值,0表示无按键按下。
static uint32_t keypad_get_key(void)
{
/*Your code comes here*/
uint8_t i;
i=read_key();
if(i){
return i;
};
return 0;
}
main.c文件测试:
按键输入检测
typedef struct{
uint16_t KEY_Value;
GPIO_TypeDef* GPIOx;
uint16_t GPIO_Pin_x;
}Struct_KEY_List;
Struct_KEY_List Key_List[]={
{LV_KEY_PREV,GPIOI,GPIO_PIN_8},
{LV_KEY_LEFT,GPIOI,GPIO_PIN_9},
{LV_KEY_NEXT,GPIOI,GPIO_PIN_10},
{LV_KEY_RIGHT,GPIOF,GPIO_PIN_11},
{LV_KEY_ENTER,GPIOC,GPIO_PIN_13}
};
int read_key(void)
{
uint16_t total_keys=sizeof(Key_List)/sizeof(Struct_KEY_List);
for(uint16_t cmd_index=0;cmd_index<total_keys;cmd_index++){
if(HAL_GPIO_ReadPin(Key_List[cmd_index].GPIOx,Key_List[cmd_index].GPIO_Pin_x)==1){
HAL_Delay(20);
while(HAL_GPIO_ReadPin(Key_List[cmd_index].GPIOx,Key_List[cmd_index].GPIO_Pin_x)==1);
return Key_List[cmd_index].KEY_Value;
}
}
return -1;
}创建基本UI控件,并将这些UI控件与实体按键绑定
void my_lvgl_test(void)
{
lv_obj_t *scr = lv_scr_act();
lv_group_t *group = lv_group_create();//创建UI控制组,用于绑定UI控件与实体按键
lv_group_set_default(group);
lv_indev_set_group(indev_keypad, group);
lv_group_focus_obj(group);
lv_group_set_editing(group, true);
lv_obj_t * label;
lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(btn1, btn_event_handler, LV_EVENT_ALL, NULL);
lv_obj_align(btn1, LV_ALIGN_CENTER, -60, -40);
lv_obj_set_style_bg_color(btn1, lv_color_hex(0xFF0000), LV_STATE_FOCUSED);//按键聚焦时更改背景颜色
label = lv_label_create(btn1);
lv_label_set_text(label, "OPEN");
lv_obj_center(label);
lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
lv_obj_add_event_cb(btn2, btn_event_handler, LV_EVENT_ALL, NULL);
lv_obj_align(btn2, LV_ALIGN_CENTER, -60, 40);
lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
lv_obj_set_height(btn2, LV_SIZE_CONTENT);
lv_obj_set_style_bg_color(btn2, lv_color_hex(0x000000), LV_STATE_FOCUSED);
label = lv_label_create(btn2);
lv_label_set_text(label, "CLOSE");
lv_obj_center(label);
lv_obj_t *roller1 = lv_roller_create(scr);//星期候选框
lv_roller_set_options(roller1,
"Monday\n"
"Tuesday\n"
"Wednesday\n"
"Thursday\n"
"Friday\n"
"Saturday\n"
"Sunday",
LV_ROLLER_MODE_INFINITE);
lv_obj_set_style_bg_color(roller1, lv_color_hex(0x00EE00), LV_STATE_FOCUSED);
lv_roller_set_visible_row_count(roller1, 4);
lv_obj_set_pos(roller1,110,60);
lv_obj_add_event_cb(roller1, event_handler, LV_EVENT_ALL, NULL);
lv_group_add_obj(group ,btn1);//将按钮绑定至UI控件
lv_group_add_obj(group ,btn2);
lv_group_add_obj(group ,roller1);
}3、运行效果

我要赚赏金
