原创 基于单片机的任意菜单结构设计

2009-11-4 17:25 7840 10 17 分类: MCU/ 嵌入式

在单片机系统的人机界面设计中,通常需要采用菜单的方式来与用户交互信息,而对于某些应用系统它的菜单结构比较特殊,它每个菜单项的子项长度不一致,级数不一致,而且有些子项的操作具备一定的特殊性;因此不能采用一种通用的菜单结构模板来进行菜单的设计,结合作者多次菜单程序设计的工作经验,本文描述了一种任意菜单结构的设计方法,首先将菜单的结构目录树用图形描述出来,再给每个不同的级和同级不同的项设定一个唯一的标志,这样我们就能通过级标志位与项标志位的逻辑组合来得到一个唯一的位置,那么在代码的编写中只要对这些标志位按照图形的流程进行切换、读和写便可。


具体方法如下:


首先我们将菜单结构的图形描绘出来,再根据菜单的级数来定义一个结构体,比如菜单最大有5级,则这样定义


typedef struct


{


    unsigned char f;   //菜单所在级数


    unsigned char s1;   //菜单第1级下的子项号


    unsigned char s2;   //菜单第2级下的子项号


    unsigned char s3;   //菜单第3级下的子项号


    unsigned char s4;   //菜单第4级下的子项号


    unsigned char s5;   //菜单第5级下的子项号 


    


}Menu_TypeDef;


Menu_TypeDef  menu;


再将这些变量的值标定在绘制的菜单图形中,如下图所示:


88eb991f-8175-40c9-b799-2433fdfb9470.JPG


menu.f=1并且menu.s1=0表示第一级第一项;


menu.f=2并且menu.s1=3表示第二级第四项;


依此类推;


于是,菜单的每一个位置都会有一个唯一的值与之对应,当菜单的选项由用户切换时,我们只需要根据菜单结构图形的流程来修改这些变量,而当需要查询当前菜单指针选中哪一项时,则只要查询这些变量的值即可。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


由于各级菜单的变量都是独立的,因此对菜单的结构没有限制,适用于设计任意结构的菜单,如果当菜单级数较多,定义的菜单变量较多时,也不要紧,因为我们的菜单设计是先绘制菜单结构图形,再根据图形来编写代码,实际上就是根据图形的描述往代码里填值罢了。


经实践证明,采用以上方法能完全适用于所有任意结构菜单设计,而且该方法的优点在于,有了图形的描述,不仅减化了代码编写的难度,而且还有利于代码维护,提高代码的可读性。


 


符件里是一个不规则结构的菜单测试程序,基于AVR单片机,通过按键来选择,菜单的图形界面在PC机的超级终端上显示,欢迎广大网友测试,并讨论。


https://static.assets-stash.eet-china.com/album/old-resources/2009/11/4/7fde5ee4-922b-4ad9-b7bb-039165448030.rar

 

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户377235 2016-5-6 22:53

谢谢分享!!!

用户377235 2016-1-23 20:08

其实,可以做成二级菜单,或者树型结构,俺做了一个,开源的。虽然目前还不是很多demo,欢迎使用,欢迎反馈 http://bbs.eeworld.com.cn/thread-480839-1-1.html

用户248933 2012-10-30 16:29

打算仔细看看。

用户377235 2011-12-1 18:50

学习啦

用户1278632 2009-11-19 13:59

本人写的这种菜单结构,不适合直接移植,因为它是一种定制的菜单,不能通用。但它重建和维护很容易,前提是需要搞清楚这种菜单的结构。

用户1278632 2009-11-19 13:46

这个也不错,典型的四键菜单程序,可读和可移植性都比较好,但它这种结构不适合插入一些功能处理函数,比如通过菜单来操作执行某个算法、控制某个外设等等,还有就是不能按键复用,UP就只能当UP,DOWN就只能当DOWN,但有时候还需要当+和-来使用的。这是属于我前面提到的“子项的操作不具备特殊性”的通用菜单结构

用户545084 2009-11-10 12:09

好啊,好啊
相关推荐阅读
用户1278632 2011-09-15 12:49
解决FPGA配置成功,但不能初始化运行的BUG
摘要:    遇到两次FPGA配置完成,却不能正常运行的问题,一次是ALTERA的A1C3,另一次是XILINX的XC3S700A。两次都是DONE信号的问题。问题虽不大,但却很折腾人,今天在这里作下...
用户1278632 2011-09-15 12:41
Code Edit的神器UltraEdit
摘要:      我不是一个专职的程序员,但经常会要写一些单片机底层的code和hdl code,起初用UE,是因为查找和批量修改很方便,而且不会额外的生成一些“垃圾”文件;现在用UE三年多了,一直都...
用户1278632 2010-12-29 09:29
ISE与EDK联合设计报错 ERROR:NgdBuild:604 logical block
做一个很简单的测试在ISE的SCH里调用EDK的symbol,EDK的功能也很简单,就是CPU通过串品打印一串字符首先,我建一个ISE工程再建一source  sch类型,并设置为顶层,取名为top....
用户1278632 2010-12-22 14:49
EDK12.2中 mch_emc IP的时序问题
mch_emc IP可以将PLB总线时序转为inter 8080时序 下面是我用chipscope抓到的波形Mem_DQ_O_In :  数据输入 Mem_OEN:      读信号  Mem_A: ...
用户1278632 2010-12-22 14:29
xilinx FPGA的配制与应用程序引导-范例
两个Xilinx FPGA应用程序引导的范例1、run_in_flash是直接在NOR FLASH里运行程序2、spi_flash_boot是将BIT和bootloader和APP全部固化到SPI F...
用户1278632 2010-12-19 13:48
EDK下sram IP的使用
EDK软件的memory and memory controller中有一个xps multi-channel external memory controller(sram/flash)的IP,用来...
EE直播间
更多
我要评论
7
10
关闭 站长推荐上一条 /3 下一条