LVGL物理按键使用,基于arduino,esp32

1 篇文章 0 订阅
1 篇文章 0 订阅

LVGL 8.3.1

#define LVGL_VERSION_MAJOR 8
#define LVGL_VERSION_MINOR 3
#define LVGL_VERSION_PATCH 1
#define LVGL_VERSION_INFO ""

LVGL常用的是触摸屏,这次有限定需要使用外置按键,调试过程做个记录:

调试环境 arduino,使用vscode进行代码编译,arduino 只负责下载。

测试代码示例  lvgl\examples\arduino\LVGL_Arduino\LVGL_Arduino.ino

参考示例 lvgl\examples\porting\lv_port_indev_template.c

首先,setup():

改动前

/*Initialize the (dummy) input device driver*/
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init( &indev_drv );
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = my_touchpad_read;
    lv_indev_drv_register( &indev_drv );

改动后

在后边可以通过其他示例增加控件,举例 按键组合:lvgl\examples\widgets\btnmatrix\lv_example_btnmatrix_1.c

    /*Initialize the (dummy) input device driver*/
    static lv_indev_drv_t indev_drv;

    /*------------------
     * Keypad
     * -----------------*/

    /*Initialize your keypad or keyboard if you have*/
    keypad_init();

    /*Register a keypad input device*/
    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);


    lv_obj_t * btnm1 = lv_btnmatrix_create(lv_scr_act());
    lv_btnmatrix_set_map(btnm1, btnm_map);
    lv_btnmatrix_set_btn_width(btnm1, 10, 2);        /*Make "Action1" twice as wide as "Action2"*/
    lv_btnmatrix_set_btn_ctrl(btnm1, 10, LV_BTNMATRIX_CTRL_CHECKABLE);
    lv_btnmatrix_set_btn_ctrl(btnm1, 11, LV_BTNMATRIX_CTRL_CHECKED);
    lv_obj_align(btnm1, LV_ALIGN_CENTER, 0, 0);
    lv_obj_add_event_cb(btnm1, event_handler, LV_EVENT_ALL, NULL);

按键组合的事件回调函数和按键名称

static void event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_target(e);
    if(code == LV_EVENT_VALUE_CHANGED) {
        uint32_t id = lv_btnmatrix_get_selected_btn(obj);
        const char * txt = lv_btnmatrix_get_btn_text(obj, id);

        LV_LOG_USER("%s was pressed\n", txt);
    }
}



static const char * btnm_map[] = {"1", "2", "3", "4", "5", "\n",
                                  "6", "7", "8", "9", "0", "\n",
                                  "Action1", "Action2", ""
                                 };

按键的读取和回调函数

/*------------------
 * Keypad
 * -----------------*/

/*Initialize your keypad*/
static void keypad_init(void)
{
    /*Your code comes here*/
    pinMode(25, INPUT); //左
    pinMode(36, INPUT); //上
    pinMode(39, INPUT); //右
    pinMode(34, INPUT); //下
    pinMode(35, INPUT); //返回
    pinMode(21, INPUT); //确定

}

/*Will be called by the library to read the mouse*/
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;

    /*Get the current x and y coordinates*/
    mouse_get_xy(&data->point.x, &data->point.y);

    /*Get whether the a key is pressed and save the pressed key*/
    uint32_t act_key = keypad_get_key();
    if(act_key != 0) {
        data->state = LV_INDEV_STATE_PR;

        /*Translate the keys to LVGL control characters according to your key definitions*/
        switch(act_key) {
            case 1:
                act_key = LV_KEY_LEFT;
                break;
            case 2:
                act_key = LV_KEY_PREV;
                break;
            case 3:
                act_key = LV_KEY_RIGHT;
                break;
            case 4:
                act_key = LV_KEY_NEXT;
                break;
            case 5:
                act_key = LV_KEY_HOME;
                break;
            case 6:
                act_key = LV_KEY_ENTER;
                break;
        }

        last_key = act_key;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }

    // Serial.println( last_key );
    data->key = last_key;
}

/*Get the currently being pressed key.  0 if no key is pressed*/
static uint32_t keypad_get_key(void)
{
    /*Your code comes here*/
    if(digitalRead(25) == 0){
        return 1;
    }else if(digitalRead(36) == 0){
        return 2;
    }else if(digitalRead(39) == 0){
        return 3;
    }else if(digitalRead(34) == 0){
        return 4;
    }else if(digitalRead(35) == 0){
        return 5;
    }else if(digitalRead(21) == 0){
        return 6;
    }

    return 0;
}

只是按照示例的内容是如上边所示,按键按下去还是没啥翻译,查看LVGL官方文档

在setup()内增加以下几句:

    lv_group_t *group = lv_group_create();
    lv_indev_set_group(indev_keypad, group);

    lv_group_add_obj(group ,btnm1);

 OK,按钮有反应了

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值