2010年1月第6卷第1期
系统仿真技术
Syste m Si m ulati on Technol ogy
Jan .,2010Vol .6,No .1
中图分类号:TP 393.03 文献标识码:A
一种嵌入式系统液晶显示菜单结构的实现方法
郭雯婷
(同济大学控制理论与控制工程系,上海 201804)
摘 要:液晶显示模块作为显示终端和人机接口普遍运用于嵌入式系统中,针对嵌入式系统对人机对话接口简单、便捷的要求,提出了1种在C 语言环境下,液晶显示(LCD )多级菜单结构的实现方法。此方法运用一维线性数组的数据结构,使设计出的菜单结构清晰易懂,对存储资源的利用效率高,且扩展性好。并用C51语言验证了这种方法的可行性。此方法适合在嵌入式应用系统开发中使用。关键词:嵌入式系统;液晶显示;多级菜单结构:C51
A Method of DesigningMenu UsingMatrix
LC D Based on E mbedded Syste ms
GUO W en ting
(Depart m ent of Contr ol Theory and Contr ol Engineering,Tongji University,Shanghai 201804,China )
Ab s tra c t :The L CD (L iquid C rystal D isp lay )is w idely used as disp lay ter m inals and hum an 2m achine
interfaces in em bedded system s .
A new m ethod of designing m ultilevel m enus by C language is
p roposed,w hich is app lied in em bedded system to m ake HM I (H um an 2m ach ine Interface )m ore convenien t .This novel m ethod m akes the structured m enu understandable,and has high efficiency in using the m em o ry by using linear array of one d i m ension .The design of m u ltilevel m enus is suitable for the app lication of em bedded system s .
Key wo rd s :em bedded system;liqu id crystal disp lay;m ultilevel m enu;C51
基金项目:教育部重大资助项目(306023);教育部新世纪优秀人才计划资助项目(NECT -06-0382);教育部博士点基
金资助项目(20070247075)
1 引 言
在嵌入式应用系统中,使用液晶显示模块作为人机交互的界面已成为主流趋势,而软件实现菜单驱动的事件处理的人机交互方式,是目前实现人机交互的首选方式。如何在液晶显示模块上实现多级菜单的操作也就成为了必须要解决
的问题。
由于嵌入式系统中使用的点阵式液晶屏每屏显示的内容非常有限,尤其在存储空间非常有限的情况下,如何设计1个合理的结构化菜单就成了嵌入式开发中非常关键的问题。通常情况下,传统的方法是用链表来表示菜单的树形结构[1,2],文献[3]中采用的数组单元中,每个菜单项仍然需要用2个单元的空间来表示父子关系。
郭雯婷:一种嵌入式系统液晶显示菜单结构的实现方法
以上方法占用资源较多,执行效率也相对较慢,在嵌入式系统开发中成为1个制约因素。本文提出采用一维线性数组实现菜单树形结构的方法,具有结构清晰,对存储资源的利用效率高,扩展性好的特点,适合在嵌入式系统中使用。下面以
低功耗、高性能C MOS [4]
的8位单片机AT89S52和液晶显示模块Y M12864Y 为例,在C 语言环境下进行介绍。
2 图形点阵式液晶模块介绍
采用图形点阵式液晶显示较之其他显示方
式主要有以下优点[5]
:①工作电压低、功耗极低。工作电压仅为3~5V 工作电流,特别适用于低功耗的仪器仪表中。②液晶显示属被动显示,受外界光线干扰小。③图形点阵式液晶可显示的信息量大、分辨率高。④不产生电磁干扰。⑤可靠性高,使用寿命长。
在嵌入式系统的液晶显示设备中,目前广泛采用的是12864图形点阵液晶模块.该类液晶可以实现16×l6点阵的汉字4行8列,本文就是基于Y M12864Y 图形点阵液晶模块实现多级菜单的设计。ST7920控制器使这款液晶显示屏带有提供点阵中文字型的中文字库,可以方便地显示中英文文本。液晶显示模块与嵌入式系统之间
通常有并行与串行2种连接方式[6]
。本设计中采用串行连接方式,图1为液晶模块与单片机的硬件连接
。
图1 液晶模块与单片机连接图
F i g .1 Connecti on between LCD and si n gle 2ch i p system
3 用线性数组实现菜单的方法
菜单结构设计的常用方法是树形拓扑结构法[3]。菜单的树形拓扑结构为多叉树[7]
,为了表示菜单之间的相互关系,必须表示出所有的下级菜单节点。由于每级菜单的子菜单的节点数不同,无法用统一的数据结构来表示,因此将多叉树表示为二叉树,用长子兄弟法表示,其中左分支为长子,右分支为兄弟。如果采用带双亲的链式二叉树,那么1个节点除了存有用的信息,还必须多次3个指针(父亲指针,长子指针,兄弟指针)的存储空间,因此空间利用率比较低,这在嵌入式系统资源非常紧张的情况下是难以接受的。因此,本文以三级菜单为例,基于C51语言用一维线性数组的数据结构来完成对菜单树的设计,实现通过“向上”、“向下”、“向右”、“向左”、“确认”、“取消”6个键来对菜单的选择。具体功能如下:
“向上”键:在本级菜单的项目中向上移动进行选择。
“向下”键:在本层菜单的项目中向下移动进行选择。
“向右”键:确认本层的菜单设置,进人下级菜单。
“向左”键:取消本层的菜单设置,返回上级菜单。
“确认”键:执行当前菜单项所表示的功能函数。
“取消”键:功能同“向左”键。
图2描述了菜单项之间的关系和菜单编号。
根据需求,首先建立1个结构体[8]
,并定义1个结构变量Menu Item 。结构变量就是把不同类型的变量结合在一起形成的1个组合型变量,构成1个结构体的各个变量称为结构元素,其结构体的源代码如下:
typedef struct _menu Item{
union {
UCHAR I D ;
1
8
系 统 仿 真 技 术第6卷第1期
UCHAR NextI D;
}idx;
MenuHandler OnClick;
}Menu Item;
图2 菜单结构图
F i g.2 M a i n m enu and sub2m enu
与链表法表示二叉树相比,该结构体中只有两个结构变量,分别是1个字符型变量和1个函数指针型变量,字符型变量为每1个菜单项分配惟一的索引号,称之为I D,函数指针型变量OnClick表示选择莱单项时引发的事件,通过为这些事件编写响应程序,就可使用菜单来控制程序运行了。
以下是用来表示菜单结构的一维线性数组,其中注释部分为菜单编号。
#define Menu_Cnt13
Menu Item code menus[Menu_Cnt]={
{0,Menu_Handler},∥0
{1,Menu_Handler},∥1
{2,Menu_Handler},∥2
{5,Menu_Handler},∥3
{End Menu Item(7),Menu_Handler},∥4
{5,Menu_Handler},∥5
{End Menu Item(6),Menu_Handler},∥6
{7,Menu_Handler},∥7
{8,Menu_Handler},∥8
{9,Menu_Handler},∥9
{11,Menu_Handler},∥10
{11,Menu_Handler},∥11
{End Menu Item(12),Menu_Handler},∥12 };
对比图2和上述菜单数组可以看出,菜单树中的菜单项编号是从主菜单开始由小到大依次排列的,上级菜单的编号一定小于下级菜单的编号。比较菜单索引号和菜单编号,可以看到有如下特点:①如果当前菜单项同时满足:没有下级菜单且非本级菜单的末尾项,那么当前菜单项索引号等于当前菜单编号。②如果当前菜单项有下级菜单,那么当前菜单索引号等于下级菜单首项的编号。③如果当前菜单项为本级菜单的末尾项,那么当前菜单索引号为当前菜单编号最高位置1后的结果,这个操作通过宏来完成,表示为End Menu Item(val)。④如果当前菜单项同时满足:有下级菜单且为本级菜单的末尾项,那么当前菜单索引号为下级菜单首项编号最高位置1后的结果,同样表示为End Menu Ite m(val)。因此,在不需要设置孩子指针和父亲指针的情况下就可以确定一组父子关系,父亲节点和他的其他孩子节点的关系是隐含地确定的,用逻辑关系来实现菜单的树形结构,占用空间小。
同时可以看出,当菜单索引号是字符型数据时,除了最高位要用做表示逻辑关系外,最多可以扩展的菜单项总数是27项,当菜单索引号是int型数据,最多可以扩展的菜单项总数是215项,可以看出,用本方法设计的菜单扩展性比较好。
4 菜单操作的实现
菜单的操作具体包括在本级菜单中滚动,进入下级菜单,返回上级菜单,执行功能函数,等等。基于前面的设计方法,实现多级菜单的程序流程图如图3所示。
下面以“向下键的处理”和“向右键的处理”为例分别介绍其具体的实现方式。细化流程图如图4所示。
(1)当按“向下”键时,需要判断当前菜单项是否是本级菜单的末尾项,然后进行光标的向上移动或向下移动。
28
郭雯婷:一种嵌入式系统液晶显示菜单结构的实现方法
(2)当按“向右”键时,需要判断当前菜单项
是否有下级菜单,如果是,则需要暂存当前菜单
索引号,
然后进入下级菜单。
5 结 论
本文以AT89S52单片机和Y M12864Y 图形点阵式液晶模块为例,在C 语言环境下介绍了用一维线性数组设计菜单结构的方法,结构合理清晰,对存储空间的利用率高,扩展性好,具有很好的可移植性,可大大提高开发效率,适用于嵌入式应用系统开发。通过实际应用证明,以上方法是切实可行的,同时,此方法也为其他应用系统的多级菜单设计提供了参考和选择。
参考文献:
[1] 黄声野,陈秀红,王东生.一种用51实现的单片机系
统菜单管理方案[J ].计算机工程,2004,30(3):
1912193.
HUANG Shengye,CHE N Xiuhong,WANG Dongsheng .A singlechi p syste m menu manage ment realized with C51[J ].Computer Engineering,2004,30(3):1912193.[2] 宋晓辉,叶桦,丁昊.基于单片机的多级菜单实现方法
改进[J ].东南大学学报:自然科学版,2007,37(Sup
(1)):66270.
3
8
系 统 仿 真 技 术第6卷第1期
S ONG Xiaohui,YE Hua,D I N G Hao.I m p r oved method of multilevel menu realizati on based on SC M[J].Journal of
Southeast University:Natural Science Editi on,2007,37
(Sup(1)):66270.
[3] 李敏通,张战国.一种建立在单片机应用系统菜单的
新方法[J].计算机工程,2006,32(16):2592273.
L IM int ong,ZHANG Zhanguo.A ne w method of designing menu of single2chi p syste m[J].Computer Engineering,
2006,32(16):2592273.
[4] 杨宁.单片机与控制技术[M].北京:北京航空航天大
学出版社,2005.
Y ANG N ing.Single2computer and contr ol technol ogy
[M].Beijing:Beijing University of Aer onautics&
A str onautics Press,2005.
[5] 陆铮,罗嘉.单片机C语言下LCD多级菜单的一种实
现方法[J].工矿自动化,2006(1):50251.
LU Zheng,LUO J ia.A realizing way f or LCD multi2level menu with C language and single2chi p m icr ocomputer
[J].I ndustry and M ine Aut omati on,2006(1):50251. [6] 林晓毅,谢剑英.图形点阵式液晶结构化菜单设计与
实现[J].控制工程,2007,14(4):3912394.
L I N Xiaoyi,X I E J ianying.Design and realizati on of
structured menu based on matrix graphic dot LCD[J].
Contr ol Engineering of China,2007,14(4):3912394. [7] 严蔚敏,吴伟民.数据结构[M].2版.北京:清华大学
出版社,1992.
Y AN W ei m in,WU W ei m in.Data structures[M].2nd ed.
Beijing:Tsinghua University Press,1992.
[8] 马忠梅.单片机的C语言应用程序设计[M].北京:北
京航空航天大学出版社,2003.
MA Zhong mei.Single2computer C language app licati on
p r ogram design[M].Beijing:Beijing University of Aer onautics&A str onautics Press,2003
.
郭雯婷 女(1983-),山西阳泉人,
硕士生,主要研究方向为嵌入式系统
开发与网络控制等。
48