硬汉嵌入式论坛

 找回密码
 立即注册
查看: 166|回复: 1
收起左侧

[LVGL] 按键的时候能打印 LV_KEY_ENTER ;但是不会触发事件, 进入encoder_key_handler打印,求助大佬指点

[复制链接]

0

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2025-4-7 19:13:47 | 显示全部楼层 |阅读模式
本帖最后由 麻六六 于 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; // 清零旋转差值
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115433
QQ
发表于 2025-4-8 10:42:20 | 显示全部楼层
帮顶。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 15:00 , Processed in 0.264965 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表