STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)

项目背景

本次的水墨屏幕项目需要做一个多级菜单的显示,所以写出来一起学习,本篇文章不单单适合于水墨屏,像0.96OLED屏幕也适用,区别就是修改显示函数。
在这里插入图片描述

设计思路

多级菜单的实现,一般有两种实现的方法
1.通过双向链表实现
2.通过数组查表实现
两种方法的思路都是把所有的界面连接在同一个连接中,上级菜单跳转下级菜单。
数组查表比较简单,此次的项目就用数组查表的方法。

实现代码

1.确定好菜单的逻辑,也就是菜单的显示关系。
在这里插入图片描述

在开机的时候,显示开机界面,然后按下任意按键,就跳转到菜单显示,可以通过上按键,下按键和确认按键选择相对应的显示。
2.代码逻辑实现。
首先定义一个结构体,分别为上按键,下按键和确认按键,当前页面索引号,当前页面索引号执行的函数。

typedef struct
{uchar current;//当前页面索引号uchar up;     //向上翻索引号uchar down;   //向下翻索引号uchar enter;  //确认索引号void (*current_operation)();  //当前页面索引号执行的函数,指针函数
} key_table;

数组方法实现多级菜单的原理就是把每一个显示界面编上一个号码,称为当前页面索引号。比如开机显示界面为0,菜单显示为1。每当选择到一个号码,就去运行前页面索引号函数,也就是显示相对应的界面。例如下面的数组key_table table【】,当选择到0编码,就去运行(*fun_0)这个指针函数,把要显示的开机界面写在(*fun_0)就可以。

key_table table[30]=
{//第0层{0,1,1,1,(*fun_0)},//开机界面//第1层{1,2,2, 2,(*fun_a1)},//主菜单界面{2,6,3, 7,(*fun_b1)},//显示WIFI下划线{3,2,4, 8,(*fun_c1)},//显示万年历下划线{4,3,5, 9,(*fun_d1)},//显示时钟下划线{5,4,6, 10,(*fun_e1)},//显示小说下划线{6,5,2, 0,(*fun_f1)},//显示返回下划线//第2层{7,7,7,1,(*fun_a21)},	//连接WIFI{8,8,8,1,(*fun_b21)},	//显示时间{9,9,9,1,(*fun_c21)},	//倒计时};
//开机界面
void fun_0()
{u2_printf("hello world\r\n");Refresh();//刷新屏幕EPD_ShowString(125,55,"Hello",24,BLACK);	EPD_PartDisplay(Image_BW);delay_ms(20);
}

那么是怎么实现上级菜单跳转到下级菜单的尼,比如初始显示欢迎界面的状态下,按下不同按键后,通过数组查表,确定要跳转到的索引号,然后根据索引号,通过函数指针执行索引号对应的显示函数,即实现了一次页面切换。然后,就是在新的页面状态,收到下一个按钮指令,再切换到下一个显示状态。
我们看下key_table table[30]数组里面的元素。

	 //第0层{0,1,1,1,(*fun_0)},//开机界面//第1层{1,2,2, 2,(*fun_a1)},//主菜单界面{2,6,3, 7,(*fun_b1)},//显示WIFI下划线{3,2,4, 8,(*fun_c1)},//显示万年历下划线{4,3,5, 9,(*fun_d1)},//显示时钟下划线{5,4,6, 10,(*fun_e1)},//显示小说下划线{6,5,2, 0,(*fun_f1)},//显示返回下划线//第2层{7,7,7,1,(*fun_a21)},	//连接WIFI{8,8,8,1,(*fun_b21)},	//显示时间{9,9,9,1,(*fun_c21)},	//倒计时

元素是一开始我们定义好的结构体,依次为当前页面索引号,上按键,下按键,确认按键,执行的函数。当我们在索引号1的主菜单界面按上按键,下按键,确认按键,都会跳转到索引号2的显示WIFI下划线界面,然后按上按键,就去跳转到索引号6的显示返回下划线界面,或者按下按键跳转到索引号3的显示WIFI下划线界面,按确认键就跳转到第2层的连接WIFI。在索引号7的连接WIFI界面中,按上按键和下按键都是跳到当前索引号7,从而显示按键按下不跳其他界面的功能,只有按确认按键才会跳到当前索引号1的主菜单界面。
通过分析,不难发现,这些数组在空间上的关系:

在这里插入图片描述

菜单界面的切换。比如初始显示欢迎界面的状态下,按下不同按键后,通过数组查表,确定要跳转到的索引号,然后根据索引号,通过函数指针执行索引号对应的显示函数,即实现了一次页面切换。
然后,就是在新的页面状态,收到下一个按钮指令,再切换到下一个显示状态。

效果可以看看视频

多级菜单演示

代码链接:https://pan.baidu.com/s/1XddINn6Qos5-4r5XtIuwXQ?pwd=z754
提取码:z754

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

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

相关文章

云贝教育 |【技术文章】pg_bulkload介绍

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 pg_bulkload 是一个高性能的数据加载工具,专门为PostgreSQL数据库设计,用于大批量数据的快速导入。pg_bulk…

JetPack之DataBinding基础使用

目录 一、简介二、使用2.1 使用环境2.2 xml文件绑定数据2.3 数据绑定的对象2.3.1 object2.3.2 ObseravbleField2.3.3 ObseravbleCollection 2.4 绑定数据 三、应用场景 一、简介 DataBinding是谷歌15年推出的library,DataBinding支持双向绑定,能大大减少绑定app逻辑…

【C语言】huffman编码实现数据压缩

目录 原理类型定义完整代码实验无重复数据的压缩情况有重复数据的压缩情况数据中只有一种字符的情况 原理 huffman统计数据中字符的出现次数,根据每个字符的出现次数来编码,出现次数越多的数据使用越短的编码长度,从而实现数据压缩的目的。 …

南京观海微电子---Vitis HLS的工作机制——Vitis HLS教程

1. 前言 Vitis HLS(原VivadoHLS)是一个高级综合工具。用户可以通过该工具直接将C、 C编写的函数翻译成HDL硬件描述语言,最终再映射成FPGA内部的LUT、DSP资源以及RAM资源等。 用户通过Vitis HLS,使用C/C代码来开发RTL IP核&#x…

VSCode 如何同步显示网页在手机或者平板上

首先要确保 ①电脑上安装了VsCode ②VsCode安装插件LiveServer 安装成功之后 连续按住 Alt L 、Alt O 会跳转到对应的html页面上 http://127.0.0.1:5500/....... 是这个开头的 然后打开网络 如果桌面有网上邻居的可以直接点桌面的网上邻居 进来找到WLAN这个…

RabbitMQ安装及使用笔记

RabbitMQ安装及使用笔记 RabbitMQ是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP),用于在分布式系统中进行消息传递。 1.安装 利用docker load命令加载mq镜像 docker load -i mq.tar 基于Docker来安装RabbitMQ&#xff…

