航芯ACM32G103开发板评测 06 1.28圆形屏幕 LVGL移植

航芯ACM32G103开发板评测 06 1.28圆形屏幕 LVGL移植

软硬件平台

  1. 航芯ACM32G103开发板
  2. 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口 GC9A01驱动芯片
  3. LVGL V8.3.1源码

LVGL

LVGL(Light and Versatile Graphics Library)是一个免费的开源图形库,提供创建具有易 于使用的图形元素、漂亮的视觉效果和低内存占用的嵌入式 GUI。

LVGL 是一款具有丰富的部件,具备高级图形特性,支持多种输入设备, 多国语言和独立于硬件之外等免费的开源图形库。接下来我们来看一下 LVGL 图形用户库的主要特点:

强大的构建块:按钮、图表、列表、滑块、图像等部件。
具有高级图形属性:具有动画、抗锯齿、不透明度、平滑滚动的高级图形。
支持各种输入设备:如触摸、鼠标、键盘、编码器。
支持多语言:UTF-8 编码。
支持多显示器:它可以同时使用多个 TFT 或者单色显示器。
支持多种样式属性:它具有类 CSS 样式的完全可定制的图形元素。
独立于硬件之外:它与任何微控制器或显示器一起使用。
可扩展性:它能够以小内存运行(最低 64 kB 闪存,16 kB RAM 的 MCU)。
支持操作系统、外部存储器和 GPU(不是必需的)。
具有高级图形效果:可进行单帧缓冲区操作。
纯 C 编写: C 语言编写以获得最大的兼容性。

快速移植过程

  1. 在已有的ACM32G103RCT6 TFT 裸机移植LVGL的工程模板上进行修改 添加LVGL源代码文件

    【ACM32G103RCT6】5-基于RGB_TFT裸机移植LVGL

在这里插入图片描述

2.在已有的工程模板上,添加GC9A01驱动屏幕代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.在KEIL添加相关源文件,添加相关路径,删除之前的屏幕驱动文件

在这里插入图片描述
在这里插入图片描述

4.修改lv_port_disp屏幕显示接口文件

在这里插入图片描述

5.添加LCD屏幕初始化函数,绘图绘点函数

/*********************** STATIC FUNCTIONS**********************//*Initialize your display and the required peripherals.*/
static void disp_init(void)
{/*You code here*/LCD_Init();LCD_BLK_SET;//通过IO控制背光亮
}volatile bool disp_flush_enabled = true;/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL*/
void disp_enable_update(void)
{disp_flush_enabled = true;
}/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL*/
void disp_disable_update(void)
{disp_flush_enabled = false;
}/*Flush the content of the internal buffer the specific area on the display*You can use DMA or any hardware acceleration to do this operation in the background but*'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{if(disp_flush_enabled) {/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/  uint16_t x,y;for(y = area->y1; y <= area->y2; y++) {for(x = area->x1; x <= area->x2; x++) {/*Put a pixel to the display. For example:*//*put_px(x, y, *color_p)*/GUI_DrawPoint(x,y,lv_color_to16(*color_p));color_p++;}}}/*IMPORTANT!!!*Inform the graphics library that you are ready with the flushing*/lv_disp_flush_ready(disp_drv);
}

基本上就完成了一个屏幕与LVGL的对接,当你换其他的屏幕是基本上也是这样子的操作,前提是屏幕驱动文件一定要适配成功。

案例测试

官方案例demo函数 添加官方demo代码,打开LV_USE_DEMO_WIDGETS宏定义

在这里插入图片描述
在这里插入图片描述

