0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

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

技术让梦想更伟大 来源:屋脊雀工作室 2023-09-07 09:34 次阅读

来源:屋脊雀工作室

大家好,今天分享一个用单色屏做的菜单框架。代码托管在github:

https://github.com/wujique/stm32f407/tree/sw_arch

1、概述

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

a67afbb6-4d12-11ee-a25d-92fbcf53809c.png

2、菜单框架设计

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

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

voidtest_main(void)
{
while(1)
{
get_key(&key);

switch(key)
{
case1:
test_key();
break;

case2:
test_lcd();
break;
....
}
}
}

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

作为一个天天看《编程之美》的码农,决定改变现状。搜索引擎找了很久,找到了两个参考:《基于二叉树的多层的液晶菜单界面设计》 《基于节点编号的通用树状菜单设计方法与实现.pdf》 按照他们的设计方法,鼓捣了一个版本,能用,挺好,但是也纠结。

因为他们用了树这种数据结构。对于程序运行来说,非常好,效率高。但是对于我来说,菜单代码是一次性的,但是菜单内容,却是会经常改的。让我用人脑去维护一个包含几十个上百个菜单的树,不容易。

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

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

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

3、改进菜单

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

/**
*@brief菜单对象
*/
typedefstruct_strMenu
{
MenuLell;///<菜单等级
    char cha[MENU_LANG_BUF_SIZE];   ///中文
    char eng[MENU_LANG_BUF_SIZE];   ///英文
    MenuType type;  ///菜单类型
    s32 (*fun)(void);  ///测试函数

}MENU;

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

constMENUEMenuListTest[]=
{
MENU_L_0,//菜单等级
"测试程序",//中文
"test",//英文
MENU_TYPE_LIST,//菜单类型
NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行

MENU_L_1,//菜单等级
"LCD",//中文
"LCD",//英文
MENU_TYPE_LIST,//菜单类型
NULL,//菜单函数,功能菜单才会执行,有子菜单的不会执行
MENU_L_2,//菜单等级
"VSPIOLED",//中文
"VSPIOLED",//英文
MENU_TYPE_FUN,//菜单类型
test_oled,//菜单函数,功能菜单才会执行,有子菜单的不会执行

MENU_L_2,//菜单等级
"I2COLED",//中文
"I2COLED",//英文
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音乐",//中文
"DACmusic",//英文
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)维护系统,例如按键扫描。

4、菜单实现效果

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

当前代码:

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

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

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

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

5、显示效果

a6837e26-4d12-11ee-a25d-92fbcf53809c.png

128*64 OLED

a69fc8ba-4d12-11ee-a25d-92fbcf53809c.png

128*64 OLED


a6d8aff4-4d12-11ee-a25d-92fbcf53809c.png

128*128 tft lcd

a6ec171a-4d12-11ee-a25d-92fbcf53809c.png

128*128 tft lcd

a6f9ce78-4d12-11ee-a25d-92fbcf53809c.png


320*240 tft lcd


a703574a-4d12-11ee-a25d-92fbcf53809c.png

320*240 tft lcd

6、最后

本文就分享到这里,感兴趣的读者可以自己写一个菜单框架。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16977

    浏览量

    350215
  • 程序
    +关注

    关注

    116

    文章

    3773

    浏览量

    80830
  • GUI
    GUI
    +关注

    关注

    3

    文章

    648

    浏览量

    39534
  • GitHub
    +关注

    关注

    3

    文章

    466

    浏览量

    16380

原文标题:一个产品级MCU菜单框架设计

