华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 324|回复: 0

按键的时候能打印 LV_KEY_ENTER ;但是不会触发事件

[复制链接]

1

主题

1

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2025-4-7 19:41:18 | 显示全部楼层 |阅读模式

使用LVGL8.3.3  ,使用了编码器;

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

  1. lv_group_t * g_encoder_group; // 焦点组[/p]extern lv_indev_t * indev_encoder;

  2. static void encoder_key_handler(lv_event_t *e) {
  3.     lv_event_code_t code = lv_event_get_code(e);
  4.     lv_key_t key = lv_indev_get_key(lv_indev_get_act());
  5.     printf("event code=%d,  key=%d \r\n", (int)code, (int) key);
  6.      
  7.     uint32_t key1 = *(uint32_t*)lv_event_get_param(e);   
  8.     printf("Event key1: %d\n", key1);
  9.      
  10.     lv_indev_t *indev = lv_indev_get_act();
  11.     printf("Input device type: %d\n", indev->driver->type);
  12. }

  13. void setup_scr_screen111(lv_ui *ui){
  14. // 创建焦点组
  15.     g_encoder_group = lv_group_create();
  16.     lv_indev_set_group(indev_encoder, g_encoder_group); // 编码器绑定到焦点组
  17.    
  18.     // 将对象加入焦点组(例如容器和按钮)
  19.     lv_group_add_obj(g_encoder_group, ui->screen_btn_CC);
  20.     lv_group_add_obj(g_encoder_group, ui->screen_btn_CV);

  21.     lv_obj_add_flag(ui->screen_btn_CC, LV_OBJ_FLAG_CLICKABLE);
  22.     lv_obj_add_flag(ui->screen_btn_CV, LV_OBJ_FLAG_CLICKABLE);
  23.     lv_obj_set_style_bg_color(ui->screen_btn_CC, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED); // 按钮聚焦样式
  24.     lv_obj_set_style_bg_color(ui->screen_btn_CV, lv_color_hex(0x007ACC), LV_PART_MAIN | LV_STATE_FOCUSED);

  25.     // 绑定事件到容器和按钮
  26.     lv_obj_add_event_cb(ui->screen_btn_CC, encoder_key_handler, LV_EVENT_KEY, NULL);
  27.     lv_obj_add_event_cb(ui->screen_btn_CV, encoder_key_handler, LV_EVENT_KEY, NULL);

  28.     lv_group_focus_obj(ui->screen_btn_CC); // 手动设置焦点
  29.     printf("%d",lv_obj_has_state(ui->screen_btn_CC, LV_STATE_FOCUSED));
  30. }

  31. static void encoder_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
  32. {

  33.     data->enc_diff = encoder_diff;
  34.     data->state = encoder_state;

  35.     if((key_steady == 0) &&(encoder_click == 1)){
  36.         encoder_click = 0;
  37.         data->state = LV_INDEV_STATE_PRESSED; // 中键按下为0
  38.         data->key =  LV_KEY_ENTER ;
  39.         printf("LV_KEY_ENTER \r\n");
  40.     }
  41.     else if((key_steady == 1) &&(encoder_click == 0)){
  42.         encoder_click = 1;
  43.         data->state = LV_INDEV_STATE_RELEASED; // 没有键被按下
  44.         data->key = LV_KEY_ESC; // 默认返回 ESC 键(可选)
  45.         printf("LV_KEY_ESC \r\n");
  46.     }
  47.     // 2. 处理旋转(仅在无按键操作时生效)
  48.     else if (encoder_diff != 0) {
  49.         data->enc_diff = encoder_diff;
  50.         data->key = (encoder_diff > 0) ? LV_KEY_RIGHT : LV_KEY_LEFT;
  51.         data->state = LV_INDEV_STATE_RELEASED;
  52.         printf("encoder_read state=%d,  key = %d\r\n", data->state, data->key);
  53.     }

  54.     encoder_diff = 0; // 清零旋转差值
  55. }
复制代码



回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2025-7-2 01:18 , Processed in 0.028767 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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