分享一个简单的基于C语言嵌入式GUI界面切换代码

目录

前言

一、数据类型

二、页面调度

三、页面显示

四、视频展示


前言

        最近在用LVGL写一个简单的UI界面,需要进行几个页面的切换,所以就自己写了一个简单页面切换代码,方便进行页面切换,同时使UI代码结构更加清晰。这个结构主要用于嵌入式MCU上使用,所以结构比较简单。

一、数据类型

typedef struct ui_show_t
{struct ui_show_t *last;uint32_t  *ui;
}ui_show_t;

这个页面切换代码会用到一个类似链表的结构,每个界面都会定义一个这样的数据数据结构,用来保存上一个页面的指针。如下图所示:

这样每切换到下一页面的时候都可以根据需要来切换到上一页面。

同时我定义了页面的函数类型:

typedef struct ui_show_t * (*ui_show_fun)(ui_show_t* ui_show,ui_opera_t ui_opera)

除了上面提到ui_show_t类型,还有一个ui_opera_t,这个类型定义了页面的操作设备,例如触摸屏、实体按键、旋转按钮等等,我的设备是旋转按钮,所以就定义了如下的类型:

typedef struct 
{int8_t      dir_cnt;    //旋转方向计数btn_sta_t   btn_sta;    //按键状态
}ui_opera_t;

这样就可以操作我的屏幕进行页面切换了。


二、页面调度

        对于页面的调用是单独创建了一个任务,在这个任务的循环里面获取旋转按钮的状态以及进行页面的显示。可以看到最终显示的是 my_show_ui->ui  这个页面,这个页面在初始化的时候被赋值了ln_lvgl_mainwindow这个函数指针,这个函数就是用来显示主页面的函数。

#include "ln_lvgl_ui.h"
lv_ui guider_ui;static ui_show_t my_start_ui;
static ui_show_t *my_show_ui = NULL;
ui_opera_t my_ui_opera;static OS_Thread_t g_lvgl_ui_thread;
#define LVGL_UI_TASK_STACK_SIZE   4*40*256 //Bytevoid ui_show_scheduler(void *params);
ui_show_t* ln_lvgl_mainwindow(ui_show_t* ui_show,ui_opera_t ui_opera);
ui_show_t* ln_lvgl_lightwindow(ui_show_t* ui_show,ui_opera_t ui_opera);int ln_lvgl_ui_init()
{ln_drv_rotate_btn_init();    //旋转按钮初始化lv_init();                   //LVGL初始化lv_port_disp_init();         //显示设备初始化setup_ui(&guider_ui);        //第一个页面初始化//创建页面显示调度任务if(OS_OK != OS_ThreadCreate(&g_lvgl_ui_thread, "LVGL Task", ui_show_scheduler, NULL, OS_PRIORITY_BELOW_NORMAL, LVGL_UI_TASK_STACK_SIZE)) {return HAL_ERROR;}return HAL_OK;
}void ui_show_scheduler(void *params)
{//对第一个页面的链表进行数据初始化my_start_ui.last = NULL;my_start_ui.ui = (uint32_t*)ln_lvgl_mainwindow;my_show_ui = &my_start_ui;while(1){//获取旋转按钮的旋转方向计数以及按键状态my_ui_opera.dir_cnt = ln_drv_rotate_btn_get_dir();my_ui_opera.btn_sta = (btn_sta_t)ln_drv_rotate_btn_get_press();if(my_ui_opera.dir_cnt != 0){LOG(LOG_LVL_ERROR, "cnt :%d \r\n", my_ui_opera.dir_cnt);}//显示对应UImy_show_ui = (ui_show_t*)(*((ui_show_fun)(my_show_ui->ui)))((ui_show_t*)my_show_ui,my_ui_opera);//LVGL函数lv_timer_handler();//延时1msOS_MsDelay(1);}
}

三、页面显示

