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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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就好像真的被不停按下,自己就会不停处理事件,进而我们就看到了界面的更新了。

相关推荐
weixin_452077641 分钟前
STM32 烧录程序后上电不工作问题集合
stm32·单片机·嵌入式硬件
沸速存储15 分钟前
内存技术的未来:DDR6、CAMM2与CXL将如何改变计算架构
科技·嵌入式硬件·架构·计算机外设·电脑
LCG元39 分钟前
STM32多传感器数据采集系统设计:I2C+ADC+UART+低功耗工程实战
stm32·单片机·嵌入式硬件
国科安芯1 小时前
MCU芯片AS32X601如何使用 DMA 单次模式搬运 ADC 多通道采样数据?
单片机·嵌入式硬件
俊基科技1 小时前
1厘米的声学突围:A-29P如何在回音与噪声的双重围剿中“猎杀“纯净人声
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回声消除·语音模组·远扬拾音
LCG元3 小时前
STM32 RS485 Modbus RTU通信系统设计:从协议解析到工程实战
stm32·单片机·嵌入式硬件
qasxc785634 小时前
杰理蓝牙串口打印调试
单片机·嵌入式硬件
Ameilide14 小时前
51单片机学习 day1
嵌入式硬件·学习·51单片机
sramdram18 小时前
MCU微控制器OA打印机方案
单片机·嵌入式硬件·mcu·mcu微控制器
天天爱吃肉821819 小时前
【电源拆解:跟着问答逐一认识开关适配器PCB元器件】
大数据·人工智能·python·功能测试·嵌入式硬件·汽车