document.write('
')

澳门新莆京在线登录

创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

STM32简易多级菜单(数组查表法)显示方法

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-06-07 09:11 次阅读
澳门新莆京在线登录 开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了。

poYBAGKeI_6ANO1kAAGkuV1ZiHM724.png

1 多级菜单

多级菜单的实现,大体分为两种设计思路:

通过双向链表实现

通过数组查表实现

总体思路都是把菜单的各个界面联系起来,可以从上级菜单跳到下级菜单,也可从下级菜单返回上级菜单。

数组查表的方式比较简单,易于理解,本篇就来使用数组查表发在上实现多级菜单的显示。

2 代码实现

2.1 数组查表

首先需要定义一个结构体

typedef struct
{
	uchar current;
	uchar up;//向上翻索引号
	uchar down;//向下翻索引号
	uchar enter;//确认索引号
	void (*current_operation)();
} key_table;

current:当前页面的索引号

up:按下“向上翻“按钮后要跳转到的页面索引号

down:按下“向下翻“按钮后要跳转到的页面索引号

enter:按下“确认“按钮后要跳转到的页面索引号

current_operation:当前页面的索引号要执行的显示函数,这是一个函数指针

澳门新莆京在线登录 注意:对于菜单显示的操作,用到了3个按键,分别是向下、向下和确认,如果单片机上的IO资源较为紧张,还可以把“向上翻”按钮省去,只通过“向下翻”按钮来实现循环访问,对应的结构体也可以去掉该成员。

然后定义一个表澳门新莆京在线登录,用来定义各个页面间如何跳转

key_table table[30]=
{
	//第0层
	{0,0,0,1,(*fun_0)},
	
    //第1层
	{1,4,2, 5,(*fun_a1)},
	{2,1,3, 9,(*fun_b1)},
	{3,2,4,13,(*fun_c1)},		
	{4,3,1, 0,(*fun_d1)},
	
    //第2层
	{5,8,6,17,(*fun_a21)},					
	{6,5,7,18,(*fun_a22)},
	{7,6,8,19,(*fun_a23)},						                	
	{8,7,5, 1,(*fun_a24)},
	
	{ 9,12,10,20,(*fun_b21)},					
	{10, 9,11,21,(*fun_b22)},
	{11,10,12,22,(*fun_b23)},						                	
	{12,11, 9, 2,(*fun_b24)},
	
	{13,16,14,23,(*fun_c21)},					
	{14,13,15,24,(*fun_c22)},				                	
	{15,14,16,25,(*fun_c23)},				                	
	{16,15,13, 3,(*fun_c24)},
	
    //第3层
	{17,17,17,5,(*fun_a31)},			                	
	{18,18,18,6,(*fun_a32)},		                	
	{19,19,19,7,(*fun_a33)},
	
	{20,20,20, 9,(*fun_b31)},				                	
	{21,21,21,10,(*fun_b32)},			                	
	{22,22,22,11,(*fun_b33)},
	
	{23,23,23,13,(*fun_c31)},			                	
	{24,24,24,14,(*fun_c32)},			                	
	{25,25,25,15,(*fun_c33)},								
};

澳门新莆京在线登录 这里解释一下该表是如何工作的:

此表,表示了4级菜单的显示关系(注意第0层其实只是一个欢迎界面)

澳门新莆京在线登录 第一层菜单,只有4个选项,因此这里只列了4行(注意最后一个选项用作返回上一级,无实际内容含义)

澳门新莆京在线登录 第二层菜单,就是对第一层菜单中的3个实际的选项进行进一步的介绍,每种介绍又有4个子项(注意最后一个选项也是用作返回上一级,无实际内容含义),因此,这里的第二层菜单列了3x4=12行

第三层菜单,又是对第二层菜单中的子项进行进一步的介绍(3个分类,每类有3个子项),所以第三层菜单列了9行

澳门新莆京在线登录 注意数组中每一行的第1个数组,是索引号,先列举一个实际的例子进行分析:

poYBAGKeJAmASjyyAAEEODx9hF0512.png

上图就是一个实际的4级菜单要显示的内容,每个条目前,了索引号(0~25),即对应数组在定义的索引号。

比如数组关于第0层和第1层的定义:

//第0层
{0,0,0,1,(*fun_0)},

//第1层
{1,4,2, 5,(*fun_a1)},
{2,1,3, 9,(*fun_b1)},
{3,2,4,13,(*fun_c1)},		
{4,3,1, 0,(*fun_d1)},

先看第一行:索引是0,显示欢迎界面;后面的两个0表示此时按“上翻”和“下翻”无效,继续显示欢迎界面;再后面的1表示按下“确认”按钮后,跳转到索引1处(即显示第1级目录,且指向第1级的第1个子项);最后澳门新莆京在线登录是此索引要显示的具体内容,fun_0就是控制屏幕显示欢迎界面

再看第二行:索引是1,显示第1级目录,且指向第1级的第1个子项(天气);后面的4表示此时按“上翻”跳转到索引4,即显示第1级目录,且指向第1级的第4个子项(Return);再后面的2表示此时按“下翻”跳转到索引2,即显示第1级目录,且指向第1级的第2个子项(音乐);再后面的5表示按下“确认”按钮后,跳转到索引5处(即显示第2级目录,且指向第2级的第1个子项-杭州);最后澳门新莆京在线登录是此索引要显示的具体内容,fun_a1就是控制屏幕显示第1级目录,且指向第1级的第1个子项(天气)

其它行的含义与之类似

通过分析,不难发现,这些数组在空间上的关系:

pYYBAGKeJCeAV9SvAAHIdlcRifY269.png

澳门新莆京在线登录 对于菜单的最底层,因为没有上翻和下翻的功能需求,因此每行的前3个数字都是当前的索引号:

//第3层
{17,17,17,5,(*fun_a31)},			                	
{18,18,18,6,(*fun_a32)},		                	
{19,19,19,7,(*fun_a33)},

{20,20,20, 9,(*fun_b31)},				                	
{21,21,21,10,(*fun_b32)},			                	
{22,22,22,11,(*fun_b33)},

{23,23,23,13,(*fun_c31)},			                	
{24,24,24,14,(*fun_c32)},			                	
{25,25,25,15,(*fun_c33)},	

2.2 具体的显示函数

对于函数要显示的具体内容,根据自己的实现需要显示即可。

这里我使用的是OLED屏幕,借助U8g2图形库进行内容显示,以下是部分显示示例:

/*********第1层***********/
void fun_a1()   
{	
	u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"[1]Weather");
	u8g2_DrawStr(&u8g2,16,32,"[2]Music");
	u8g2_DrawStr(&u8g2,16,48,"[3]Device Info");
	u8g2_DrawStr(&u8g2,16,64,"<--");																					
}

