开发第1个LVGL程序与实现按键操作-RZMPU工业控制教程连载(46)

瑞萨MCU小百科 2025-01-07 12:01

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), dynamicallylinked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, with 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


可以看到如下界面:



12.3 实现按键操作


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


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


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();6364 /*Linux frame buffer device init*/65 lv_display_t * disp = lv_linux_fbdev_create();66 lv_linux_fbdev_set_file(disp, "/dev/fb0");6768 LV_IMG_DECLARE(mouse_cursor_icon)69 lv_obj_t * cursor_obj = lv_img_create(lv_layer_sys()); /*Create an image object for the cursor */70 lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/71 lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1");72 lv_indev_set_cursor(indev, cursor_obj);7374 /*Create a Demo*/75 //lv_demo_widgets();76 //lv_demo_widgets_start_slideshow();7778 button_test();7980 /*Handle LVGL tasks*/81 while(1) {82 lv_timer_handler();83 usleep(5000);84 }8586 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/event4root@myir-remi-1g:~#root@myir-remi-1g:~# hexdump /dev/input/event20000000 0329 b493 0000 0000 9c6d 0008 0000 00000000010 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;3738 // Increment button39 btn_increment = lv_button_create(lv_screen_active());40 lv_obj_align(btn_increment, LV_ALIGN_CENTER, -100, 0);4142 label_btn_text = lv_label_create(btn_increment);43 lv_label_set_text(label_btn_text, "Click me");4445 // Reset button46 btn_reset = lv_button_create(lv_screen_active());47 lv_obj_align(btn_reset, LV_ALIGN_CENTER, 100, 0);4849 label_btn_text = lv_label_create(btn_reset);50 lv_label_set_text(label_btn_text, "Reset");5152 // Value label53 label_value = lv_label_create(lv_screen_active());54 lv_obj_align(label_value, LV_ALIGN_CENTER, 0, 0);5556 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_value);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);1516 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), dynamicallylinked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, with debug_info, not stripped


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

左右滑动查看完整内容

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


把系统的GUI程序关闭:

左右滑动查看完整内容

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


执行程序:

$ /mnt/main


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


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


12.4 实现开机运行

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

左右滑动查看完整内容

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


然后重启即可。


需要产品及方案支持

请扫码登记


需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/



未完待续


推荐阅读

Modbus RTU客户端及服务器端的编程与实验 - RZ MPU工业控制教程连载(43)


Modbus TCP编程与实验 - RZ MPU工业控制教程连载(44)

LVGL开发入门 - RZ MPU工业控制教程连载(45)

更多精彩,敬请关注

需要产品及方案支持

请扫码登记



评论
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 203浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 90浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 103浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 182浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 83浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 115浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 105浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 69浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 128浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 147浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 149浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