分享一个产品级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; .... } } }
- 管得太宽 菜单,你就管菜单切换就行了,到了最低一层,也就是实际的测试功能,就不要管了。菜单切换是类似的,实际测试都是不同的。比如在菜单中,按键1,是进入第一个菜单。但是在测试中,按键1,功能都不一样。如果菜单连这个也要管,相同动作功能太多,无法进行统一抽象,就很难模块化。
- 出发点不一样 上面说到的菜单,出发点都是如何设计一个好的菜单数据结构,让程序快速,高效运行。我想要的却是一个容易维护的菜单结构,至于菜单的代码有多乱多纠结,没关系, 而且,几百上千个菜单,就算用轮询的方法,也不过几百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个1级菜单 第1个子菜单 第2个子菜单 第3个子菜单 第2个1级菜单 第1个子菜单 第1个孙菜单 第2个孙菜单 第2个子菜单 第3个子菜单 第3个1级菜单 第4个1级菜单 第5个1级菜单 结束节点 ------------------------------------------------
emenu_run(WJQTestLcd, (MENU *)&WJQTestList[0], sizeof(WJQTestList)/sizeof(MENU), FONT_SONGTI_1616, 2);
显示效果
128*64 OLED
128*128 tft lcd
320*240 tft lcd
总结
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!