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
相关文章:
STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)
项目背景 本次的水墨屏幕项目需要做一个多级菜单的显示,所以写出来一起学习,本篇文章不单单适合于水墨屏,像0.96OLED屏幕也适用,区别就是修改显示函数。 设计思路 多级菜单的实现,一般有两种实现的方法 1.通过双向…...
数学建模综合评价模型与决策方法
评价方法主要分为两类,其主要区别在确定权重的方法上 一类是主观赋权法,多次采取综合资讯评分确定权重,如综合指数法,模糊综合评判法,层次评判法,功效系数法等 另一类是客观赋权法,根据各指标…...
window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)
window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm) 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management,顾名思义…...
Mysql——基础命令集合
目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…...
记录一次流相关故障
记录一次流相关故障 1、项目中有个JSON字典文件,通过流的方式加载进来,写了个输入流转字符串的方法,idea开发环境下运行一切正常,打成jar或者war包运行时,只能加载出部分数据,一开始怀疑过运行内存分配过小…...
linux源配置:ubuntu、centos;lspci与lsmod命令区别
1、ubuntu源配置 1)先查电脑版本型号: lsb_release -c2)再编辑源更新,源要与上面型号对应 参考:https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…...
面试算法-88-反转链表
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 解 class Solution {public ListNode reverseList(ListNode head) {if(head null || hea…...
如何在个人Windows电脑搭建Cloudreve云盘并实现无公网IP远程访问
文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局&#…...
一文详解Rust中的字符串
有人可能会说,字符串这么简单还用介绍?但是很多人学习rust受到的第一个暴击就来自这浓眉大眼、看似毫无难度的字符串。 请看下面的例子。 fn main() {let my_name "World!";greet(my_name); }fn greet(name: String) {println!("Hello…...
Mysql中用户密码修改
1、命令行修改 请确保已使用root或其他拥有足够权限的用户登录MySQL,对于MySQL 5.7.6及以上版本或者MariaDB 10.1.20及以上版本。 ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘root’; 1、使用命令 mysql -uroot -p你的密码 连接到mysql管理工具 2、使用命…...
day14-SpringBoot 原理篇
一、配置优先级 SpringBoot 中支持三种格式的配置文件: 注意事项 虽然 springboot 支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml 是主流)。 配置文件优先级排名(从高到低&…...
ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】
点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼: ChatGPT论文指南|揭秘8大ChatGPT提示词研究技巧提升写作效率【建议收藏】 目录 1.写作方法 2.方法设计 3.研究结果 4.讨论写作 5.总结结论 6.书…...
P1563 [NOIP2016 提高组] 玩具谜题
题目传送门 这道题实在是一道水题 话不多说,上代码 #include<iostream> #include<cstring> using namespace std; struct a{int io;//in朝里 out朝外 小人的朝向 string name;//小人的名字 int number;//角色编号 }a[100000]; int main(){int n, m…...
【数据库】数据库语言
1.4 数据库语言 数据库系统提供数据定义语言(DDL)来定义数据库模式,并提供数据操纵语言(DML)来表达数据库的查询和更新。 通过一系列特定的DDL语句来说明数据库系统所采用的存储结构和访问方式,这种特定的…...
javascript单例模式字面量定义的接口和匿名函数定义的接口;他们之间访问私有变量和私有函数之间的区别
javascript的单例模式:即只有一个实例; 模块模式是在单例模式上扩展而来的 //这种是字面量定义了单例对象的公共接口; 字面量对象调用私有变更和私有函数 var Book(function(){let name;checkBookfunction(value){namevalue;}return{setNam…...
啥是大语言模型LLM
引言: 在人工智能的世界里,有一种技术正迅速改变我们与机器交流的方式——这就是大语言模型LLM(Large Language Model)。它们像是拥有海量知识库的超级智能,能够理解和生成人类语言。那么,大语言模型LLM到底…...
vue3之路由导航故障
通常一个导航守卫函数中会发生这四件事之一: 1.通过调用 return false 中断了这次导航 2.通过返回一个新的位置,重定向到其他地方 (例如,return ‘/login’) 3.正常导航到指定路由 4.抛出了一个 Error 检测导航故障 可以使用vue-router提供的…...
Dr4g0n
信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-04 08:52 CST Nmap scan report for 192.168.56.2 Host is up (0.00012s latency). MAC Address: 00:50:56:FE:B1:6F (VMware) Nmap scan report …...
蓝桥杯每日一题:扫雷
题目来源:第十三届蓝桥杯软件赛省赛 B组 在一个 n n n 行 m m m 列 的方格图中有些位置有地雷, 另外一些位置为空 请为每个空位置标一个整数, 表示周围八个相邻的方格中有多少个地雷 输入 : 输入的第一行包含两个整数 n n n , m m m 第 2 行 到 第 n 1 n 1 n…...
net core API 后台系统操作日志的实现思路
net core API 后台系统操作日志的实现思路 系统操作日志的实现思路主要问题不在于写日志和表结构设计上。 主要问题在识别出哪些数据做了修改。并生成日志。 表中数据列众多,且要监控多个表。如果要监控的每个表都去写代码去监控和转换这样的工作量就会比较大。 如,用户表…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...
