【单片机程序设计】简易菜单管理器
前文
最近在搞一个小项目,以前写菜单是用switch case 结构,每一个菜单占用一个case结构,小菜单程序倒还好,若是菜单动辄几十上百就会显得代码量过大,不简洁,而且代码编写起来也相当困难。菜单是树形结构,很适合列表的使用,但是若用指针,如果单片机内存比较丰富那还行,若比较垃圾的单片机需要占用不少内存资源,因此将数据全修改为结构体位定义,根据菜单的实际大小可以定义不同位数,达到节省空间的作用。
代码实现
.c文件
/* Includes ------------------------------------------------------------------*/
#include "tabcontrol.h"
void TabFun0(void);
void TabFun1(void);
void TabFun2(void);
void TabFun3(void);
void TabFun4(void);
void TabFun5(void);
void TabFun6(void);
void TabFun7(void);
void TabFun8(void);
void TabFun9(void);
void TabFun10(void);
void TabFun11(void);
Tab_Struct Tab[12]=
{
{0,0,1,3,0,TabFun0},
{1,0,2,6,0,TabFun1},
{2,1,3,9,0,TabFun2},
{3,5,4,3,1,TabFun3},
{4,3,5,4,1,TabFun4},
{5,4,3,5,1,TabFun5},
{6,8,7,6,2,TabFun6},
{7,6,8,7,2,TabFun7},
{8,7,6,8,2,TabFun8},
{9,11,10,9,3,TabFun9},
{10,9,11,10,3,TabFun10},
{11,10,9,11,3,TabFun11}
};
/**
* @brief 菜单控制函数
* @param None
* @retval None
* @note None
*/
void TabControlRun(uint8_t op)
{
static uint8_t TabIndex = 0;
switch(op)
{
case 0x01:
TabIndex = Tab[TabIndex].Last;
break;
case 0x02:
TabIndex = Tab[TabIndex].Nex;
break;
case 0x03:
TabIndex = Tab[TabIndex].Sub;
break;
case 0x04:
TabIndex = Tab[TabIndex].Parent;
break;
default:break;
}
Tab[TabIndex].Function();
}
/**
* @brief 菜单函数
* @param None
* @retval None
* @note None
*/
void TabFun1(void)
{
}
.h文件
typedef struct
{
uint8_t Nom:4;/*非必须*/
uint8_t Last:4;
uint8_t Nex:4;
uint8_t Sub:4;
uint8_t Parent:4;
void (* Function)(/**/);
}Tab_Struct;
Excel 代码生成技巧
我们可以通过Excel自带的连接字符串函数(="字符串"&A0)来自动生成的我们想要的函数。
总结
使用该方法能够一定程度节省空间,第一块内存的申请其实并非是必要的,我们可以通过本层下一页菜单和上一页菜单的指向性就可以判断本菜单的编号了。如本菜单指向下一个菜单是3,指向上一个菜单是4,那么本菜单一定是5。因为下一个菜单或者上一个菜单至少有一个是满足序号相邻的关系。另外我们可以通过Excel 连接字符串的公式的方法来自动生成的我们的菜单代码。
这个小技巧是不是非常方便呢,大家有什么建议或者改进欢迎提出哦。
关于作者:赤诚Xie
版权声明:本博客所有文章仅用于学习、交流和研究目的,欢迎转载,但请注明原文作者及出处。
奥里给!:若您觉得文章对您有帮助,请点赞、关注支持我吧😊。
药药切克闹,👇👇👇下面三连来一套(●'◡'●)
——励志作一个用单片机梳头的乖宝宝
分类:
嵌入式 / 单片机设计
标签:
单片机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