0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发第1个LVGL程序与实现按键操作

瑞萨MCU小百科 来源: 瑞萨MCU小百科 2025-01-07 13:49 次阅读

12.2.2 编译程序

执行如下命令编译:

左右滑动查看完整内容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ cd lv_port_linux_frame_buffer-release-v9.0
$ mkdir build
$ cd build 
$ cmake .. # 如果提示没有 cmake 的话,执行:sudo apt install cmake
$ make -j 16

执行完毕后,在源码根目录下生成了bin子目录,里面有可执行程序“main”:

左右滑动查看完整内容

$ ls ../bin/
main
$ file ../bin/main
../bin/main: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 
3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, wi
th debug_info, not stripped

12.2.3 上机运行

把编译出来的可执行程序main复制到开发板/mnt目录:

左右滑动查看完整内容

$ scp ../bin/main root@192.168.5.9:/mnt

把系统的GUI程序关闭:

左右滑动查看完整内容

$ systemctl stop myir.service # 现在停止,下次开机重新启动

执行第1个LVGL程序:

左右滑动查看完整内容

$ /mnt/main

可以看到如下界面:

e8daba30-ccac-11ef-9310-92fbcf53809c.png

12.3 实现按键操作

本节课程将开发一个LVGL程序,它显示2个按钮(button):第1个名为“Click me”,第2个名为“Reset”;并显示一个label。当用户点击第1个按钮时,label显示的计数值加一;当用户点击第2个按钮时,label显示的计数值复位为0。

本节源码位于如下目录(已修改好):

e90ba014-ccac-11ef-9310-92fbcf53809c.png

12.3.1 编写程序

在“第1个LVGL程序”的基础上修改代码。

1. 增加鼠标的支持

修改“lv_config.h”,把宏“LV_USE_EVDEV”定义为1,如下所示:

左右滑动查看完整内容

889 #define LV_USE_EVDEV 1

修改“main.c”,增加,代码如下:

左右滑动查看完整内容

60 int main(void)
61 {
62 lv_init();
63
64 /*Linux frame buffer device init*/
65 lv_display_t * disp = lv_linux_fbdev_create();
66 lv_linux_fbdev_set_file(disp, "/dev/fb0");
67
68 LV_IMG_DECLARE(mouse_cursor_icon)
69 lv_obj_t * cursor_obj = lv_img_create(lv_layer_sys()); /*Create an image objec
t for the cursor */
70 lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image sourc
e*/
71 lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1
");
72 lv_indev_set_cursor(indev, cursor_obj);
73
74 /*Create a Demo*/
75 //lv_demo_widgets();
76 //lv_demo_widgets_start_slideshow();
77
78 button_test();
79
80 /*Handle LVGL tasks*/
81 while(1) {
82 lv_timer_handler();
83 usleep(5000);
84 }
85
86 return 0;
87 }

第68行,声明鼠标指针的图案,这就相当于如下语句(mouse_curson_icon在“mouse_cursor_icon.c”中定义):

左右滑动查看完整内容

extern const lv_image_dsc_t mouse_cursor_icon;

第69行,创建一个“image object”。

第70行,设置“image object”的“image”,即:要显示一个“image object”,需要设置它对应的图片。

第71行,创建一个输入设备,它跟某个设备节点对应。注意:需要接上鼠标,确定鼠标对应的设备节点。方法为:接上鼠标后,执行如下命令(使用hexdump逐个测试设备节点,执行hexdump后,移动鼠标,有数据打印的话就找到了设备节点):

左右滑动查看完整内容

root@myir-remi-1g:~# ls /dev/input/event*
/dev/input/event0 /dev/input/event1 /dev/input/event1 
/dev/input/event3 /dev/input/event4
root@myir-remi-1g:~#
root@myir-remi-1g:~# hexdump /dev/input/event2
0000000 0329 b493 0000 0000 9c6d 0008 0000 0000
0000010 0002 0000 0001 0000 0329 b493 0000 0000

第72行,输入设备和前面的“image object”建立联系。以后移动鼠标时,就可以显示对应的光标了。

第75~76行:注释掉,我们不使用这个界面。

第78行,运行我们的测试函数。

2. 创建按钮及label

main函数里调用了“button_test”函数,它里面创建了3个按钮,代码如下:

左右滑动查看完整内容

31 static void button_test(void)
32 {
33 lv_obj_t * btn_increment;
34 lv_obj_t * btn_reset;
35 lv_obj_t * label_btn_text;
36 lv_obj_t * label_value;
37
38 // Increment button
39 btn_increment = lv_button_create(lv_screen_active());
40 lv_obj_align(btn_increment, LV_ALIGN_CENTER, -100, 0);
41
42 label_btn_text = lv_label_create(btn_increment);
43 lv_label_set_text(label_btn_text, "Click me");
44
45 // Reset button
46 btn_reset = lv_button_create(lv_screen_active());
47 lv_obj_align(btn_reset, LV_ALIGN_CENTER, 100, 0);
48
49 label_btn_text = lv_label_create(btn_reset);
50 lv_label_set_text(label_btn_text, "Reset");
51
52 // Value label
53 label_value = lv_label_create(lv_screen_active());
54 lv_obj_align(label_value, LV_ALIGN_CENTER, 0, 0);
55
56 lv_obj_add_event_cb(btn_increment, btn_event_handler, LV_EVENT_CLICKED, label_
value);
57 lv_obj_add_event_cb(btn_reset, btn_event_handler, LV_EVENT_CLICKED, label_valu
e);
58 }
59