void fun_b1()   
{	
	u8g2_DrawStr(&u8g2,0,32,">");
	u8g2_DrawStr(&u8g2,16,16,"[1]Weather");
	u8g2_DrawStr(&u8g2,16,32,"[2]Music");
	u8g2_DrawStr(&u8g2,16,48,"[3]Device Info");
	u8g2_DrawStr(&u8g2,16,64,"<--");																						
}

void fun_c1()     
{	
	u8g2_DrawStr(&u8g2,0,48,">");
	u8g2_DrawStr(&u8g2,16,16,"[1]Weather");
	u8g2_DrawStr(&u8g2,16,32,"[2]Music");
	u8g2_DrawStr(&u8g2,16,48,"[3]Device Info");
	u8g2_DrawStr(&u8g2,16,64,"<--");																					
}

void fun_d1()     
{	
	u8g2_DrawStr(&u8g2,0,64,">");
	u8g2_DrawStr(&u8g2,16,16,"[1]Weather");
	u8g2_DrawStr(&u8g2,16,32,"[2]Music");
	u8g2_DrawStr(&u8g2,16,48,"[3]Device Info");
	u8g2_DrawStr(&u8g2,16,64,"<--");																							
}

/*********第2层***********/
void fun_a21()     
{	
	u8g2_DrawStr(&u8g2,0,16,">");
	u8g2_DrawStr(&u8g2,16,16,"* HangZhou");
	u8g2_DrawStr(&u8g2,16,32,"* BeiJing");
	u8g2_DrawStr(&u8g2,16,48,"* ShangHai");
	u8g2_DrawStr(&u8g2,16,64,"<--");																						
}
//省略...

