这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » LVGL注册按键输入设备

共1条 1/1 1 跳转至

LVGL注册按键输入设备

工程师
2025-04-18 20:50:15     打赏

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设备检测外部输入状态的代码,默认实现了前向、后向、左向、右向、回车功能的检测

KX][DIOW%H(6XFIV0T6FUEL.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;
}

image.png

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、运行效果

56.gif





关键词: LVGL实体按键注册    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]