第39~43行,创建第1个按钮“Click me”。

其中,第39行创建button,第40行设置对齐方式,第42行创建按钮的label,第43行设置label的值。

第46~50行,创建第2个按钮“Reset”。

其中,第46行创建button,第47行设置对齐方式,第49行创建按钮的label,第50行设置label的值。

第53~54行,创建一个label。

其中,第53行创建label,第54行设置对齐方式。

第56行,为第1个按钮设置回调函数。

第57行,为第2个按钮设置回调函数。

3. 增加按钮回调函数

按钮回调函数为“btn_event_handler”,代码如下:

左右滑动查看完整内容

08 static void btn_event_handler(lv_event_t * e)
09 {
10 lv_event_code_t code = lv_event_get_code(e);
11 lv_obj_t * btn = lv_event_get_target(e);
12 lv_obj_t * label_value = lv_event_get_user_data(e);
13 lv_obj_t * btn_label = lv_obj_get_child(btn, 0);
14 char * label_text = lv_label_get_text(btn_label);
15
16 if(code == LV_EVENT_CLICKED) {
17 if(strcmp(label_text, "Click me") == 0)
18 {
19 LV_LOG_USER("Increment");
20 lv_label_set_text_fmt(label_value, "%d", (atoi(lv_label_get_text(label
_value))+1));
21 }
22 else if(strcmp(label_text, "Reset") == 0)
23 {
24 LV_LOG_USER("Reset");
25 lv_label_set_text(label_value, "0");
26 }
27 }
28 }

第10行,取出输入事件的code,它有这些取值:LV_EVENT_CLICKED、LV_EVENT_RELEASED等。

第11行,获得被点击的图标。

第12行,获得“用户数据”,在前面的第56、57行设置按钮回调函数时设置了“用户数据”,这个用户数据就是用于显示计数值的label。

第13行,获得被点击的图标的label。

第14行,获得被点击的图标的label的值。

第16~21行,如果点击的是“Click me”按钮,则增加label 的计数值。

第22~27行,如果点击的是“Reset”按钮,则复位label的计数值为0。

12.3.2 上机运行

执行如下命令编译:

左右滑动查看完整内容

$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux
$ tar xjf lv_port_linux_frame_buffer_mouse.tar.bz2
$ cd lv_port_linux_frame_buffer_mouse
$ mkdir build
$ cd build 
$ cmake .. # 如果提示没有 cmake 的话,执行:sudo apt install cmake
$ make -j 16

执行完毕后,在源码根目录下生成了bin子目录,里面有可执行程序“main”:

左右滑动查看完整内容

$ ls ../bin/
main
$ file ../bin/main
../bin/main: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 
3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, wi
th debug_info, not stripped

把编译出来的可执行程序main复制到开发板/mnt目录:

左右滑动查看完整内容

$ scp ../bin/main root@192.168.5.9:/mnt

把系统的GUI程序关闭:

左右滑动查看完整内容

$ systemctl stop myir.service # 现在停止,下次开机重新启动

执行程序:

$ /mnt/main

如果没有接入鼠标的话,程序会出错,如下所示:

e92f4e92-ccac-11ef-9310-92fbcf53809c.png

正常的界面如下(点击“Click me”数值增加1,点击“Reset”数值变为0):

e95f9692-ccac-11ef-9310-92fbcf53809c.png

12.4 实现开机运行

修改板子的“/usr/bin/start.sh”,内容如下:

左右滑动查看完整内容

#!/bin/sh -e
echo "Start MYiR HMI V2.0..."
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_CONSOLEDEVICE=none
export QT_QPA_FB_TSLIB=1
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1
echo 7 > /sys/class/backlight/backlight/brightness
sleep 5
# 【警告】这一行需要手动敲上去,不可复制粘贴,否则不生效!作用:去掉屏幕左上角的光标显示
echo -e "�33[?25l" > /dev/tty1 
echo 1 > /proc/sys/kernel/printk # 降低内核打印等级,这样屏幕上就不用有内核信息输出
/mnt/main & # 你自己的程序
#/home/mxapp2 -platform linuxfb & # 注释掉
#/usr/share/myir_test/age.sh & # 注释掉
exit 0

然后重启即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源码
    +关注

    关注

    8

    文章

    646

    浏览量

    29274
  • 命令
    +关注

    关注

    5

    文章

    687

    浏览量

    22053
  • 编译程序
    +关注

    关注

    0

    文章

    13

    浏览量

    4142
  • LVGL
    +关注

    关注

    1

    文章

    87

    浏览量

    2994

