LVGL第一篇-了解lvgl显示原理以及使用C++移植

一、引言

在当今嵌入式系统与图形界面开发的广阔领域中,轻量级图形库 LVGL(Light and Versatile Graphics Library)恰似一颗璀璨耀眼的明星,正日益受到开发者们的热烈推崇与追逐。它以小巧精致之姿、高效卓越之能以及丰富多元之功能,为各类设备赋予了强大无比的图形显示实力。本文将深入探寻 LVGL 的显示原理,同时详细介绍如何运用 C++进行移植,引领开发者踏上 LVGL 的精彩征程。

二、LVGL 显示原理

  1. 分层架构

    • LVGL 采用了极为精妙的分层架构设计,主要涵盖以下几个层次:
      • 驱动层:此层与底层硬件紧密交互,承担着控制显示屏、读取输入设备等重要任务。通常情况下,这一层需要依据具体的硬件平台进行精心适配。
      • 核心层:这里蕴含着 LVGL 的核心功能,诸如对象管理、事件处理以及动画引擎等。作为 LVGL 的核心部分,它提供了极为丰富的图形绘制与交互功能。
      • 应用层:开发者在这一层精心构建属于自己的图形界面,通过调用 LVGL 的 API 来创建诸如按钮、标签、图表等各式各样的对象。
  2. 绘制机制

    • LVGL 的绘制机制基于“脏矩形”(Dirty Rectangle)技术。当某个对象的状态发生变化时,LVGL 仅仅重新绘制该对象所在的矩形区域,而非整个屏幕。如此一来,在处理复杂界面时,能够大幅提高绘制效率。
  3. 事件处理

    • LVGL 借助事件驱动的方式来处理用户输入和系统事件。当用户触摸屏幕、按下按钮或者发生其他事件时,LVGL 会将相应的事件传递给应用程序进行处理。开发者可以通过注册事件回调函数来响应各种丰富多彩的事件。

三、LVGL 运行机制

关于 LVGL 在 main.c 中的初始化

在 LVGL 的程序运行入口 main.c 中,首先会调用 lv_init()函数来初始化 LVGL(Light and Versatile Graphics Library)图形库。此函数执行一系列重要操作,包括设置全局变量、初始化内部数据结构以及加载配置等,从而为后续对 LVGL 的使用做好充分准备。

硬件抽象层初始化

接着,调用 hal_init()函数以初始化 LVGL 所需的硬件抽象层。该函数会依据具体的硬件平台,进行显示屏的初始化、输入设备的配置以及设置系统时钟(tick)等操作。这样能够确保 LVGL 与底层硬件之间进行正确的交互。

以下是 main.c 的代码示例:

int main(int argc, char **argv)
{(void)argc; /*Unused*/(void)argv; /*Unused*//*Initialize LVGL*/lv_init();/*Initialize the HAL (display, input devices, tick) for LVGL*/hal_init();/*处理定时器事件:检查和执行已注册的定时器回调函数,实现定时任务的触发。例如,可以用于动画的更新、周期性的任务执行等。处理动画更新:如果有正在运行的动画,这个函数会更新动画的状态,确保动画的平滑过渡。分发用户输入事件:如果有用户输入(如触摸屏幕、按下按钮等),将这些事件分发给相应的对象进行处理。 */while (1){/* Periodically call the lv_task handler.* It could be done in a timer interrupt or an OS task too.*/lv_timer_handler();usleep(5 * 1000);}return 0;
}

使用 lvgl 绘制一个按钮的官网样例代码如下:

lv_obj_t *srceen = lv_scr_act();
lv_obj_t * btn = lv_btn_create(srceen);    
lv_obj_set_pos(btn, 10, 10);                            
lv_obj_set_size(btn, 120, 50);                          
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_ALL, NULL);
lv_obj_t * label = lv_label_create(btn);     
lv_label_set_text(label, "Button");                     
lv_obj_center(label);

在这里插入图片描述

