LVGL应用和部署(和物理按键交互)

发布于:2025-07-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        屏幕除了显示部分,还要去和其他外设进行交互,这是非常重要的一个处理方法。我们知道,不管是mcu,还是linux soc,最重要的处理方法就是状态机。而状态机的很重要一个切换条件就是外部输入,这个输入有可能是触屏输入,有可能是按键输入。通常而言,触屏输入是最直接的处理方法。不过触屏输入成本稍微高一点,所以很多客户就会选择普通的屏幕显示,再加上物理按键的办法实现人机交互。

1、常用的按键个数

        一般屏幕显示的话,根据产品要求,按键或多或少。按最少的说,大约5个按键就能完成大部分功能。这5个按键是,上一个、下一个、mode切换、ok确认、返回上一层。

2、按键读取

        在linux上面,按键读取有很多的方法。第一种,就是直接读取/sys/class/gpio/gpio0/value这种形式。第二种,就是读取/dev/input/event0这种方法。第三种一般和厂家的sdk有关系,也就是说,如果厂家有支持按键读取的sdk,直接用他们的也无可厚非。

3、事件类型

        这里交互的事件大约有两种,一种是代替触摸屏的事件,这种情况就是说用按键代替ok、cancel这种控件输入。使用方法就是直接调用lv_obj_send_event函数,比如lv_obj_send_event(btn1, LV_EVENT_CLICKED, NULL)这样。还有一种就是发送给某个窗口的私有事件,这也是比较常见的做法。就lvgl而言,可以起一个定时器,切换到哪个窗口的时候,就给这个窗口发送消息,只不过对应的消息队列可能需要自己写。因为窗口本身只能用定时器+回调函数+消息队列的方式来实现。

4、举例说明

        为了说明按键是如何给控件发送消息的,我们可以用定时器代替。假设此时有一个btn,这个btn有一个回调函数btn_ok_cb,那么它的代码是这样的,

    btn1 = lv_button_create(lv_screen_active());     /*Add a button the current screen*/
    lv_obj_set_pos(btn1, 200, 250);                            /*Set its position*/
    lv_obj_set_size(btn1, 120, 50);                          /*Set its size*/
    lv_obj_add_event_cb(btn1, btn_ok_cb, LV_EVENT_ALL, NULL);           /*Assign a callback to the button*/

    lv_obj_t* btn1_label = lv_label_create(btn1);          /*Add a label to the button*/
    lv_label_set_text(btn1_label, "OK");                     /*Set the labels text*/
    lv_obj_center(btn1_label);

        对应的回调函数如下所示,

static void btn_ok_cb(lv_event_t* e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t* btn = lv_event_get_target_obj(e);

    if (code == LV_EVENT_CLICKED) {

        /*Get the first child of the button which is the label and change its text*/
        lv_obj_t* label = lv_obj_get_child(btn, 0);
        lv_label_set_text_fmt(label, "clicked: %d", cnt++);
    }
}

        这个时候假设有一个按键,就可以通过按键给btn发送事件。因为目前还是在windows平台仿真的lvgl,那么可以通过起一个定时器来仿真btn按下。创建定时器的代码如下所示,

    // create timer
    timer = lv_timer_create(timer_cb1, 1000, &timer);

        有了定时器,就可以在回调函数里面给btn发送事件了,

static void timer_cb1(lv_timer_t* timer)
{
    lv_obj_send_event(btn1, LV_EVENT_CLICKED, NULL);
}

        这样程序起来之后,定时器就可以模拟按键,不停地发送事件了。而btn就好像真的被不停按下,自己就会不停处理事件,进而我们就看到了界面的更新了。


网站公告

今日签到

点亮在社区的每一天
去签到