avatar

松果工作室

欢迎光临

  • 首页
  • ESP
  • LVGL
  • freeRTOS
  • 快速笔记
  • 考察日志
  • 个人收藏
  • 我的服务
Home (ESP-IDF)LVGL 对接键盘接口
文章

(ESP-IDF)LVGL 对接键盘接口

Posted 2024-04-11 Updated 2025-12- 27
By YCP
11~14 min read

初始化键盘配置

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);//创建一个定时器,每秒更新一次日期、时间、时长
}

现象

屏幕出现一个蓝色按钮并被选中,按键点击产生动作

坑和笔记
LVGL ESP
License:  CC BY 4.0
Share

Further Reading

Sep 27, 2025

(LIB)一个好用的Modbus解析函数

一个好用的Modbus解析函数 包含03/10/04/06 #include <stdio.h> #include <stdint.h> #include <string.h> #

Jun 21, 2024

(LIB)环形滤波算法

#include <stdio.h> #include <stdlib.h> #define BUFFER_SIZE 10 // 缓冲区大小 #define THRESHOLD 180

Jun 17, 2024

(STM32)STM32 ADC采集的三种方式

采样周期 单个采集模式 ADC_Settings: 程序使用 uint16_t ADC_Read(

OLDER

(ESP-IDF)LVGL 对接 EC11

NEWER

(ESP-IDF)LVGL创建对象

Recently Updated

  • (ESP-IDF)LVGL 模拟器
  • (ESP-IDF)LVGL 自定义对象加入编码器组
  • (ESP-IDF)vscode配置文件
  • (Elec)来复再生式晶体管单管收音机
  • (ESP-IDF)ESPNOW

Trending Tags

LVGL WCH Linux Elec ThatProject freeRTOS STM ESP Flutter Others

Contents

©2026 松果工作室. Some rights reserved.

Using the Halo theme Chirpy