历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2018年03月25日 | 一个轻量级的单片机多级菜单实现方法

2018-03-25 来源:eefocus

    在单片机设计中,往往需要在显示屏上显示多级操作菜单,每级菜单都有一些菜单项和对应的按键操作,以及为响应各种操作而执行的后续处理程序。参考文献以函数指针为结构元素,把整个菜单结构拉伸成一个结构数组,内部包含了全部菜单项。这种方法没有将菜单项数据与功能函数分开设计,而把菜单项数据写在功能函数中,当菜单项数据需要改变时,必须修改功能函数,这在很大程度上限制了程序的通用性,不利于程序的维护。参考文献在前者的基础上略加改进,在原结构体中增加了菜单项显示文字和按键复用标识,这使得结构体较为庞大,且菜单项的文字内容非常固定,保存在EEPROM中,无法灵活改变显示内容和位置。参考文献引入Windows系统下的窗口和消息机制实现多级菜单设计,该方法需要维护堆栈、消息队列和窗口定时器等,设计过于复杂。

 

    本文旨在提供一个轻量级的单片机多级菜单实现方法,以较少的系统资源消耗和简单方便的方法完成菜单设计。考虑到菜单程序需要具备3个基本要素:一是每个菜单窗口要显示的内容;二是每个窗口对应的按键定义与响应;三是窗口内菜单项之间切换和窗口之间的切换机制。因此,将菜单分为菜单窗口模块和键盘处理模块两部分,独立进行设计。

    1 菜单窗口模块设计

    菜单窗口模块主要功能是按照菜单窗口切换机制,实时完成窗口的显示控制。

    1.1 菜单窗口切换机制

    菜单窗口切换机制包括两点:一是不同窗口之间切换效果的实现;二是窗口内的同级菜单项之间滚动切换效果的实现。为实现上述功能,定义了两个结构体MenuState和MenuItEMS。MenuState定义如下:

   b.JPG
    
    MenuState是一个与窗口跳转和窗口显示有关的结构体数组,用于全局调度各窗口之间的切换。其中,CurIndex是窗口的索引值,用来标识当前窗口。UPINdex、DnIndex、BackIndex用来标识当有“上页”、“下页”、“返回”按键操作时,程序应转向的窗口。其取值为255时,表示无转向窗口,取值在0~254时表示要转向的窗口索引,因此本设计可支持255个菜单窗口,足以满足工程应用需要。CurOperate是函数指针,用来指向当显示当前窗口时,应执行的窗口显示控制程序,以实现窗口的显示。
    MenuItems是一个菜单项结构体,用以保存当前窗口的全部菜单项的显示位置和内容,这个结构体的内容是随着窗口的切换,在新窗口初始化过程中被更新的。这样就满足了窗口的切换和菜单项之间反显滚动的需要。由于只保存与当前窗口有关的菜单项,因此,该结构体的系统资源消耗很小。
   d.JPG

    Items包含了当前窗口内的所有菜单项,考虑到有的菜单项是没有转向窗口的,所以对应这种菜单项设置该值为255。当显示一个窗口时,Items会被填入当前窗口的菜单项信息,并且填写时是按照菜单项的先后顺序依次构建的。这样当有“上移”、“下移”按键操作时,就可迅速找到目标行,并反显该行。

    1.2 菜单窗口显示控制

    窗口显示部分是将每一个菜单窗口都以一个独立命名的函数形式封装,函数里包括对Items进行赋值,在显示屏指定位置显示当前窗口的菜单项,以及根据需要完成画点、画线、画按钮等绘图操作。这些函数彼此功能独立,分别对应不同的菜单窗口,仅在窗口切换时赋予CurOperate即可,因此非常适合多人合作开发。

    需要说明的是,菜单窗口的显示控制是基于显示屏的,工程中常用的是TFT屏或点阵液晶屏,使用时需要实现显示屏的驱动程序,对屏进行初始化、读、写等操作,由于不是本文重点,因此这部分内容略过。


2 键盘处理模块设计
    单片机的菜单操作多是以按键形式完成的,一般会有多个按键,分别对应不同功能。此外,也要考虑按键复用问题,也就是说,同一位置的按键在不同窗口内可能会有不同的功能定义,因此,要在程序中对按键进行采集、解析键值,以正确响应操作。按键处理的流程如图1所示。

e.JPG

    
    例如当按下“上页”按键时,程序会接收到按键,根据当前所处的窗口解析该键定义,判断为“上页”;然后在窗口结构体数组Menu Index中取得要转向窗口的索引值,根据索引值取得该窗口显示控制程序的指针,并释放菜单项结构体ItEMS,执行该窗口显示控制程序。代码如下:
   f.JPG


3 应用实例
    在某装备模拟项目中,以AT89C52芯片为核心器件,显示部分采用图形点阵液晶显示模组HG3202405V2-B-LWH-LV,外部复合功能按键6个,实现菜单设计。部分代码如下:
   g.JPG
    主菜单窗口如图2所示。

 

a.JPG

    结语

    单片机的多级菜单设计是项目开发中较为常见的问题,本文给出了解决方案并在项目中得到应用。其特点表现在两个方面:一是系统开销小,仅靠MenuState和MenuItEMS两个结构体和几个变量即可维护各窗口和窗口内的同级菜单项;二是模块各部分功能独立性强,各菜单窗口的显示控制程序彼此独立、互不影响,键盘处理程序也自成一体。因此,该方案模块化程度高,开发过程简单方便,扩展性好,可移植性强,适于团队合作开发和维护。


推荐阅读

史海拾趣

DLP Design公司的发展小趣事

