电子发烧友App

硬声App

扫码添加小助手

加入工程师交流群

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

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

3天内不再提示
电子发烧友网>电子资料下载>可编程逻辑>单片机实例:一个用单色屏做的菜单框架资料下载

单片机实例:一个用单色屏做的菜单框架资料下载

2021-03-27 | pdf | 699.36KB | 次下载 | 3积分

资料介绍

不知道有多少人折腾过液晶显示的菜单,我觉得很多人都应该搞过,我还记得以前大学参加电子设计竞赛获奖的作品,我就用到了一个12864,里面有菜单功能。


以前可能觉得菜单高大上,其实并不是想象中的复杂,本文为大家分享一个用单色屏做的菜单框架。


概述

代码托管在github:

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


本处所说的菜单是用在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 子节点必须跟父节点,类似下面结构

-----------------------------------------------
根节点
        第11级菜单
                       第1个子菜单
                       第2个子菜单
                       第3个子菜单
        第21级菜单
                       第1个子菜单
                                     第1个孙菜单
                                     第2个孙菜单
                       第2个子菜单
                       第3个子菜单
        第31级菜单
        第41级菜单
        第51级菜单
结束节点
------------------------------------------------

第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)维护系统,例如按键扫描。



菜单实现效果

相关文件: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


最后说明

以上菜单框架来源屋脊雀工作室,适合初学者练习。我看下这个菜单框架,其实还有很多改进地方。


我当初大学电子设计竞赛用到类似结构体方式,但我那菜单框架用到了二级指针,可以做到无限极扩展,而且可以指向(跳转)任意菜单,方便按键进入、返回等操作。


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

(mbbeetchina)
软件开发 C语言 编程 程序
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1MDD品牌三极管MMBT3906数据手册
  2. 2.33 MB  |  次下载  |  免费
  3. 2MDD品牌三极管S9012数据手册
  4. 2.62 MB  |  次下载  |  免费
  5. 3联想flex2-14D/15D说明书
  6. 4.92 MB   |  次下载  |  免费
  7. 4收音环绕扩音机 AVR-1507手册
  8. 2.50 MB   |  次下载  |  免费
  9. 524Pin Type-C连接器设计报告
  10. 1.06 MB   |  次下载  |  免费
  11. 6新一代网络可视化(NPB 2.0)
  12. 3.40 MB  |  次下载  |  免费
  13. 7MS1000TA 超声波测量模拟前端芯片技术手册
  14. 0.60 MB   |  次下载  |  免费
  15. 8MS1022高精度时间测量(TDC)电路数据手册
  16. 1.81 MB   |  次下载  |  免费

本月

  1. 1爱华AIWA HS-J202维修手册
  2. 3.34 MB   |  37次下载  |  免费
  3. 2PC5502负载均流控制电路数据手册
  4. 1.63 MB   |  23次下载  |  免费
  5. 3NB-IoT芯片厂商的资料说明
  6. 0.31 MB   |  22次下载  |  1 积分
  7. 4H110主板CPU PWM芯片ISL95858HRZ-T核心供电电路图资料
  8. 0.63 MB   |  6次下载  |  1 积分
  9. 5UWB653Pro USB口测距通信定位模块规格书
  10. 838.47 KB  |  5次下载  |  免费
  11. 6技嘉H110主板IT8628E_BX IO电路图资料
  12. 2.61 MB   |  4次下载  |  1 积分
  13. 7苏泊尔DCL6907(即CHK-S007)单芯片电磁炉原理图资料
  14. 0.04 MB   |  4次下载  |  1 积分
  15. 8100W准谐振反激式恒流电源电路图资料
  16. 0.09 MB   |  2次下载  |  1 积分

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935137次下载  |  10 积分
  3. 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
  4. 1.48MB  |  420064次下载  |  10 积分
  5. 3Altium DXP2002下载入口
  6. 未知  |  233089次下载  |  10 积分
  7. 4电路仿真软件multisim 10.0免费下载
  8. 340992  |  191439次下载  |  10 积分
  9. 5十天学会AVR单片机与C语言视频教程 下载
  10. 158M  |  183353次下载  |  10 积分
  11. 6labview8.5下载
  12. 未知  |  81602次下载  |  10 积分
  13. 7Keil工具MDK-Arm免费下载
  14. 0.02 MB  |  73822次下载  |  10 积分
  15. 8LabVIEW 8.6下载
  16. 未知  |  65991次下载  |  10 积分