本帖最后由 麻六六 于 2025-4-7 19:14 编辑
使用LVGL8.3.3 ,使用了编码器; 问题:按键的时候能打印 LV_KEY_ENTER ;但是不会触发事件, 进入encoder_key_handler打印,求助大佬指点
[C] 纯文本查看 复制代码 lv_group_t * g_encoder_group; // 焦点组[/p]extern lv_indev_t * indev_encoder;
static void encoder_key_handler(lv_event_t *e) {
lv_event_code_t code = lv_event_get_code(e);
lv_key_t key = lv_indev_get_key(lv_indev_get_act());
printf("event code=%d, key=%d \r\n", (int)code, (int) key);
uint32_t key1 = *(uint32_t*)lv_event_get_param(e);
printf("Event key1: %d\n", key1);
lv_indev_t *indev = lv_indev_get_act();
printf("Input device type: %d\n", indev->driver->type);
}
void setup_scr_screen111(lv_ui *ui){
// 创建焦点组
g_encoder_group = lv_group_create();
lv_indev_set_group(indev_encoder, g_encoder_group); // 编码器绑定到焦点组
// 将对象加入焦点组(例如容器和按钮)
lv_group_add_obj(g_encoder_group, ui->screen_btn_CC);
lv_group_add_obj(g_encoder_group, ui->screen_btn_CV);
lv_obj_add_flag(ui->screen_btn_CC, LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_flag(ui->screen_btn_CV, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_style_bg_color(ui->screen_btn_CC, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED); // 按钮聚焦样式
lv_obj_set_style_bg_color(ui->screen_btn_CV, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED);
// 绑定事件到容器和按钮
lv_obj_add_event_cb(ui->screen_btn_CC, encoder_key_handler, LV_EVENT_KEY, NULL);
lv_obj_add_event_cb(ui->screen_btn_CV, encoder_key_handler, LV_EVENT_KEY, NULL);
lv_group_focus_obj(ui->screen_btn_CC); // 手动设置焦点
printf("%d",lv_obj_has_state(ui->screen_btn_CC, LV_STATE_FOCUSED));
}
static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
data->enc_diff = encoder_diff;
data->state = encoder_state;
if((key_steady == 0) &&(encoder_click == 1)){
encoder_click = 0;
data->state = LV_INDEV_STATE_PRESSED; // 中键按下为0
data->key = LV_KEY_ENTER ;
printf("LV_KEY_ENTER \r\n");
}
else if((key_steady == 1) &&(encoder_click == 0)){
encoder_click = 1;
data->state = LV_INDEV_STATE_RELEASED; // 没有键被按下
data->key = LV_KEY_ESC; // 默认返回 ESC 键(可选)
printf("LV_KEY_ESC \r\n");
}
// 2. 处理旋转(仅在无按键操作时生效)
else if (encoder_diff != 0) {
data->enc_diff = encoder_diff;
data->key = (encoder_diff > 0) ? LV_KEY_RIGHT : LV_KEY_LEFT;
data->state = LV_INDEV_STATE_RELEASED;
printf("encoder_read state=%d, key = %d\r\n", data->state, data->key);
}
encoder_diff = 0; // 清零旋转差值
} |