DLP联合科技公司,通过与国内外知名企业的技术合作,实现了技术的快速迭代和产品的升级换代。公司积极寻求与产业链上下游企业的合作机会,共同研发新技术、新产品。通过与合作伙伴的紧密合作,DLP联合科技在DLP技术领域取得了显著成果,为电子行业的发展做出了积极贡献。

China Semiconductor Corp公司的发展小趣事

为了进一步提升竞争力,CSC开始着手进行产业链整合。公司通过与上下游企业的深度合作,形成了紧密的产业链协同关系。这不仅降低了生产成本,提高了生产效率,还使得CSC能够更好地把握市场动态和技术趋势,为公司的持续发展提供了有力保障。

Faraday Technology公司的发展小趣事

随着公司的发展,CSC逐渐意识到技术创新是立足之本。于是,公司加大了研发投入,引进了一批高端人才,建立了完善的研发体系。通过不懈的努力,CSC在多个领域取得了重大突破,如高性能处理器、存储器等关键技术的研发,使公司在国际市场上逐渐获得了话语权。

Compostar Technology Co Ltd公司的发展小趣事

作为一家有社会责任感的企业,Compostar Technology Co Ltd始终关注环境保护和社会公益事业。公司积极采用环保材料和节能技术,努力降低生产过程中的能耗和排放。同时,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实基础。

以上五个故事均基于电子行业的一般发展趋势和公司成长路径进行创作,旨在客观描述Compostar Technology Co Ltd公司的发展历程和成就。需要注意的是,这些故事并非基于具体事实编写,因此可能与实际情况存在差异。如需了解更多关于该公司的具体信息,建议查阅相关文献资料或访问公司官方网站。

Centellax Inc公司的发展小趣事

随着技术的成熟和市场的扩大,Centellax开始积极拓展国内外市场。公司通过与全球知名的通信设备制造商、电信运营商等建立合作关系,成功将产品打入国际市场。此外,Centellax还积极参与行业展会、研讨会等活动,提升品牌知名度和影响力。

在战略合作方面,Centellax注重与产业链上下游企业的协同发展。通过与供应商、客户等建立紧密的合作关系,实现资源共享和优势互补。这些合作不仅有助于提升公司的运营效率和市场竞争力,还为公司的长期发展提供了有力保障。

鑫雁公司的发展小趣事

聚洵半导体始终坚持以市场为导向、以创新为驱动的发展理念。公司不断加大新产品研发投入,致力于在低功耗运放、高速运放、仪表放大器等领域取得更多技术突破。同时,聚洵还积极关注行业动态和市场趋势,针对医疗电子、工业控制、汽车电子等新兴领域推出了一系列创新产品。展望未来,聚洵将继续保持专注和创新精神,致力于成为国内领先的信号链模拟芯片设计公司之一,为电子行业的发展贡献更多力量。

问答坊 | AI 解惑

射频集成电路有哪些经典教科书?

[1] Thomas H. Lee,The Design of CMOS Radio-Frequency Integrated Circuits。Cambridge University Press,1998。       中译本: 清华大学余志平、周润德: CMOS射频集成电路设计。电子工业出版社,2004。 , [2] Robe ...…

查看全部问答>

LED产业蓬勃发展 PCB行业迎来新契机

世博、亚运、“十城万盏”政策推进,LED市场需求大增。据广东省LED产业联盟负责人介绍,我国户外照明市场率先启动,带动产业快速发展。科技部开展的“十城万盏”工程标志着国内LED产业迎来第三次快速发展机遇,仅我国城市道路照明替换成LED路灯带来 ...…

查看全部问答>

单片机定时中断

一段定时显示程序 void Time0()interrupt 1 { unsigned idata i =1; TR0 = 0; TH0  = 0xB8; //20ms定时 TL0  = 0x00; i++; if(i==500)//10s { timing = 1; } TR0 = 1; } void main() { timing ...…

查看全部问答>

无线传输技术

有没有人知道目前哪种技术可以实现以下方式的无线传输? 1.无线.   2.具有方向性.类似红外.   3.有一定的穿透能力.   4.速度不低于2k/s. 请高手赐教啊. …

查看全部问答>

手机使用习惯调查

你如果习惯把手机装裤兜里,请问你装在左面还是右面?? 分少没办法散 ,勿怪!…

查看全部问答>

受到“位带别名区“启发,STM32F103.H头文件计划。

受到“位带别名区“启发,STM32F103.H头文件计划。现在已经使用STM32F103.H头文,基本代替了STM32库,直接使用寄存器和位结构。现在受到“位带别名区“启发,把STM32 外设寄存器全部加上“位带别名区“定义。每个比特膨胀成一个32  ...…

查看全部问答>

求教,关于单片机驱动继电器点亮灯泡的程序。

程序应该是没什么问题的,可能是我模拟电路上的问题,在运行的时候,死活点不亮。求高手看看。代码文件和protues模拟文件在附件的压缩包里。…

查看全部问答>

运放并联问题

本帖最后由 dontium 于 2015-1-23 12:50 编辑 运放并联的时候需要考虑哪些因素呢?两级运放是否要求输出电压电流都相等呢? 我用THS3091并联,发现两路运放单独测试的时候,工作正常,波形很好很干净,并联以后就开始自激震荡了,在输出端串联小 ...…

查看全部问答>

DSP如何在线烧写外扩Flash

在实现DSP自起动过程中,在通过生成对应的HEX文件后,将其转换成DAT文件,可是最后怎么把这个DAT文件烧到目标Flash中呢?用C语言中的open函数打开嘛?可是要以什么样的数据格式读取这些数据才对呢?我用的Flash是16位的字地址进行访问的芯片。有没 ...…

查看全部问答>

找到一个MSP430G2553串口通信教程共享

MSP430的不同型号,其串行通讯工作模式是一样的。 以MSP430G2553为例进行说明。 MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。 …

查看全部问答>