绘制步骤如下:

  1. 获取当前显示屏幕对象句柄。
  2. 调用 lvgl 函数将对象绘制到屏幕上。
  3. 设置组件之间的相对位置,左上角为原点。
  4. 还可以为按钮添加各种事件以及处理函数处理。

由于 lvgl 组件编码难度较高,并且效率也比较低下,在实际开发中从 lvgl 的函数中去实现一个组件的代码量和时间比较多,因此需要进行一个有效的封装。在参考现有的开源仓库中,找到了一个比较完善的基于 C++封装项目 lvglpp。将该项目引入代码中,就能实现一套类似于 QWidget 界面开发方式。

项目源码地址获取:

git clone https://github.com/vpaeder/lvglpp.git

三、引入 lvglpp 到 lvgl

将 lvglpp 放在项目同 lvgl 下面,如下图所示:

在这里插入图片描述

在项目主的 CMakeLists.txt 里面引入 lvglpp 编译模块,如下图所示:

在这里插入图片描述

在这里插入图片描述

基于 lvglpp 实现 led 组件,示例代码如下:

Object root = Object(lv_scr_act(), false);
static auto led1 = Led(root);
led1.align(LV_ALIGN_CENTER, -80, 0);
led1.off();/*Copy the previous LED and set a brightness*/
static auto led2 = Led(root);
led2.align(LV_ALIGN_CENTER, 0, 0);
led2.set_brightness(150);
led2.set_color(palette::main(Color::Red));/*Copy the previous LED and switch it ON*/
static auto led3 = Led(root);
led3.align(LV_ALIGN_CENTER, 80, 0);
led3.on();auto event_cb = [](Event &e) {if(led3.get_brightness() == LV_LED_BRIGHT_MIN) {led3.on();} else {led3.off();}
};led3.add_event_cb(event_cb, LV_EVENT_CLICKED);

在这里插入图片描述

其中创建了 3 个 led 组件,并且给 led3 绑定了一个点击函数,用来改变 led 灯的状态。

总结

lvgl 是一个比较适合嵌入式设备的图形框架。通过封装,可以将复杂的底层函数调用转化为更加直观、易用的接口,极大地提高了开发效率。开发者不再需要深入钻研底层代码的实现细节,而是能够以更简洁的方式构建出精美的图形界面。同时,封装也降低了开发难度,使得即使是经验相对不足的开发者也能轻松上手,快速开发出高质量的嵌入式图形界面应用。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149462.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Qt_事件的介绍

目录 1、理解事件 2、处理事件QEvent 3、键盘事件QKeyEvent 4、鼠标事件QMouseEvent 4.1 鼠标点击事件 4.2 鼠标释放事件 4.3 鼠标移动事件 5、滚轮事件QWheelEvent 6、定时器事件QTimerEvent 7、窗口事件QMoveEvent 8、事件分发器event 9、事件过滤器even…

峟思助力堤防工程安全:构建多功能防洪屏障

堤防工程,作为水利建设中至关重要的防护体系,不仅守护着江河、湖泊及滨海区域的安全,更是确保人民生命财产安全的坚固防线。在现代社会,随着技术的进步与安全意识的提升,堤防工程不仅限于传统的防洪功能,更…

CVPR最牛图像评价算法!

