一个产品级MCU菜单框架设计~

声明:本处所说的菜单是用在128*64这种小屏幕的菜单,例如下面这种,不是彩屏上的GUI。

作为一个底层驱动工程师,驱动写完了,是要写硬件测试程序的。这个测试程序,一般给测试部/硬件工程师用来测试硬件, 也会给工厂产线测试准成品。

开始的人偷懒,不想一秒就直接上,所有菜单都这样做,一层套一层

void test_main(void)
{while(1){get_key(&key);switch(key){case 1:test_key();break;case 2:test_lcd();break;....}}
}

当菜单越来越多,就开始纠结了,这样写维护不便,看起来也不美,还浪费程序空间。

作为一个天天看《编程之美》的码农,决定改变现状。酷狗百度一番,找到了两个参考:《基于二叉树的多层的液晶菜单界面设计》 《基于节点编号的通用树状菜单设计方法与实现.pdf》 按照他们的设计方法,鼓捣了一个版本,能用,挺好,但是也纠结。因为他们用了树这种数据结构。对于程序运行来说,非常好,效率高。但是对于我来说,菜单代码是一次性的,但是菜单内容,却是会经常改的。让我用人脑去维护一个包含几十个上百个菜单的树,不容易。

想来想去,这些菜单到底有什么不好?对于我来说,为什么不好用?得出下面结论:

  1. 管得太宽 菜单,你就管菜单切换就行了,到了最低一层,也就是实际的测试功能,就不要管了。菜单切换是类似的,实际测试都是不同的。比如在菜单中,按键1,是进入第一个菜单。但是在测试中,按键1,功能都不一样。如果菜单连这个也要管,相同动作功能太多,无法进行统一抽象,就很难模块化。

  2. 出发点不一样 上面说到的菜单,出发点都是如何设计一个好的菜单数据结构,让程序快速,高效运行。我想要的却是一个容易维护的菜单结构,至于菜单的代码有多乱多纠结,没关系, 而且,几百上千个菜单,就算用轮询的方法,也不过几百us吧,没关系。

根据需求,我重新设计了一个菜单结构体

