LVGL 对接键盘接口
初始化键盘配置
void lv_port_indev_init(void) {
static lv_indev_drv_t indev_drv;
keypad_init();
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_drv.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&indev_drv);
}
相关配置函数
#if KEYPAD
#define BTN_PIN 9
static void keypad_init(void) {
gpio_config_t btn_config = {
.pin_bit_mask = (1ULL << BTN_PIN),
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&btn_config);
}
static void keypad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) {
static uint32_t last_key = 0;
//mouse_get_xy(&data->point.x, &data->point.y);
uint32_t act_key = keypad_get_key();
if (act_key != 0) {
data->state = LV_INDEV_STATE_PR;
switch (act_key) {
case 1:
act_key = LV_KEY_NEXT;
break;
case 2:
act_key = LV_KEY_PREV;
break;
case 3:
act_key = LV_KEY_LEFT;
break;
case 4:
act_key = LV_KEY_RIGHT;
break;
case 5:
act_key = LV_KEY_ENTER;
break;
}
last_key = act_key;
} else {
data->state = LV_INDEV_STATE_REL;
}
data->key = last_key;
}
static uint32_t keypad_get_key(void) {
if(gpio_get_level(BTN_PIN) == 0){
return LV_KEY_ENTER;
}else return 0;
}
#endif
注册组
void ui_Screen1_screen_init(void){
//创建屏幕对象
ui_Screen1 = lv_obj_create(NULL);
lv_obj_clear_flag( ui_Screen1, LV_OBJ_FLAG_SCROLLABLE );
//创建一个组链接实体按键
lv_group_t * group = lv_group_create();
lv_indev_set_group(indev_keypad, group);
//创建按钮
lv_obj_t * button = lv_btn_create(ui_Screen1);
lv_obj_set_size(button, 60, 35);
lv_obj_set_pos(button, 50, 125);
lv_obj_add_event_cb(button, btn_event_cb, LV_EVENT_ALL, NULL);
//链接实体按键
lv_group_add_obj(group, button);
//LVGL定时器
lv_timer_create(update_time_cb, 1000, NULL);//创建一个定时器,每秒更新一次日期、时间、时长
}
现象
屏幕出现一个蓝色按钮并被选中,按键点击产生动作
License:
CC BY 4.0