数据结构(四)顺序表与链表的深层次讲解

我们在数据结构(二),对链表和顺序表已经讲解过了。但很多同学表示有点晦涩难懂那我就出一篇深层次讲解,一步一步来带领大家学习。 我们从头(数据结构)开始完整的来为大家讲解,大家好好看好好学。…

人工智能在产业中应用--生成智能

二、生成式人工智能 前面介绍了很多人工智能的应用,接下来部分我们会介绍当前正在进行的生成智能。生成智能和以往的人工智能有什么区别,个人觉得主要区别就在于“度”。在表现上就是以前的人工智能更多是利用既有的数据集分布挖掘和解决在这个数据集下…

Python人工智能:气象数据可视化的新工具

Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

单片机原理及应用

单片机时钟电路及时序 时钟电路用于产生AT89S51单片机工作时所必需的时钟脉冲信号(工作频率);AT89S51单片机的CPU正是在时钟脉冲信号的控制下,严格地按时序执行指令进行工作的。AT89S51单片机的最高时钟频率为33MHz。 时钟电路 AT89S51单片机常用的时…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog ! logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版, 下载页面&#…

Python拆分PDF、Python合并PDF

WPS能拆分合并&#xff0c;但却是要输入编辑密码&#xff0c;我没有。故写了个脚本来做拆分&#xff0c;顺便附上合并的代码。 代码如下&#xff08;extract.py) #!/usr/bin/env python """PDF拆分脚本(需要Python3.10)Usage::$ python extract.py <pdf-fil…

垃圾回收机制--GC 垃圾收集器--JVM调优-面试题

1.触发垃圾回收的条件 新生代 Eden区域满了&#xff0c;触发young gc (ygc)老年代区域满了&#xff0c;触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc&#xff0c;但是不必然执行。…

蓝桥杯(3):python搜索DFS

目录 1 DFS简介 1.1 DFS与n重循环 1.2 代码实现 1.3 例题 1.3.1 分糖果 1.3.2 买瓜 2 回溯 2.1 定义 2.2 代码实例 2.1.1 排列数 2.1.2 找子集 2.3 例题 2.3.1 N皇后 2.3.2 小朋友崇拜圈 2.3.3 全球变暖 3 剪枝 3.1 定义 3.2 分类 3.3 例子 3.3.1 数字王国之…

自动化测试:Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …

任务2.1 一元二次方程(顺序结构版)

在这个任务中&#xff0c;我们编写了一个Java程序来解决一元二次方程。程序接受用户输入的系数a、b、c&#xff0c;并计算出方程的根。通过计算判别式delta的值&#xff0c;我们可以确定方程有两个不相等实根、两个相等实根还是没有实数根。这个程序遵循了IPO模式&#xff0c;即…

MCGS学习——MCGS仿真与实体西门子监控

MCGS仿真与西门子监控 前提知识——博图与MCGS联合仿真 适用于什么设备都没有的情况下进行学习 对NetToPLCsim进行初始设置 找到博图的IP地址 勾选允许远程对象的通信访问 勾选系统时钟参数&#xff0c;主要是需要用到1HZ的脉冲&#xff0c;做一个闪烁的灯 编写简单程序&am…

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…

2024/3/28 IOday1

编写一条学生链表&#xff0c;写一些能够像链表里边添加数据的函数 实现&#xff1a;将链表中的所有内容保存到文件中去 以及 读取文件中的所有内容&#xff0c;加载到链表里 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef int datat…