/*** @brief  菜单对象
*/
typedef struct _strMenu
{MenuLel l;     ///<菜单等级char cha[MENU_LANG_BUF_SIZE];   ///中文char eng[MENU_LANG_BUF_SIZE];   ///英文MenuType type;  ///菜单类型s32 (*fun)(void);  ///测试函数} MENU;

是的,就这么简单,每一个菜单都是这个结构体 用这个结构体填充一个列表,就是我们的菜单了

const MENU EMenuListTest[]=
{MENU_L_0,//菜单等级"测试程序",//中文"test",        //英文MENU_TYPE_LIST,//菜单类型NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_1,//菜单等级"LCD",//中文"LCD",        //英文MENU_TYPE_LIST,//菜单类型NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"VSPI OLED",//中文"VSPI OLED",        //英文MENU_TYPE_FUN,//菜单类型test_oled,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"I2C OLED",//中文"I2C OLED",        //英文MENU_TYPE_FUN,//菜单类型test_i2coled,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_1,//菜单等级"声音",//中文"sound",        //英文MENU_TYPE_LIST,//菜单类型NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"蜂鸣器",//中文"buzzer",        //英文MENU_TYPE_FUN,//菜单类型test_test,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"DAC音乐",//中文"DAC music",        //英文MENU_TYPE_FUN,//菜单类型test_test,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"收音",//中文"FM",        //英文MENU_TYPE_FUN,//菜单类型test_test,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_1,//菜单等级"触摸屏",//中文"tp",        //英文MENU_TYPE_LIST,//菜单类型NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"校准",//中文"calibrate",        //英文MENU_TYPE_FUN,//菜单类型test_cal,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_2,//菜单等级"测试",//中文"test",        //英文MENU_TYPE_FUN,//菜单类型test_tp,//菜单函数,功能菜单才会执行,有子菜单的不会执行MENU_L_1,//菜单等级"按键",//中文"KEY",        //英文MENU_TYPE_FUN,//菜单类型test_key,//菜单函数,功能菜单才会执行,有子菜单的不会执行/*最后的菜单是结束菜单,无意义*/                        MENU_L_0,//菜单等级"END",//中文"END",        //英文MENU_TYPE_NULL,//菜单类型NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行
};

这个菜单列表有什么特点和要求呢?1 需要一个根节点和结束节点 2 子节点必须跟父节点,类似下面结构

-----------------------------------------------
根节点第1个1级菜单第1个子菜单第2个子菜单第3个子菜单第2个1级菜单第1个子菜单第1个孙菜单第2个孙菜单第2个子菜单第3个子菜单第3个1级菜单第4个1级菜单第5个1级菜单
结束节点
------------------------------------------------

第2个1级菜单有3个子菜单,子菜单是2级菜单,其中第1个子菜单下面又有2个孙菜单(3级菜单)。

维护菜单,就是维护这个列表,添加删除修改,非常容易。那菜单程序怎么样呢?管他呢。定义好菜单后,通过下面函数运行菜单,

 emenu_run(WJQTestLcd, (MENU *)&WJQTestList[0], sizeof(WJQTestList)/sizeof(MENU), FONT_SONGTI_1616, 2);        

-第1个参数是在哪个LCD上显示菜单, -第2个是菜单列表, -第3个是菜单长度, -第4个四字体, -第5则是行间距

注意:运行这个菜单需要有rtos,因为菜单代码是while(1)的,陷进去就不出来了。需要有其他线程(TASK)维护系统,例如按键扫描。

代码托管在github:https://github.com/wujique/stm32f407/tree/sw_arch

相关文件:emenu.c、emenu.h、emenu_test.c

当前代码: 

1实现了双列菜单,用数字键选择进入下一层。每页最多显示8个菜单(4*4键盘用1-8键)

2 实现了单列菜单,通过上下翻查看菜单,确认键进入菜单。3 天顶菜单未实现,谁有兴趣可以加上。

3 基于LCD驱动架构,这个简易菜单自适应于多种LCD。

效果如下,有需要的尽管拿去,不用谢。

显示效果

128*64 OLED

128*128 tft lcd

320*240 tft lcd

总结

类似菜单在我开发的产品上已经推广使用。经测试,可以明显减少测试程序代码量,节省程序空间。并且易于修改和维护。

1.盘点国内RISC-V内核MCU厂商!

2.嵌入式行业经济发展和欧盟工业发展的晴雨表,你关注了么?

3.一个技术员工的离职成本,到底有多高?

4.新世界,新方式:2021年国际嵌入式展及大会走向数字化

5.扒一扒国产Linux操作系统架构是怎么设计的?

6.人工智能入门:基于Linux与Python的神经网络

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

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

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

相关文章

16款精品Mac平面设计软件,设计师专用,打造设计大作

如果您对自己的设计没有信心&#xff0c;那么您试试这16款精品Mac平面设计软件吧&#xff0c;设计师专用&#xff0c;打造设计大作的良心推荐&#xff0c;无论是新手还是专业的设计师来说&#xff0c;都能快速作创造出满意的作品。 1、Autodesk Sketch Book Autodesk SketchBo…

设计行业不可不知的6个电脑端设计神器

工欲善其事必先利其器&#xff0c;作为战斗在用户体验第一线的 UI 设计师更是如此&#xff0c;对自己的工具一定相当挑剔。毕竟&#xff0c;好用的工具才能够发挥自己100%的实力。下面介绍的这6款设计软件&#xff0c;作为设计师的你如果还未了解&#xff0c;那么绝对不容错过。…

pc ios android,PC、iOS、Android通用的交互设计

本文作者一大坨黄 供职微博UDC设计中心 。近年来&#xff0c;在技术方式&#xff0c;网页自适应的兴起、微软Win8系统的发布&#xff0c;都在试图解决一个问题&#xff1a;让同一产品能在平板、PC等多平台下同时使用。 由此可见&#xff0c;替换掉冗余的多版本开发模式&#xf…

Mac设计的必备设计软件,看看你还差什么

作为设计师而言,人手一台苹果设备大概是人人向往的最佳配置。即使是刚入行业的小白,揣着苹果设备也能让自己看起来像那么一回事儿。不过,真正在设计工作中发挥作用的还是那些优秀的设计软件。让我们来了解一下下面的这些MacOS必备设计软件,看看你还差什么。 1.Figma …

推荐:产品经理都在用的交互软件

这篇文章主要针对还没有入职产品经理&#xff0c;但是对产品经理有兴趣&#xff0c;想要进行了解&#xff0c;以及已经入职&#xff0c;但是没有头绪的一些小伙伴们&#xff0c;为大家分享能够轻松上手的交互软件。 1.Pixso 第一款软件是我在进行交互设计的时候最喜欢使用的设…

MAC 终端美化教程(来个全套)

废话不多&#xff0c;上才艺&#xff08;最终效果图&#xff09; 帅不帅&#xff01;&#xff01;&#xff01; 你说帅 按照此教程咔咔一顿操作后&#xff0c;你将获得以下装逼成就&#xff1a; 1、清晰好看的文字提示格式 2、带有自己最靓照骗的背景图 3、这个很重要&#xf…

html中pc端与移动端区别,盘点移动端和PC端交互设计上的区别

由于屏幕的大小&#xff0c;所以PC端和移动端在信息呈现上有很大不同。但是有的设计师简单地将区别理解为把页面做长一点&#xff0c;让用户多滑动一些。然而这样是不对的&#xff0c;并不能根本理解两者的不同。 终于把书写完&#xff0c;接下来恢复之前的更文频率。这篇文章我…

你一定要知道的5款交互原型设计工具

不管是小白还是大牛&#xff0c;绘制交互原型图是产品经理必备的技能&#xff1b;不管是实习生还是总监&#xff0c;都是从画原型图开始的。好的交互原型图&#xff0c;可以让开发不问一句&#xff0c;就能看得清清楚楚&#xff0c;开发得明明白白&#xff1b;差的交互原型图&a…

一文带你快速设计精美可视化大屏

一文带你快速设计精美可视化大屏 文章目录 一文带你快速设计精美可视化大屏&#x1f468;‍&#x1f3eb;前言&#xff1a;什么是可视化大屏&#x1f468;‍&#x1f52c;内容1&#xff1a;可视化大屏设计原则和设计考虑&#x1f468;‍⚖️内容2&#xff1a;可视化大屏设计流程…

实用交互设计工具大盘点

近年来&#xff0c;页面交互设计有了很好的发展&#xff0c;越来越受到人们的重视。如果你想成为一名页面交互设计师&#xff0c;除了对平面设计和产品设计有一定的了解外&#xff0c;更重要的是要知道哪个软件适合页面交互设计。本文将带您了解5款流行的页面交互设计软件。 1…

支持Mac电脑的五款设计软件,你都装好了么?

随着生活的进步&#xff0c;人们对于精神和生活的需求越来越高&#xff0c;随之而来的就是对于设计的需求。想从事设计行业的人也越来越多&#xff0c;不少UI设计师依靠自己的自学也能够设计出众多令人惊艳的作品。这里我就介绍几款支持Mac电脑的五款设计软件&#xff0c;有需要…

五款支持Mac的设计软件

大学一毕业&#xff0c;我就投身到UI设计行业里&#xff0c;作为非专业出身的设计师&#xff0c;我付出的努力比入行前预想的还要多&#xff0c;就我自己的经验而言&#xff0c;UI设计不仅要有设计功底&#xff0c;同时还要有用户思维&#xff0c;当然&#xff0c;掌握好几款合…

pc端产品设计

目录 一、pc端和移动端的区别 二、pc作用 三、pc端原型设计尺寸 四、网站结构 1、通栏 2、两栏 3、三栏 4、混合 5、瀑布流 五、pc页面设计 A、页面设计——单排导航 B、页面设计——多排导航&#xff08;淘宝、携程&#xff09; C、页面设计——banner D、页面设…

如何让安装微信

打开浏览器&#xff0c;输入链接 可以直接搜索微信官网&#xff0c;也可以直接点击这个链接 https://pc.weixin.qq.com/&#xff0c;把这个链接输入到框中&#xff0c;回车 如图&#xff0c;点击 “立即下载” 第三步 第四步 第五步 第六步 第七步 最后&#xff0c;点击“安装”…

调用SMS腾讯云短信验证码API的几个坑,及详细使用流程

前言 首先说下&#xff0c;几个坑已解决。准备说一下。使用的一些步骤 因为项目有一个短信验证码登录注册的&#xff0c;首先注册的是阿里的。但是审核没有审核通过&#xff0c;所以有注册了腾讯的 本来向截图一下阿里的&#xff0c;结果登录出错了&#xff0c;这里就不说了。…

短信发送接口超详细短信接口使用教程

进入到登陆界面 点击测试号码&#xff0c;添加号码 点击SDK这链接下载他的PythonSDK或者直接点击复制 https://github.com/cloopen/python-sms-sdk 下载SDK 点击下载提供的sdk 下载后解压出文件&#xff0c;使用pycharm打开文件按照要求安装对应的依赖库 在个人控制台上将信息…

CVPR2022会议论文,关于transformer的文献阅读笔记

Transformer文章阅读笔记 Vision Transformer With Deformable Attention. CVPR&#xff0c; 2022. 作者&#xff1a; Zhuofan Xia, Xuran Pan, Shiji Song, Li Erran Li, Gao Huang. Remark: Deformable Attention Transformer. 提出一种可变形自注意力模块&#xff0c;key …

论文阅读:A ConvNet for the 2020s

Abstract SWIN Transformer重新引入了几个ConvNet priors&#xff0c;使得Transformer实际上可以作为通用的视觉主干&#xff0c;并在各种视觉任务上表现出卓越的性能。 然而&#xff0c;这种混合方法的有效性仍然很大程度上归功于变压器的内在优势&#xff0c;而不是卷积的内…

年度汇总!一文了解2021 IEEE Transaction Winner奖19篇论文

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 哈喽艾瑞巴蒂&#xff0c;年关将近&#xff0c;又到了总结过去一年学术成果的时候了。 今天&#xff0c;我们整理了2021 IEEE Transaction 最佳论文合集&#xff01;为大家的文献库添砖加瓦&#xff0c;注入科研…

OpenChatPaper | 你值得拥有的论文阅读小助手!~(粉丝投稿)

1写在前面 最近开始天气转暖了&#xff0c;不知道大家那里的树有没有绿&#xff0c;花有没有开。&#x1f61d; 旅游的人越来越多了&#xff0c;多到早上去吃个馄饨都要排队了&#xff0c;不过总得来说一个城市还是要有人间烟火气啊。&#x1f972; 之前给大家推荐了chatPDF来帮…