在单片机设计中,往往需要在显示屏上显示多级操作菜单,每级菜单都有一些菜单项和对应的按键操作,以及为响应各种操作而执行的后续处理程序。参考文献以函数指针为结构元素,把整个菜单结构拉伸成一个结构数组,内部包含了全部菜单项。这种方法没有将菜单项数据与功能函数分开设计,而把菜单项数据写在功能函数中,当菜单项数据需要改变时,必须修改功能函数,这在很大程度上限制了程序的通用性,不利于程序的维护。参考文献在前者的基础上略加改进,在原结构体中增加了菜单项显示文字和按键复用标识,这使得结构体较为庞大,且菜单项的文字内容非常固定,保存在EEPROM中,无法灵活改变显示内容和位置。参考文献引入Windows系统下的窗口和消息机制实现多级菜单设计,该方法需要维护堆栈、消息队列和窗口定时器等,设计过于复杂。
本文旨在提供一个轻量级的单片机多级菜单实现方法,以较少的系统资源消耗和简单方便的方法完成菜单设计。考虑到菜单程序需要具备3个基本要素:一是每个菜单窗口要显示的内容;二是每个窗口对应的按键定义与响应;三是窗口内菜单项之间切换和窗口之间的切换机制。因此,将菜单分为菜单窗口模块和键盘处理模块两部分,独立进行设计。
1 菜单窗口模块设计
菜单窗口模块主要功能是按照菜单窗口切换机制,实时完成窗口的显示控制。
1.1 菜单窗口切换机制
菜单窗口切换机制包括两点:一是不同窗口之间切换效果的实现;二是窗口内的同级菜单项之间滚动切换效果的实现。为实现上述功能,定义了两个结构体MenuState和MenuItEMS。MenuState定义如下:
MenuState是一个与窗口跳转和窗口显示有关的结构体数组,用于全局调度各窗口之间的切换。其中,CurIndex是窗口的索引值,用来标识当前窗口。UPINdex、DnIndex、BackIndex用来标识当有“上页”、“下页”、“返回”按键操作时,程序应转向的窗口。其取值为255时,表示无转向窗口,取值在0~254时表示要转向的窗口索引,因此本设计可支持255个菜单窗口,足以满足工程应用需要。CurOperate是函数指针,用来指向当显示当前窗口时,应执行的窗口显示控制程序,以实现窗口的显示。
MenuItems是一个菜单项结构体,用以保存当前窗口的全部菜单项的显示位置和内容,这个结构体的内容是随着窗口的切换,在新窗口初始化过程中被更新的。这样就满足了窗口的切换和菜单项之间反显滚动的需要。由于只保存与当前窗口有关的菜单项,因此,该结构体的系统资源消耗很小。
Items包含了当前窗口内的所有菜单项,考虑到有的菜单项是没有转向窗口的,所以对应这种菜单项设置该值为255。当显示一个窗口时,Items会被填入当前窗口的菜单项信息,并且填写时是按照菜单项的先后顺序依次构建的。这样当有“上移”、“下移”按键操作时,就可迅速找到目标行,并反显该行。
1.2 菜单窗口显示控制
窗口显示部分是将每一个菜单窗口都以一个独立命名的函数形式封装,函数里包括对Items进行赋值,在显示屏指定位置显示当前窗口的菜单项,以及根据需要完成画点、画线、画按钮等绘图操作。这些函数彼此功能独立,分别对应不同的菜单窗口,仅在窗口切换时赋予CurOperate即可,因此非常适合多人合作开发。
需要说明的是,菜单窗口的显示控制是基于显示屏的,工程中常用的是TFT屏或点阵液晶屏,使用时需要实现显示屏的驱动程序,对屏进行初始化、读、写等操作,由于不是本文重点,因此这部分内容略过。
2 键盘处理模块设计
单片机的菜单操作多是以按键形式完成的,一般会有多个按键,分别对应不同功能。此外,也要考虑按键复用问题,也就是说,同一位置的按键在不同窗口内可能会有不同的功能定义,因此,要在程序中对按键进行采集、解析键值,以正确响应操作。按键处理的流程如图1所示。
例如当按下“上页”按键时,程序会接收到按键,根据当前所处的窗口解析该键定义,判断为“上页”;然后在窗口结构体数组Menu Index中取得要转向窗口的索引值,根据索引值取得该窗口显示控制程序的指针,并释放菜单项结构体ItEMS,执行该窗口显示控制程序。代码如下:
3 应用实例
在某装备模拟项目中,以AT89C52芯片为核心器件,显示部分采用图形点阵液晶显示模组HG3202405V2-B-LWH-LV,外部复合功能按键6个,实现菜单设计。部分代码如下:
主菜单窗口如图2所示。
结语
单片机的多级菜单设计是项目开发中较为常见的问题,本文给出了解决方案并在项目中得到应用。其特点表现在两个方面:一是系统开销小,仅靠MenuState和MenuItEMS两个结构体和几个变量即可维护各窗口和窗口内的同级菜单项;二是模块各部分功能独立性强,各菜单窗口的显示控制程序彼此独立、互不影响,键盘处理程序也自成一体。因此,该方案模块化程度高,开发过程简单方便,扩展性好,可移植性强,适于团队合作开发和维护。
上一篇:飞机航向控制系统仿真动态模型平台的设计
下一篇:基于AT89S52单片机及CPLD的多间隔脉冲产生电路设计
推荐阅读最新更新时间:2024-03-16 15:58
设计资源 培训 开发板 精华推荐
- 睿瀚医疗万斌:“脑机接口+AI+机器人”是康复赛道的未来
- 希润医疗孟铭强:手功能软体机器人,让脑卒中患者重获新生
- 柔灵科技陈涵:将小型、柔性的脑机接口睡眠设备,做到千家万户
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度