在单片机设计中,往往需要在显示屏上显示多级操作菜单,每级菜单都有一些菜单项和对应的按键操作,以及为响应各种操作而执行的后续处理程序。参考文献以函数指针为结构元素,把整个菜单结构拉伸成一个结构数组,内部包含了全部菜单项。这种方法没有将菜单项数据与功能函数分开设计,而把菜单项数据写在功能函数中,当菜单项数据需要改变时,必须修改功能函数,这在很大程度上限制了程序的通用性,不利于程序的维护。参考文献在前者的基础上略加改进,在原结构体中增加了菜单项显示文字和按键复用标识,这使得结构体较为庞大,且菜单项的文字内容非常固定,保存在EEPROM中,无法灵活改变显示内容和位置。参考文献引入Windows系统下的窗口和消息机制实现单片机开发多级菜单设计,该方法需要维护堆栈、消息队列和窗口定时器等,设计过于复杂。 本文在提供一个轻量级的单片机多级菜单实现方法,以较少的系统资源消耗和简单方便的方法完成菜单设计。考虑到菜单程序需要具备3个基本要素:一是每个菜单窗口要显示的内容;二是每个窗口对应的按键定义与响应;三是窗口内菜单项之间切换和窗口之间的切换机制。因此,将菜单分为菜单窗口模块和键盘处理模块两部分,独立进行设计。 菜单窗口模块设计 菜单窗口模块主要功能是按照菜单窗口切换机制,实时完成窗口的显示控制。 1 菜单窗口切换机制 菜单窗口切换机制包括两点:一是不同窗口之间切换效果的实现;二是窗口内的同级菜单项之间滚动切换效果的实现。为实现上述功能,定义了两个结构体MenuState和MenuItEMS。MenuState定义如下: Items包含了当前窗口内的所有菜单项,考虑到有的菜单项是没有转向窗口的,所以对应这种菜单项设置该值为255。当显示一个窗口时,Items会被填入当前窗口的菜单项信息,并且填写时是按照菜单项的先后顺序依次构建的。这样当有“上移”、“下移”按键操作时,就可迅速找到目标行,并反显该行。 2 菜单窗口显示控制 窗口显示部分是将每一个菜单窗口都以一个独立命名的函数形式封装,函数里包括对Items进行赋值,在显示屏指定位置显示当前窗口的菜单项,以及根据需要完成画点、画线、画按钮等绘图操作。这些函数彼此功能独立,分别对应不同的菜单窗口,仅在窗口切换时赋予CurOperate即可,因此非常适合多人合作开发。 需要说明的是,菜单窗口的显示控制是基于显示屏的,工程中常用的是TFT屏或点阵液晶屏,使用时需要实现显示屏的驱动程序,对屏进行初始化、读、写等操作,由于不是本文重点,因此这部分内容略过。 3键盘处理模块设计 4应用实例 主菜单窗口如图所示。
结语 单片机的多级菜单设计是项目开发中较为常见的问题,本文给出了解决方案并在项目中得到应用。其特点表现在两个方面:一是系统开销小,仅靠MenuState和MenuItEMS两个结构体和几个变量即可维护各窗口和窗口内的同级菜单项;二是模块各部分功能独立性强,各菜单窗口的显示控制程序彼此独立、互不影响,键盘处理程序也自成一体。因此,该方案模块化程度高,开发过程简单方便,扩展性好,可移植性强,适于团队合作开发和维护。 |