2.3 按键切换页面

页面的切换,这里里简单的按钮轮询为例,比如初始显示欢迎界面的状态澳门新莆京在线登录下,按下不同按键后,通过数组查表,确定要跳转到的索引号,然后根据索引号,通过函数指针执行索引号对应的显示函数,即实现了一次页面切换。

然后,就是在新的页面状态,收到下一个按钮指令,再切换到下一个显示状态。

void (*current_operation_index)(); //定义一个函数指针

//...
while(1)
{
    ((KEY1==0)||(KEY2==0)||(KEY3==0))
    {
        delay_ms(10);//消抖
        if(KEY1==0)
        {
            func_index = table[func_index].up;    //向上翻
            while(!KEY1);//松手检测
        }
        if(KEY2==0)
        {
            func_index = table[func_index].down;    //向下翻
            while(!KEY2);
        }
        if(KEY3==0)
        {
            func_index = table[func_index].enter;    //确认
            while(!KEY3);
        }
    }	

    if (func_index != last_index)
    {
        current_operation_index = table[func_index].current_operation;

        u8g2_ClearBuffer(&u8g2); 
        (*current_operation_index)();//执行当前操作函数
        u8g2_SendBuffer(&u8g2);

        last_index = func_index;
    }
}

3 演示

澳门新莆京在线登录 效果如下:http://www.bilibili.com/video/BV1r5411R7eA

poYBAGKeJIGAT-CjAAau4krxglU018.png

4 总结

澳门新莆京在线登录 本篇介绍了一种简易的多级菜单的显示方法,本质是通过数组查表,实现各级菜单的各个页面(状态)的切换(跳转),并在STM32上编程实现,通过OLED屏幕,以及借助U8g2图形库,测试了多级菜单的显示功能。

收藏 人收藏

评论

相关推荐

基于MODBUS协议用STM32F103做从机接收发送数据包实验