原文标题:开发第1个LVGL程序与实现按键操作 - RZ MPU工业控制教程连载(46)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    按键操作的驱动设计与实现

    按键在我们的项目中是经常使用到的组件。一般来说,我们都是在用到按键时直接针对编码,但这样每次都做很多重复性的工作。所以在这里我们考虑做一般性抽象得到一可应用于按键
    的头像 发表于 12-08 10:57 1499次阅读
    <b class='flag-5'>按键</b><b class='flag-5'>操作</b>的驱动设计与<b class='flag-5'>实现</b>

    LVGL开发入门教程

    LVGL(Light and Versatile Graphics Library)是一开源的嵌入式图形库,由Gábor Kiss-Vámosi于2016年创建,遵守MIT协议。目前由来自世界各地的志愿者共同维护和开发
    的头像 发表于 01-03 15:23 558次阅读
    <b class='flag-5'>LVGL</b><b class='flag-5'>开发</b>入门教程

    如何控制两按键实现按键先按后,2按键才能被按下

    简单讲,必须一按键先动作后,2按键才能被按下,否则2
    发表于 09-26 07:19

    LVGL的输入设备API对接

    使用外部物理按键进行操作,那么请确保你实现了读按键状态的驱动)。LVGL有三大种需要对接的APIy显示API(教程一已
    发表于 01-18 10:12

    Purple Pi R1 LVGL使⽤参考

    LVGL是⼀轻量级的,开源的图形库。本⽂详细介绍了如何在Purple Pi开发板上运⾏lvgl应⽤,同时介绍了如何使⽤著名的LVGL ID
    发表于 09-06 15:25

    lvgl外部按键驱动问题

    我使用lvgl作为屏幕的gui,但是屏幕触摸驱动跟按键驱动都有,我触摸驱动可以直接添加进lvgl里面,按键的功能不局限于屏幕的控制,我应该怎么加进去,或者外部使用的话怎么能让
    发表于 10-07 09:52

    HL开发板独立按键操作方法学习程序

    HL开发板【实验11】独立按键操作方法,单片机学习程序,很好的学习资料。
    发表于 09-01 16:11 5次下载
    HL<b class='flag-5'>开发</b>板独立<b class='flag-5'>按键</b><b class='flag-5'>操作</b>方法学习<b class='flag-5'>程序</b>

    使用单片机C语言实现独立按键检测与矩阵键盘操作的资料和程序

    所有的电子产品几乎到涉及到按键操作。所以微控制器是如何识别一按键是否被按下,按下后又该如何做出反应,又如何防止按键抖动呢?更深入一点,微控
    发表于 07-16 17:39 2次下载
    使用单片机C语言<b class='flag-5'>实现</b>独立<b class='flag-5'>按键</b>检测与矩阵键盘<b class='flag-5'>操作</b>的资料和<b class='flag-5'>程序</b>

    使用单片机实现1独立按键控制LED的C语言程序免费

    本文档的主要内容详细介绍的是使用单片机实现1独立按键控制LED的C语言程序免费。
    发表于 11-19 18:10 21次下载

    使用单片机实现1独立按键控制LED状态转换的C语言程序免费下载

    本文档的主要内容详细介绍的是使用单片机实现1独立按键控制LED状态转换的C语言程序免费下载。
    发表于 11-23 17:45 26次下载

    全面解读目前LVGL的应用小知识

    概述 本文介绍目前LVGL的应用小知识,希望对采用MCU设计UI界面的用户有所启发,开发出界面更友好的消费品或者工业产品,造福大众。 01. LVGL系统架构 LVGL系统框架 应用
    的头像 发表于 06-04 12:01 3w次阅读
    全面解读目前<b class='flag-5'>LVGL</b>的应用小知识

    RT-Thread大会:如何实现4按键的手势组合?

    我有基于一电极的非触摸程序,如何实现4按键的手势组合?   通过4路波形判断手势   即使在在一一
    的头像 发表于 05-27 11:01 1162次阅读
    RT-Thread大会:如何<b class='flag-5'>实现</b>4<b class='flag-5'>个</b><b class='flag-5'>按键</b>的手势组合?

    【开鸿智谷NiobeU4开发板免费试用体验】lvgl移植及实现ADC按键状态显示

    智谷NiobeU4开发板免费试用体验】移植LVGL  本文参考成功移植,实现按键按下sw4显示SW4 Pressed松开显示SW4 Release,整理踩坑经验分享如下。
    的头像 发表于 10-14 11:27 1309次阅读
    【开鸿智谷NiobeU4<b class='flag-5'>开发</b>板免费试用体验】<b class='flag-5'>lvgl</b>移植及<b class='flag-5'>实现</b>ADC<b class='flag-5'>按键</b>状态显示

    stm32单片机如何实现按键切换两程序

    stm32单片机如何实现按键切换两程序? 作为一款功能强大的微控制器,STM32单片机可以支持多种应用场景,其中一
    的头像 发表于 09-14 14:22 6196次阅读

    LVGL开发指南介绍

    电子发烧友网站提供《LVGL开发指南介绍.pdf》资料免费下载
    发表于 09-09 10:24 16次下载