#include "main.h"  #include "lvgl_timer.h"
LoopFunction loopFunction[MAX_INIT_FUNCTIONS];
int loopFunctionCount = 0;void callInitFunctions(void){uint8_t i ;for(i = 0 ; i<loopFunctionCount;i++){loopFunction<i>();}
}/******************************************************************************
*@brief : main program
*@param : none
*@return: none
******************************************************************************/#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_demo_widgets.h"
#include "lv_examples.h"int main(void)
{HAL_Init();SystemClock_Config();BSP_UART_Init();TIM6_Init();//LVGL初始化lv_init();//显示器初始化lv_port_disp_init();//界面生成lv_demo_widgets();while(1){lv_task_handler();HAL_Delay(5);}}

编写自定义LVGL显示代码

/******************************************************************************
*@file: main.c
*@brief : main program
******************************************************************************/
#include "main.h"  #include "lvgl_timer.h"
LoopFunction loopFunction[MAX_INIT_FUNCTIONS];
int loopFunctionCount = 0;void callInitFunctions(void){uint8_t i ;for(i = 0 ; i<loopFunctionCount;i++){loopFunction<i>();}
}/******************************************************************************
*@brief : main program
*@param : none
*@return: none
******************************************************************************/#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "lv_demo_widgets.h"
#include "lv_examples.h"
static void lv_ex_label_1(void)
{/* Create a screen */lv_obj_t * scr = lv_obj_create(NULL);lv_scr_load(scr);lv_obj_set_style_bg_color(scr,lv_palette_main(LV_PALETTE_ORANGE),0);lv_obj_align(scr,LV_ALIGN_CENTER,0,0);/* Create a button */lv_obj_t * btn = lv_btn_create(scr);lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 40);/* Create a label for the button */lv_obj_t * label = lv_label_create(btn);lv_label_set_text(label, "Hello EEWORLD !");    /* Create a button */lv_obj_t * btn1 = lv_btn_create(scr);lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 90);/* Create a label for the button */lv_obj_t * label1 = lv_label_create(btn1);lv_label_set_text(label1, "By End 2024.01.24!");    /* Create a button */lv_obj_t * btn2 = lv_btn_create(scr);lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 140);/* Create a label for the button */lv_obj_t * label2 = lv_label_create(btn2);lv_label_set_text(label2, "ACM32G103-Board Testing");    
}int main(void)
{HAL_Init();SystemClock_Config();BSP_UART_Init();TIM6_Init();//LVGL初始化lv_init();//显示器初始化lv_port_disp_init();//界面生成lv_ex_label_1();while(1){lv_task_handler();HAL_Delay(5);}}

测试效果

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类与对象(终章)——友元,内部类,匿名对象

这里写目录标题 1. 友元1.2 友元函数1.3 友元类 2. 内部类3.匿名对象 1. 友元 之前实现日期类我们实现输入输出流重载的时候就已经了解了友元的概念&#xff0c;我们今天正式走进友元&#xff0c;详细地学习友元的各种特点与性质。 关键字:friend 1.2 友元函数 友元函数在重载…

基于Java学生管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

Springboot简单设计两级缓存

两级缓存相比单纯使用远程缓存&#xff0c;具有什么优势呢&#xff1f; 本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远…

GridModel事件集合——yonBIP低代码

我们接着看表格相关的事件&#xff0c;用友的文档打不开&#xff0c;真的是天大的404&#xff0c;客观请看这个开发文档网址&#xff0c;找不到了&#xff0c;你说holy 不咯&#xff1f;http://tinper.org/mdf/&#xff08;如果有哪位小伙伴知道这个地址是不是迁移了的话&#…

Ryzen Controller 最新版本下载

Ryzen Controller 最新版本下载 GitLab中最新版本地址&#xff1a; Releases Ryzen Controller Team / Ryzen Controller GitLab 然后语言切换成简体中文&#xff0c;就可以愉快使用啦

兼容ARM 32位架构的edgeConnector产品为用户提供新的部署选项

Softing工业将ARM 32位兼容性集成到了edgeConnector产品中&#xff0c;以满足用户对ARM处理器的边缘设备日益增长的使用需求。 &#xff08;兼容ARM 32位架构的edgeConnector产品扩展了其应用部署范围&#xff09; 用户对采用ARM处理器的紧凑型边缘设备的需求正在大幅增长&…

20、数据结构相关练习20210202

一、请简述栈区和堆区的区别。 1.栈区借助于栈的思想实现&#xff0c;“先进后出”&#xff0c;地址申请从大地址到小地址&#xff1b;堆区借助队列思想实现&#xff0c;“先进先出”&#xff0c;地址申请从小地址到大地址&#xff1b; 2.栈区的内存由计算机自动申请自动释放…

springboot162基于SpringBoot的体育馆管理系统的设计与实现

体育馆管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕…

【单片机】简单的自定义延时程序设计(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

【Django】如何设置支持多语种网站,中文/英文网站

首先&#xff0c;需要明确一点&#xff1a;我们要实现的中英对照翻译&#xff0c;这个翻译不是浏览器翻译的&#xff0c;也不是Django帮你翻译。这个需要你自己事先手动翻译好&#xff0c;存放在专门翻译文件中&#xff0c;Django只是事后调用而已。 第一步 新建项目后&#x…

代码随想录算法训练营第25天 | 216.组合总和III ,17.电话号码的字母组合

回溯章节理论基础&#xff1a; https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 216.组合总和III 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 思路: 本题就是在[1,2,3,4,5,6,7,…

C++ lambda [],[=] ,[],[this] 的使用

在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数 [],[] ,[&],[this] 都是捕获列表 [] 的作用&#xff1a; 什么也不捕获 [] 的作用&#xff1a; 按值捕获所有变量 [&] 的作用&#xff1a; 引用捕获所有外部作用域内的变量 [this]的作用&#xf…