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

news2024/9/25 8:24:48

一、引言

在当今嵌入式系统与图形界面开发的广阔领域中,轻量级图形库 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.coloradmin.cn/o/2163027.html

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

相关文章

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

读构建可扩展分布式系统:方法与实践14流处理系统

1. 流处理系统 1.1. 时间就是金钱 1.1.1. 从数据中提取有价值的知识和获得洞见的速度越快,就能越快地响应系统所观察的世界的变化 1.1.2. 信用卡欺诈检测 1.1.3. 网络安全中异常网络流量的捕获 1.1.4. 在支持GPS的驾驶应用程序中进行的实时路线规划 1.1.5. 社交…

函数计算 FC:首发 GPU 极速模式,更弹性、更降本

函数计算 FC 作为轻量灵活、事件驱动的全托管计算服务,一直以来以弹得更快、粒度更细、成本更低为广大开发者与企业客户所青睐。 2024 云栖大会上,函数计算 FC 为 AI 加码,首发 GPU 极速模式, 让 GPU 可以更弹性、更便宜。 阿里云…

【车联网安全】车端知识调研

一、CAN总线: 1、定义: CAN 总线相当于汽车的神经网络,连接车内各控制系统,其通信采用广播机制,各连接部件均可收发控制消息,通信效率高,可确保通信实时性。当前市场上的汽车至少拥有一个CAN网络&#xff0…

Java集合(下)

Map(重要) HashMap和Hashtable的区别 线程是否安全: HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap …

也遇到过 PIL Image “image file is truncated“的问题

背景前言 属于活久见系列,最近工作上遇了该问题! 背景:前端 APP使用 Android CameraX 的接口,拍摄并上传图片,然后 Python后端服务对图片裁剪与压缩处理。后端服务处理图片时有遇到image file is truncated的情况。还…

Spring AOP实现原理-动态代理

目录 代理的基础概念 示例1:静态代理(场景:客户通过中介租房东的房子) 示例2:JDK动态代理实现房东、中介出租房屋 示例3:CGLib动态代理实现房东出租房屋 示例4:观察Spring IOC容器中代理对象…

One-Class Classification: A Survey

I. INTRODUCTION 1.定义 OCC 是一种特殊的多类分类,训练数据仅来自单个正类。目标是学习表示和/或分类器,以便在推理过程中识别正类查询。 2.应用 异常图像检测、异常事件检测、生物识别(活体检测、反诈骗) 3.与其他领域的比…

Python连接Kafka收发数据等操作

目录 一、Kafka 二、发送端(生产者) 三、接收端(消费者) 四、其他操作 一、Kafka Apache Kafka 是一个开源流处理平台,由 LinkedIn 开发,并于 2011 年成为 Apache 软件基金会的一部分。Kafka 广泛用于构…

在Java中,关于final、static关键字与方法的重写和继承【易错点】

在Java中,关于final、static关键字与方法的重写和继承【易错点】 1.final方法不能被重写2.static方法不是重写,而是遮蔽3.final与static的组合4.final与继承5.static与继承 1.final方法不能被重写 如果父类中的方法被声明为final,那么这个方法…

开源音频处理项目推荐【持续更新】

Audacity 介绍:Audacity是一款功能强大的开源音频编辑软件,适用于多种操作系统,包括Windows、macOS和Linux。它支持多轨音频编辑、录制,并且提供了丰富的音频处理功能,如剪切、复制、粘贴、混音、降噪等 。Audacity的…

基于Python+flask+MySQL+HTML的全国范围水质分析预测系统,可视化用echarts,预测算法随机森林

1绪论 近年来,水质监测系统的进步显著,这在全球环保意识不断提升的背景下尤为明显。大量资源被投入到水质监测技术的研发和应用中,以不断优化监测效能。水资源的保护及健康环境的维护,这种趋势旨在提升人们生活质量,确…

微软宣称其新工具可纠正人工智能幻觉 但专家依然对此表示怀疑

人工智能经常胡言乱语,微软现在说它有办法解决这个问题,但我们有理由对此持怀疑态度。微软今天发布了一项名为"更正"(Correction)的服务,它可以自动修改人工智能生成的与事实不符的文本。Correction 首先会标…

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…

8.隐私与安全 - 使用ChatGPT时的注意事项【8/10】

引言 在数字时代,隐私和安全已成为全球关注的焦点。随着技术的发展,个人信息和数据的收集、存储、处理和传输变得越来越普遍,这既带来了便利,也带来了风险。保护个人隐私和数据安全不仅是法律的要求,也是维护公众信任…

solidwork中查看装配体螺丝或零件

假设我的PETG打印件到了,想知道这个螺丝的型号,怎么办 解决办法: 第一步先看看有没有固定的字样 如果固定的话是不行的。需要这样做: 把这里给关了 接下来第二步,点击你想查看的螺丝 然后就会跳到零件图 可以看到直径…

Cloudflare为网站添加AI审计 可检查AI爬虫何时抓取和抓取频次以及直接屏蔽爬虫

网络服务提供商 Cloudflare 宣布即日起为所有网站 (包括免费托管的网站) 带来 AI 审计功能,该功能目前处于测试阶段,可以分析 AI 公司的爬虫和抓爬数据。新的 AI 审计工具 (Cloudflare AI Audit) 主要提供 AI 公司的爬虫何时到网站来抓取数据、抓取的数据…

Unity 热更新(HybridCLR+Addressable)-资源更新

七、资源更新 创建一个叫Aot的文件夹,用来存放不会热更新的资源 这个修改为第三个 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b8be5e6465184ad5ad6173c6870bfa06.png 这个是更新 在更新或者打包时遇到端口被占的报错,不用理会&#xf…

二、认识大模型

认识大模型 什么是大模型?发展趋势AGI是不是泡沫大模型对比【时效】大模型特点大模型技术原理向量化除了向量化,大模型还具有特征提取特点 总结结语 什么是大模型? 大模型是大规模语言模型(Large Language Model)的简…

mysql如何替换数据库所有表中某些字段含有的特定值

目录 背景查询所有表名查询表的所有字段过虑特征字段替换字段中含有的特定值 背景 公司的测试域名更换了,导致存放在数据库中的域名也要跟着替换,当然把域名存放在数据库表中是不科学的,不建议这样做,但公司的同事就这样做了&…