文章出处:【微信号:技术让梦想更伟大,微信公众号:技术让梦想更伟大】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    12864液晶使用教程分享 基于MCU菜单框架设计方案

    12864里面有菜单功能。 以前可能觉得菜单高大上,其实并不是想象中的复杂,本文为大家分享用单色屏做的
    发表于 02-19 17:29 9993次阅读
    12864液晶使用教程分享 基于<b class='flag-5'>MCU</b><b class='flag-5'>菜单</b><b class='flag-5'>框架设</b>计方案

    STM32F407的HAL库框架设

    第12章 STM32F407的HAL库框架设计学习通过本章节,主要是想让大家对HAL库程序设计的基本套路有了解,防止踩坑。目录第12章 STM32F407的HAL库框架设计学习12.1 初学者重要
    发表于 08-10 06:23

    如何设计产品级MCU菜单框架

    声明:本处所说的菜单是用在128*64这种小屏幕的菜单,例如下面这种,不是彩屏上的GUI。作为底层驱动工程师,驱动写完了,是要写硬件测试程序的。这个测试程序,
    发表于 11-04 06:43

    分享产品级MCU菜单框架设

    发表于 11-10 06:23

    怎么实现ThreadX内核模板框架设计?

    怎么实现ThreadX内核模板框架设计?
    发表于 11-29 07:45

    在码云/Github/CSDN上收藏的嵌入式产品级项目分享

    1、MCU产品级项目收集早年活跃在CSDN上的时候,我曾拥有不少积分下载了很多产品级的资源,这些年我也在这些产品级的项目上学习了很多编码技能和产品
    发表于 12-24 06:26

    分享产品级的红外发射电路

    分享产品级的红外发射电路
    发表于 01-17 08:53

    简单实用的MCU程序框架介绍

    简单实用的MCU程序框架(非操作系统,简单调度任务) - 总体介绍 单片机程序,总体上可分为跑操作系统的和没操作系统,对于无MMU的小单片机,操作系统通常是UCOS、RTOS等实时
    发表于 02-11 06:21

    基于GIS的城乡公交系统框架设计与实现

    本文在分析建立城乡公交信息系统意义的基础上,通过详细调研城乡公交工作需求,规划和设计了基于GIS 的城乡公交信息系统的框架设计,功能结构,并根据系统功能需要,在简
    发表于 12-19 14:12 8次下载

    基于CAN总线的通讯系统软件框架设

    基于CAN总线的通讯系统软件框架设
    发表于 01-24 16:54 21次下载

    产品级MCU菜单框架设计~

    声明:本处所说的菜单是用在128*64这种小屏幕的菜单,例如下面这种,不是彩屏上的GUI。作为底层驱动工程师,驱动写完了,是要写硬件测试程序的。这个测试程序,
    发表于 10-29 11:20 15次下载
    <b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>产品级</b><b class='flag-5'>MCU</b><b class='flag-5'>菜单</b><b class='flag-5'>框架设</b>计~

    产品级MCU菜单框架设

    关注+星标公众号,不错过精彩内容转自 | 嵌入式云IOT技术圈微信公众号|嵌入式专栏不知道有多少人折腾过液晶显示的菜单,我觉得很多人都应该搞过,我还记得以前大学参加电子设计竞赛获奖的...
    发表于 11-05 15:51 38次下载
    <b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>产品级</b><b class='flag-5'>MCU</b><b class='flag-5'>菜单</b><b class='flag-5'>框架设</b>计

    基于WebRTC开源MCU框架的横向对比

    基于WebRTC开源MCU框架的横向对比
    发表于 12-05 10:06 7次下载
    三<b class='flag-5'>个</b>基于WebRTC开源<b class='flag-5'>MCU</b><b class='flag-5'>框架</b>的横向对比

    产品级MCU菜单框架设

    作为底层驱动工程师,驱动写完了,是要写硬件测试程序的。这个测试程序,般给测试部/硬件工程师用来测试硬件, 也会给工厂产线测试准成品。
    发表于 02-08 16:09 2次下载
    <b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>产品级</b><b class='flag-5'>MCU</b><b class='flag-5'>菜单</b><b class='flag-5'>框架设</b>计

    基于LCD驱动架构的MCU菜单框架设

    当前代码: 1实现了双列菜单,用数字键选择进入下层。每页最多显示8菜单(4*4键盘用1-8键) 2 实现了单列菜单,通过上下翻查看
    发表于 10-11 14:51 1304次阅读
    基于LCD驱动架构的<b class='flag-5'>MCU</b><b class='flag-5'>菜单</b><b class='flag-5'>框架设</b>计