本文所涉及所有资源均在 传知代码平台可获取。 目录 概述 一、论文思路 1.多任务学习框架: 2.视觉-语言对应关系: 3.动态损失权重: 4.模型优化和评估: 二、模型介绍 三、详细实现方法 1.图像编码器和语言编码器(Image…

Solidity语言:重点学习Solidity编程语言,这是EVM上最常用的智能合约语言。

Solidity是一种面向合约的编程语言,用于在以太坊虚拟机(EVM)上编写智能合约。它是Solidity开发者在以太坊平台上创建智能合约的主要选择之一。 学习Solidity的重点包括以下几方面: 语法和数据类型:学习Solidity的基本语法、数据类型、变量声明和函数定义等。 智能合约:了…

刷完这个笔记,17K不能再少了....

大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…

cobaltstrike之execute-assembly内存加载—后渗透利用

通过execute-assembly内存加载来执行文件,从而避免后渗透中被杀毒软件静态报毒,使更多的工具能够继续利用,常见的方式有权限维持,代理上线等操作 远程bin文件加载 首先尝试远程加载bin文件 使用项目https://github.com/shanekha…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

视频字幕生成:分享6款专业易操作的工具,让创作更简单!

​视频字幕如何添加?日常剪辑Vlog视频时,就需要给视频添加上字幕了。字幕是一个比较重要的元素,它不仅可以帮助听力受损或语言障碍的人士理解内容,还可以让你的视频更加易于理解和吸引观众。 那么如何实现视频字幕生成&#xff0c…

Linux 进程与进程状态

目录 1.进程。 1.进程的概念 2.并行和并发 3.并行和并发的区别: 4.PCB(程序控制块) 5.进程组与会话。 6.进程状态。 1.进程。 1.进程的概念 进程是操作系统进行资源分配和调度的一个独立单位。每个进程都运行在操作系统的控制之下&…

8.进销存系统(基于springboot的进销存系统)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 MySQL环境配置 2.4 idea介绍 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 数据库…

一些做题中总结的零散的python函数的简单运用

输出保留两位数的小数 将16进制(可修改)的数进制转换成十进制并输出 大小写转化,第一个是搞成全部大写的,第二个高成全部小写的,最后一个是搞成第一个是大写的其他全部是小写的 将这个n的两边空格去掉 使用print(n,end…

叶国富学得会胖东来吗?

“大家都看不懂就对了,如果都看得懂我就没有机会了。”昨晚,实体零售迎来一则重磅消息,名创优品获得了全国第二大连锁超市永辉超市的大股东身份。在资本市场负反馈的压力下,名创优品创始人叶国富有了上述回应。 消息公布后&#x…

2.以太网

局域网 局域网: Local Area Networks (LAN) 网络大小分类 局域网园区网(可以理解为企业网)城域网 广域网是一个网络连接的技术,并非多大范围的网络 网关 为局域网内的用户提供了一扇门,通过网关可以访问到别的网络。这个门,就叫网关 以…

解决你的IDE在使用的时候测试单元@Test在创建Scanner对象是键盘键入不了的问题;

插播一条快讯,我在我的ide中新创建 了project后发现我的测试单元不好使了,即 import org.junit.Test; 这个包在创建Scanner对象接受键盘时,控制台输入时没有任何反应,键入不了了,我的问题出现原因可能是我导入了JDBC…

BitSet-解决数据压缩问题

一、问题引入 假设QQ音乐服务器上有9000万首音乐,用户按照歌名来搜索歌曲,如何使得满足这一需求所需的数据占用的内存空间最小以及用户搜索歌曲速度更快 二、分析问题 1、为了满足使得数据占用的内存更小,可以采用映射的思路,按…

【2024W35】肖恩技术周刊(第 13 期):肉,好次!

周刊内容: 对一周内阅读的资讯或技术内容精品(个人向)进行总结,分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率,每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

【C++算法】链表

知识总结 常用技术: 1.画图!!——>直观形象便于理解 2.引入虚拟”头结点“ 便于处理边界情况方便对链表操作 3.不要吝啬空间,大胆定义变量 4.快慢双指针——判环、找链表中环的入口、找链表中倒数第n个节点 链表中的常用…

移动数组中数字的方法(c语言)

1.移动一维数组中的内容;若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。 例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。 移动后,一维数组中的内容应为:5,6,7,8…

融会贯通记单词,绝对丝滑,一天轻松记几百

如果我将flower(花)、flat(公寓)、floor(地板)、plane(飞机)几个单词放在一起,你会怎么来记忆这样的一些单词呢? 我们会发现,我们首先可以将plane去掉,因为它看上去几乎就是一个异类。这样,我们首先就可以将…