#include "ln_lvgl_mainwindow.h"//在这里定义了一个这个页面的链表方便存储上一个页面的指针
static ui_show_t my_mainwindow_ui;ui_show_t* ln_lvgl_mainwindow(ui_show_t* ui_show,ui_opera_t ui_opera)
{static uint8_t show_flag    = 0;static int8_t cur_show_item = 0;static int8_t last_show_item = -1;if(show_flag == 0){//显示页面,只需要显示一次就可以show_flag = 1;}//根据旋转编码器不同的值,来执行不同的操作cur_show_item += 0 - ui_opera.dir_cnt;if(cur_show_item != last_show_item){switch(cur_show_item){case 0:{break;}case 1:{break;}}}last_show_item = cur_show_item;//按键长按和短按也都可以执行不同的操作,例如长按返回上一个页面,短按进入下一页面if(ui_opera.btn_sta == SHORT_PRESS){//短按进入下一个页面,下一个页面自行定义,直接赋值就好switch(cur_show_item){case 0:{my_mainwindow_ui.last = ui_show;my_mainwindow_ui.ui = (uint32_t*)ln_lvgl_lightwindow;//例如此处显示灯光页面ui_show = &my_mainwindow_ui;show_flag = 0;break;}case 3:{my_mainwindow_ui.last = ui_show;my_mainwindow_ui.ui = (uint32_t*)ln_lvgl_timewindow;//例如此处显示时间页面ui_show = &my_mainwindow_ui;show_flag = 0;break;}}}if(ui_opera.btn_sta == LONG_PRESS){//长按进入上一个页面(如果有的话)if(ui_show->last != NULL){//直接赋值ui_show = ui_show->last;}}//返回赋值后的指针地址return ui_show;
}

四、视频展示

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

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

相关文章

非常好的简历精选7篇

想要打造一份令人眼前一亮的简历,赢得招聘方的青睐?参考这7篇精选的“非常好的简历”案例!无论是应届毕业生还是职场人士,都能从中借鉴灵感,提升简历质量。让求职之路更加顺畅,轻松斩获心仪职位&#xff01…

【java毕业设计源码】基于SSM框架的在线智能题库管理系统设计与实现

该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等学习内容。 目录 一、项目介绍: 二、文档学习资料: 三、模块截图: 四、开发技术与运行环境: 五、代码展示: 六、数据库表截图&#xff1a…

ABAP MODIFY 如何使用?有哪些细节需要注意?

MOIDFY 描述 在ABAP中的MODIFY是一个关键字,它可用于更新内表的数据。也可以用于更新数据库表的数据。这在SAP系统的编程中非常有用。 如何使用 MODIFY可以有两种形式:MODIFY TABLE和MODIFY LINE。 1. MODIFY TABLE:(用于修改数据库表、透…

智能优化算法应用:基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于入侵杂草算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.入侵杂草算法4.实验参数设定5.算法结果6.参考…

c# OpenCV安装(一)

一 通过NuGet 安装四个拓展包 OpenCvSharp4、OpenCvSharp4.Extensions、OpenCvSharp4.runtime.win、OpenCvSharp4.WpfExtensions C#使用OpenCV的一些代码 需要加头文件 using OpenCvSharp; //为了使用opencv using Point OpenCvSharp.Point; //为了确定我们使用的poin…

296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

1、根因分析 -根因分析:当有新版本并且grade等级是2的时候,点击ptz的时候使用的是RSDialog,WA_DeleteOnClose属性默认是为true的, 并且是栈上的变量,当关闭ptz的时候,diolog的exec结束会向系统发送延后销毁事件,此时退出ptz会弹出自动升级对话框,接管了 事件循环,则会调用前面…

Android HCI日志分析案例1

案例1--蓝牙扫描设备过程分析 应用层发起搜索蓝牙设备,Android 官方提供的蓝牙扫描方式有三种,分别如下: BluetoothAdapter.startDiscovery(); //可以扫描经典蓝牙和BLE两种。BluetoothAdapter.startLeScan();//扫描低功耗蓝牙,…

Linux(openssl):创建CA证书,并用其对CSR进行签名

1.创建CA证书: 1.1创建CA证书目录ca,并进入ca $ mkdir ca $ cd ca 1.2创建CA证书私钥 $ openssl genrsa -aes256 -out ca.key 2048 Enter PEM pass phrase: Verifying - Enter PEM pass phrase: 输入两次密码后,在ca目录下生成了私钥文件ca.key 1.3生成CSR $ openssl req -…

数据领域建设的五大方向

1.数据技术的发力点 数据汇聚技术包括5G高速光纤ipv6下一代互联网、卫星互联网、叠加互联网、区块链、标识、编码和解析等;数据处理技术包括云计算、边缘计算、分布式计算、大数据处理、AI分析、绿色低碳、数据空间、隐私计算、区块链、数据脱敏、数据沙箱等&#…

stm32 can滤波器接收指定的ID

CAN 文章目录 CAN一、配置1、对扩展数据帧进行过滤:(只接收扩展数据帧)CAN_FilterIdHigh:CAN_FilterIdLow:2、对扩展远程帧过滤:(只接收扩展远程帧)3、对标准远程帧过滤:(只接收标准远程帧)4、对标准数据帧过滤:(只接收标准数据帧)5、对扩展帧进行过滤:(…

【Erlang进阶学习】2、匿名函数

受到其它一些函数式编程开发语言的影响,在Erlang语言中,将函数作为一个对象,赋予其“变量”的属性,即为我们的匿名函数 或 简称 fun,它具有以下特性: (匿名函数:不是定义在Erlang模…

<DB2>《AIX服务器DB2数据库裸设备表空间扩容方案》

《AIX服务器DB2数据库裸设备表空间扩容方案》 1 表空间状态查看1.1 连接数据库(实例用户操作)1.2 查看表空间剩余(实例用户操作)1.3 查看所属表空间的容器属性(实例用户操作) 2 VG状态和LV状态查看2.1 查看…

leetCode 40.组合总和 II + 回溯算法 + 剪枝 + used数组 + 图解

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 注意:解集不能包含重复的组合 示例 1: 输入: candidates [10,1,2,7,6,1,5], t…

基于51单片机的交通灯_可调时间_夜间+紧急模式

51单片机交通灯 1 讲解视频:2 功能要求3 仿真图:4 原理图PCB5 实物图6 程序设计:7 设计报告8 资料清单(提供资料清单所有文件):设计资料下载链接: 51单片机简易交通灯_可调时间_夜间紧急 仿真代…

LeetCode | 101. 对称二叉树

LeetCode | 101. 对称二叉树 OJ链接 在本函数里不好进行判断,我们另外定义一个函数来如果两个都相等为空,就返回true一个为空,一个不为空都不为空,就比较值然后递归1的左,2的右,1的右,2的左 bool _isSymm…

Unity 关于触摸事件的处理

在Unity 中,要处理触摸事件,主要有以下一些方法: Input.touches: 这个属性返回一个Touch数组,包含了当前帧中所有的触摸信息,包含触摸的数量、位置和状态等信息。 Input.touchCount: 这个属性返回当前帧中触摸的数量。…

Ubuntu安装过程记录

软件准备 硬件 Acer电脑,AMD a6-440m芯片 64g优盘一个,实际就用了不到5g。 Ubuntu :官网 下载Ubuntu桌面系统 | Ubuntu 下载桌面版Ubuntu 22.04.3 LTS LTS属于稳定版 u盘系统盘制作软件 Rufus :Rufus - 轻松创建 USB 启动…

穷尽与筛选:人类思考过程的数据处理视角

穷尽与筛选:人类思考过程的数据处理视角 摘要:第一章:引言1.1 研究背景和动机:1.2 人类思考过程的概述:1.3 研究目的和意义:第二章:试一试的过程(穷举法及相关查找)2.1 穷举法的基本思路:2.2 调用数据库和外部数据的重要性:2.3 尝试和分析数据的意义:第三章:凑一凑…

linux常用命令-grep命令与ps命令详解(超详细)

文章目录 前言一、grep命令介绍1. grep命令简介2. grep命令的基本语法3. 常用的grep命令选项 二、grep命令示例用法1. 在文件中搜索匹配模式的行2. 忽略大小写地搜索匹配模式的行3. 反转匹配,只打印不匹配模式的行4. 显示匹配行的行号5. 统计匹配的行数6. 打印包含匹…

创投课程研报专题课 | 如何写出高质量研报

协会邀请了来自GPTDAO的分析师——Will作为VC创投课程研报专题课的嘉宾,将于北京时间12月2日(周六)晚上21:00 PM-22:00 PM,与所有对Web3投资、创业心怀热忱的朋友一同探讨《如何写出高质量的研报》这个激动人心的话题。 浙江大学学生区块链协会&#xff…