给大家分享一个网友qq_34471646做的实验,用STM32做从机接收主机发送过来的数据包(也是基....
的头像 汽车电子技术 发表于 06-14 17:47 662次 阅读

物联网时代下,MCU应用的新生态

MCU作为联网设备的关键元件,物联网设备的增多提升了对联网能力需求,同时也需要兼顾成本和功耗
发表于 06-14 17:44 150次 阅读

基于库函数的SD卡硬件驱动层代码实现方案

嵌入式开发中经常会用到对外部SD卡进行相关的读写操作。下图是CPU硬件连接示意图 CPU硬件连接  ....
的头像 嵌入式应用开发 发表于 06-14 17:13 160次 阅读

TL431恒流电路典型应用分析

电路中电流通过三极管,2.5K电阻到地,只要有电流流过,电阻两端就会存在压差,压差的大小由电流来决定....
的头像 要长高 发表于 06-14 16:54 619次 阅读

用STM32F103做CAN的收发通信的程序思路与代码分享

STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(....
的头像 STM32嵌入式开发 发表于 06-14 16:13 669次 阅读

电动腰部按摩仪芯片—DLT8F71SC

审核编辑:符乾江
发表于 06-14 16:08 7次 阅读
电动腰部按摩仪芯片—DLT8F71SC

通过嵌入式虚拟化充分利用多核芯片

  多核软件设计既复杂又简单。系统架构师应该抵制将遗留软件元素批量分配给下一代嵌入式芯片上的可用内核....
的头像 星星科技指导员 发表于 06-14 15:35 136次 阅读

STM32F103中文教程及参考手册

STM32F103中文教程及参考手册
发表于 06-14 15:26 14次 阅读

嵌入式软件驱动的硬件验证

  虚拟原型和 FPGA 原型的混合以及 RTL 仿真和事务级模型的混合允许开发人员利用各个解决方案....
的头像 星星科技指导员 发表于 06-14 15:21 102次 阅读

ECOT PSM同步降压调节器的特性说明

RY9430 38V 3A 500KHz ECOT PSM同步降压调节器 特性: 宽4.5V至38V....
发表于 06-14 15:17 91次 阅读

ECOT PWM同步降压调节器的特性介绍

RY9121 17V 2A 500KHz ECOT PWM同步降压调节器 特性 宽4.5V至17V工....
发表于 06-14 15:13 65次 阅读

减小嵌入式SoC尺寸的解决方案

  ARM 32 位处理器带来更多功能和性能效率。在较小但风险仍然较低的工艺节点上实施的物理 IP ....
的头像 星星科技指导员 发表于 06-14 15:06 93次 阅读

COM Express为嵌入式系统设计提供应用程序完全兼容性

作为唯一独立于供应商的模块化计算机标准,COM Express 继续成为嵌入式市场未来高级应用的重要....
的头像 星星科技指导员 发表于 06-14 15:00 104次 阅读

2022年6月13日,全球领先的嵌入式开发软件工具和服务提供商IAR Systems®于官网释放新版 IAR Embedded Workbench for A...
发表于 06-14 14:54 687次 阅读

APU为小型嵌入式设备配备强大的图形功能

  如今,基于便携式计算的设备,无论是用于医疗、自动化、物流还是信息亭系统,都需要比以前的嵌入式技术....
的头像 星星科技指导员 发表于 06-14 14:43 203次 阅读

毫秒级定时模块 作为系列开篇,本文先介绍一个非常基础的模块:毫秒级定时模块。 友情提醒,本模块比较基础,可能有的同学对此...
发表于 06-14 14:38 196次 阅读

STM32Cube工具和扩展包为MCU提供专用Azure RTOS高质量中间件

STM32Cube工具和扩展包为从入门级到高性能的MCU提供专用Azure RTOS高质量中间件
发表于 06-14 14:25 48次 阅读

模块化标准为智能互联设备扩展了ARM平台的可扩展性

  一个强大的硬件和软件供应商生态系统目前正在克服与实施 ARM 相关的支持问题的连续性。新 ULP....
的头像 星星科技指导员 发表于 06-14 14:22 136次 阅读

STC89系列单片机总体介绍

STC89Cxx中文参考手册
发表于 06-14 14:18 13次 阅读

混合使用CPU和GPU元素的多核图像处理

  数据并行应用程序的第二个示例是 LuxMark,它是一个面向图形的基准测试包,它使用 OpenC....
的头像 星星科技指导员 发表于 06-14 11:19 658次 阅读

近年来,随着嵌入式系统产业规模的持续增长,作为IT业的重要新兴产业和经济增长点,发展嵌入式系统产业已经成为了制造向创造转...
发表于 06-14 10:45 661次 阅读

虚拟化对移动设备和物联网的影响

  随着嵌入式世界在功率和功能方面的增长,数据中心技术在低功率和效率方面继续增长也很重要。为此,基于....
的头像 星星科技指导员 发表于 06-14 10:35 69次 阅读

通过M.2增加数据吞吐量

  对于一般嵌入式应用,mSATA 和 mPCIe 不会很快出现。工业应用具有适度的性能需求,而是强....
的头像 星星科技指导员 发表于 06-14 10:18 42次 阅读

使用离散的高性能图形处理器开发嵌入式系统

  虽然标准的消费图形系统可能会持续几年,但许多嵌入式项目的生命周期为 7 到 10 年。这意味着零....
的头像 星星科技指导员 发表于 06-14 10:03 60次 阅读

单芯锂离子及锂聚电池保护IC概述

RY2212是锂离子/聚合物电池保护的高集成化解决方案。RY2212包含内部功率MOSFET、高精度....
发表于 06-14 09:31 27次 阅读

FPGA安全启动设计防止Linux rootkit威胁

  SoC 还可以提供对模块环境条件的实时监控,例如温度、电压、时钟频率和其他因素。FPGA 架构可....
的头像 星星科技指导员 发表于 06-14 09:07 113次 阅读

如何快速修改keil软件的代码编辑界面

大家好,我是小麦,最近的文章都在介绍相关工具推荐和使用,这次给大家带来如何快速修改keil软件的代码....
的头像 FPGA之家 发表于 06-14 09:00 136次 阅读

CH32V103R8T6单片机 手碰晶振会死机 不能恢复      ...
发表于 06-14 06:57 23次 阅读

单片机STC12C5410AD数据手册

STC12C5410AD是一款基于高性能1T架构8051 CPU的单片微控制器由STC MCU有限公....
发表于 06-13 16:51 11次 阅读

单片机STC12C5620AD数据手册

STC12C5620AD是一种基于高性能IT架构8051 CPU的单片微控制器由STC MCU有限公....
发表于 06-13 16:46 13次 阅读

STC12H系列单片机技术参考手册

STCI2H系列单片机是不需要外部晶振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗为目标....
发表于 06-13 16:45 7次 阅读

利尔达与ST联合发布STM32MP1开发板新品

近日,致力于提供物联网产品研发、技术应用、服务落地一站式解决方案的国家高新技术企业利尔达与ST意法半....
的头像 物联网观察 发表于 06-13 15:22 131次 阅读

CS5801 HDMI2.0b到DP1.4a转换器概述及特点

CS5801是HDMI2.0b到DP1.4a转换器。CS5801有一个HDMI2.0b输入,最大带宽....
发表于 06-13 15:14 134次 阅读

单片机课程指导书

单片机课程设计课程指导书
发表于 06-13 15:13 19次 阅读

STM32课程设计贪吃蛇

贪吃蛇课程设计
发表于 06-13 15:09 16次 阅读

STM32F103双串口实验

STM32F103双串口实验,程序将串口1和串口3全部调通,可同时使用
发表于 06-13 15:07 7次 阅读

基于8位单片机TM52F1376的LED小夜灯方案

随着智能家居越来越深入生活,很多智能家居走进了千家万户,小夜灯就是其中一种。小夜灯具备装饰的功能,同....
发表于 06-13 15:07 81次 阅读

STM32F407-双串口实验

STM32F407-双串口实验,程序将串口1和串口2全部调通,可同时使用
发表于 06-13 15:06 15次 阅读

89系列单片机上机指导

89系列单片机上机指导
发表于 06-13 14:20 10次 阅读

在生产中使用商品ARM评估平台的优缺点

  评估板非常适合评估特定处理器和进行试验。社区支持普遍良好,硬件投资极少。但是,如果您计划围绕评估....
的头像 星星科技指导员 发表于 06-13 14:11 145次 阅读

驱动程序接口协议发生变化

  工程师仍然可以选择最新工具的低成本版本(满载应用程序以满足当今的需求,只是没有针对所有未来的排列....
的头像 星星科技指导员 发表于 06-13 10:51 124次 阅读

ECOT力同步降压调节器概述

RY9135 16V 3A 500KHz ECOT力同步降压调节器 特性 •宽4.5V至16V工作输....
发表于 06-13 10:22 129次 阅读

单芯锂离子及锂聚电池保护IC的概述

特性 •充电器反向连接保护 •蓄电池反接保护 •过热保护 •过充电流保护 •两步过流检测: 在放电电....
发表于 06-13 09:38 65次 阅读

一种同时至此本地和远程升级的方法

常见的存储设备有SD卡,TF卡,U盘,硬盘等。将升级文件拷贝到存储设备中,设备启动的时候,通过ubo....
的头像 strongerHuang 发表于 06-13 09:33 87次 阅读

使用ADC0832与单片机的电量指示电路设计

在数字电路中,电平只有高和低两种状态,而在模拟电路中,电平理论上有无数个状态,在使用过程中就需要将两....
发表于 06-13 08:58 1625次 阅读

1.       硬件准备接下来,我们的目的是做一个图像识别相关的事情,但由于我们这个Phytec开发板它并没有带...
发表于 06-12 14:44 360次 阅读

跃昉的开发板终于到了,跃昉的开发板终于到了。 等了一个月了吧。 在我们一次次的催促下,发货了。 话不多说了,拿到货后,第...
发表于 06-12 13:55 574次 阅读

【新提醒】stc单片机下载程序的原理是什么? - 单片机交流 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) ...
发表于 06-12 11:57 416次 阅读

锂离子/聚合物电池保护的高集成度解决方案

RY2230是锂离子/聚合物电池保护的高集成度解决方案。RY2230包含内部功率MOSFET、高精度....
发表于 06-12 10:12 138次 阅读

机器学习概述、工作原理及重要性

本文旨在为硬件和嵌入式工程师提供机器学习(ML)的背景,它是什么,它是如何工作的,它为什么重要,以及....
发表于 06-12 09:27 30次 阅读

利用单片机+OLED显示屏制作实时时钟

最近在学习OLED显示屏的应用,通过OLED显示时间、年、月、日,以及相关信息。还可以根据喜好添加不....
发表于 06-12 09:04 239次 阅读

基于单片机的LED灯光立方设计

光立方顾名思义就是会发光的立方体,光立方的基本原理是利用人眼的暂留效应,利用单片机控制LED灯快速的....
发表于 06-12 08:52 242次 阅读

基于51单片机的OLED显示图片文字

基于51单片机的OLED屏幕显示,可显示图片文字字母等。
发表于 06-12 00:43 922次 阅读

这是什么元件?感谢感谢!
发表于 06-11 19:34 714次 阅读

主板部分留有接口.详谈可加vx:13510974099.在广东东莞,深圳最好 程序要求:l 面板有中英文可切换界面。l 频率有上下限保护(可调...
发表于 06-11 18:46 621次 阅读

MH32F103ARPT6软硬件兼容STM32F103RCT

MH2103A(C)xxxx系列使用高性能的32位内核,最高工作频率216 MHz。 内置的存储器包....
发表于 06-11 15:52 41次 阅读

STM8S0系列特点单片机程序开发复制

STM8S0系列: STM8S001,STM8S003,STM8S005,STM8S007解成功 •....
的头像 ic芯片解密 发表于 06-11 11:14 34次 阅读

板子型号为野火F103指南者,本人在根据课本做点灯实验,将控制RBG小灯的三个引脚定义成了宏,然后写代码将其混合展现出不同的...
发表于 06-11 00:12 638次 阅读

飞凌嵌入式 OKT507-C开发板:安全策略漫谈

硬件平台:飞凌嵌入式 OKT507-C开发板 操作系统:Android10.0 飞凌嵌入式 T507....
发表于 06-10 17:18 315次 阅读

PWM脉冲宽度调制的基本原理及实现方法

PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散....
的头像 凡亿PCB 发表于 06-10 17:06 426次 阅读

码农爱学习

文章:36 被阅读:137265

关注 114人关注
必威体育官网下载 365bet下载地址苹果版 永利app下载 必威体育注册 必威体育betway登录手机 365bet客户端下载 金沙彩票app 必威苹果客户端下载 必威体育app手机版 金沙彩票手机版下载 新澳门葡京网站多少 必威体育betway登录手机 必威体育app官方版下载 必威体育app官方版下载 必威betway中文版 澳门新莆京在线登录 必威体育betway登录手机 必威体育官网下载 澳门威尼斯人网上娱乐 必威登录网页版登录注册 必威体育app手机版 必威体育appios下载 金沙彩票app下载安装 365bet官方下载苹果版 365bet下载地址苹果版 澳门新莆京在线登录 Betway必威中文官网 365betapp苹果版下载 Betway必威中文官网 必威体育app官方版下载