开发第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)

更多精彩,敬请关注

需要产品及方案支持

请扫码登记



评论 (0)
  • 一、技术背景与市场机遇在智能家居高速发展的今天,用户对家电设备的安全性、智能化及能效表现提出更高要求。传统取暖器因缺乏智能感知功能,存在能源浪费、安全隐患等痛点。WTL580-C01微波雷达感应模块的诞生,为取暖设备智能化升级提供了创新解决方案。该模块凭借微波雷达技术优势,在精准测距、环境适应、能耗控制等方面实现突破,成为智能取暖器领域的核心技术组件。二、核心技术原理本模块采用多普勒效应微波雷达技术,通过24GHz高频微波信号的发射-接收机制,实现毫米级动作识别和精准测距。当人体进入4-5米有效
    广州唯创电子 2025-04-23 08:41 123浏览
  • 一、行业背景与市场需求高血压作为全球发病率最高的慢性病之一,其早期监测与管理已成为公共卫生领域的重要课题。世界卫生组织数据显示,全球超13亿人受高血压困扰,且患者群体呈现年轻化趋势。传统血压计因功能单一、数据孤立等缺陷,难以满足现代健康管理的需求。在此背景下,集语音播报、蓝牙传输、电量检测于一体的智能血压计应运而生,通过技术创新实现“测量-分析-管理”全流程智能化,成为慢性病管理的核心终端设备。二、技术架构与核心功能智能血压计以电子血压测量技术为基础,融合物联网、AI算法及语音交互技术,构建起多
    广州唯创电子 2025-04-23 09:06 134浏览
  •   陆地边防事件紧急处置系统平台解析   北京华盛恒辉陆地边防事件紧急处置系统平台是整合监测、预警、指挥等功能的智能化综合系统,致力于增强边防安全管控能力,快速响应各类突发事件。以下从系统架构、核心功能、技术支撑、应用场景及发展趋势展开全面解读。   应用案例   目前,已有多个陆地边防事件紧急处置系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润陆地边防事件紧急处置系统。这些成功案例为陆地边防事件紧急处置系统的推广和应用提供了有力支持。   一、系统架构   感知层:部
    华盛恒辉l58ll334744 2025-04-23 11:22 110浏览
  •   无人机结构仿真与部件拆解分析系统平台解析   北京华盛恒辉无人机结构仿真与部件拆解分析系统无人机技术快速发展的当下,结构仿真与部件拆解分析系统平台成为无人机研发测试的核心工具,在优化设计、提升性能、降低成本等方面发挥关键作用。以下从功能、架构、应用、优势及趋势展开解析。   应用案例   目前,已有多个无人机结构仿真与部件拆解分析系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机结构仿真与部件拆解分析系统。这些成功案例为无人机结构仿真与部件拆解分析系统的推广和应用提
    华盛恒辉l58ll334744 2025-04-23 15:00 146浏览
  • 故障现象一辆2016款奔驰C200L车,搭载274 920发动机,累计行驶里程约为13万km。该车组合仪表上的防侧滑故障灯、转向助力故障灯、安全气囊故障灯等偶尔异常点亮,且此时将挡位置于R挡,中控显示屏提示“后视摄像头不可用”,无法显示倒车影像。 故障诊断用故障检测仪检测,发现多个控制单元中均存储有通信类故障代码(图1),其中故障代码“U015587 与仪表盘的通信存在故障。信息缺失”出现的频次较高。 图1 存储的故障代码1而组合仪表中存储有故障代码“U006488 与用户界
    虹科Pico汽车示波器 2025-04-23 11:22 77浏览
  •   电磁频谱数据综合管理平台系统解析   一、系统定义与目标   北京华盛恒辉电磁频谱数据综合管理平台融合无线传感器、软件定义电台等前沿技术,是实现无线电频谱资源全流程管理的复杂系统。其核心目标包括:优化频谱资源配置,满足多元通信需求;运用动态管理与频谱共享技术,提升资源利用效率;强化频谱安全监管,杜绝非法占用与干扰;为电子战提供频谱监测分析支持,辅助作战决策。   应用案例   目前,已有多个电磁频谱数据综合管理平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁频谱数
    华盛恒辉l58ll334744 2025-04-23 16:27 141浏览
  • 前言本文主要演示基于TL3576-MiniEVM评估板HDMI OUT、DP 1.4和MIPI的多屏同显、异显方案,适用开发环境如下。Windows开发环境:Windows 7 64bit、Windows 10 64bitLinux开发环境:VMware16.2.5、Ubuntu22.04.5 64bitU-Boot:U-Boot-2017.09Kernel:Linux-6.1.115LinuxSDK:LinuxSDK-[版本号](基于rk3576_linux6.1_release_v
    Tronlong 2025-04-23 13:59 97浏览
  • 在科技飞速发展的当下,机器人领域的每一次突破都能成为大众瞩目的焦点。这不,全球首届人形机器人半程马拉松比赛刚落下帷幕,赛场上的 “小插曲” 就掀起了一阵网络热潮。4月19日,北京亦庄的赛道上热闹非凡,全球首届人形机器人半程马拉松在这里激情开跑。20支机器人队伍带着各自的“参赛选手”,踏上了这21.0975公里的挑战之路。这场比赛可不简单,它将机器人放置于真实且复杂的动态路况与环境中,对机器人在运动控制、环境感知和能源管理等方面的核心技术能力进行了全方位的检验。不仅要应对长距离带来的续航挑战,还要
    用户1742991715177 2025-04-22 20:42 94浏览
  •   后勤实验仿真系统平台深度解析   北京华盛恒辉后勤实验仿真系统平台依托计算机仿真技术,是对后勤保障全流程进行模拟、分析与优化的综合性工具。通过搭建虚拟场景,模拟资源调配、物资运输等环节,为后勤决策提供数据支撑,广泛应用于军事、应急管理等领域。   应用案例   目前,已有多个后勤实验仿真系统平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润后勤实验仿真系统平台。这些成功案例为后勤实验仿真系统平台的推广和应用提供了有力支持。   一、核心功能   (一)后勤资源模拟
    华盛恒辉l58ll334744 2025-04-23 15:39 110浏览
  •   复杂电磁环境模拟系统平台解析   一、系统概述   北京华盛恒辉复杂电磁环境模拟系统平台是用于还原真实战场或特定场景电磁环境的综合性技术平台。该平台借助软硬件协同运作,能够产生多源、多频段、多体制的电磁信号,并融合空间、时间、频谱等参数,构建高逼真度的电磁环境,为电子对抗、通信、雷达等系统的研发、测试、训练及评估工作提供重要支持。   应用案例   目前,已有多个复杂电磁环境模拟系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润复杂电磁环境模拟系统。这些成功案例为复杂电
    华盛恒辉l58ll334744 2025-04-23 10:29 148浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