一个占用内存极少的菜单系统的实现

上传人:aa****6 文档编号:35539672 上传时间:2018-03-17 格式:PDF 页数:35 大小:1,006.82KB
返回 下载 相关 举报
一个占用内存极少的菜单系统的实现_第1页
第1页 / 共35页
一个占用内存极少的菜单系统的实现_第2页
第2页 / 共35页
一个占用内存极少的菜单系统的实现_第3页
第3页 / 共35页
一个占用内存极少的菜单系统的实现_第4页
第4页 / 共35页
一个占用内存极少的菜单系统的实现_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《一个占用内存极少的菜单系统的实现》由会员分享,可在线阅读,更多相关《一个占用内存极少的菜单系统的实现(35页珍藏版)》请在金锄头文库上搜索。

1、一个占用内存极少的菜单系统的实现 1一个占用内存极少的菜单系统的实现一个占用内存极少的菜单系统的实现12 在各类仪器仪表的设计中,常常需要透过液晶和键盘来实现人机交互,当整个系统需要管理的内容较多的时候,如何透过键盘和液晶实现有效管理便是个问题。通常软件的设计者会设计一个菜单界面来达到这个目的。 本代码便是透过对身边常见的手机的界面做分析,总结,然后通过 C 代码实现类似的界面。 这套代码实现的菜单的特点: 1 支持 3 种菜单类型 2 支持多国语言 3 占用内存极小 4 全 C 代码,方便移植 5 支持数字按键快捷方式 一些手机界面的分析一些手机界面的分析 常见的手机界面几乎都可以归类为这

2、3 种:图标层图标层,条项层条项层,动态内容层动态内容层 * 图标层图标层 图标层基本特征是:使用图标和标题配合 图 1 图标层菜单 图标层通常作为菜单系统的顶层,标题文字可以根据语言选择而更改,但图标通常不变。而且右边有滚动条提示当前位置。底部的一个词作为按键的功能提示。 也见过把滚动条横向放置在屏幕底部的,除了通过滚动条显示当前位置外,也有可能通过编号来提示当前位置。 1 作者:梁炎昌 Email: 2 最后更新:2007- 9- 1 一个占用内存极少的菜单系统的实现 2功能提示提示不是必须的,而且功能提示只有在按键安放在液晶附近才能使用,否则操作者根本不知道这个功能提示对应于那个按键。

3、如果硬件设计时,功能提示的优点是显示了对应位置按键的实际功能,方便操作者。 在图 1 中,”Phone book”电话簿”是标题,”Select”进入”是按键的功能提示。 在大部分的手机中,图标不单单是静态的,通常在上下翻的时候,先是图标动画,然后才变成静态图标。 图 2 图标层菜单 在图 2 的左图中除了中间的大图标外,还有右边的一栏小图标,类似滚动条的作用,底部有 3 个按键的功能提示。而图 2 的右图中仅按键的功能提示有两个,图标在屏幕的左边。 当然了,形式可以多变,但本质依然是:图标标题图标标题。 * 条项层条项层 条项层的基本特征是:一行行的文字 图 3 条项层菜单 一个占用内存极少

4、的菜单系统的实现 3条项层菜单通过显示一行行的文字作为菜单选择项。通过反显/高亮某行文字来提示该项是当前选中的菜单项。 右边依然可能有滚动条,提示选中的菜单项在整个菜单中位置。也依然可能有数字编号提示选中的菜单项在整个菜单中的位置。使用滚动条和数字编号的目的在于提示菜单项位置,但滚动条和数字编号均不是必须的。尤其在屏幕较小时,或者实现滚动条较复杂时,通常省略。 也依然有可能使用按键的功能提示,但也不是必须的。 在黑白液晶中,通常用反显整行文字来提示,但有时比较耗费 CPU,那么可以在需要提示的菜单项前显示个箭头,以箭头来提示选中的菜单项。移动一个箭头的位置,比取消反显行并反显新一行的代价会小很

5、多,在 CPU 主频不高时可以使用。 图 4 条项层菜单 在彩色屏幕中,高亮显示选中的选择项,方法很多,可以通过改动背景颜色和文字颜色等方法实现。 反显/高亮,或者使用箭头,目的是要突出选中的菜单项。 * 动态内容层动态内容层 动态内容层由标题和动态内容组成。 标题用来说明当前项的功能,而动态内容就是该功能当前状态。比如“设置时间”,动态内容就显示当前的时间。 标题是固定的,根据语言切换的,而动态内容可能需要调用一个函数得到,然后显示。 动态内容通常是一些设置内容的开关状态等。 依然有可能有滚动条和数字编号,以及按键的功能提示。 动态内容层菜单一样可以显示多个项,这点跟条项层菜单一样。当屏幕可

6、以显示多个一个占用内存极少的菜单系统的实现 4项时,那么依然需要使用跟条项层菜单的方法来提示当前选中的菜单项。而当由于屏幕较小时,仅能显示一个动态内容项菜单,那么不需要提示选中,因为屏幕也就一个项。 图 5 中仅有一项菜单,无须通过反显提示当前菜单项。 图 6 中有 3 个菜单项,要通过高亮的方式提示当前选中的菜单项。 图 5 仅有一项菜单的动态内容层菜单 图 6 有多项的动态内容层菜单 在条项层条项层和动态内容动态内容层也有可能会有本层菜单的标题,只要屏幕足够大。 在条项层和动态内容层菜单中,按键的功能提示可能会依据当前选中的菜单项而改变。 图 7 中由于屏幕够大,显示本层菜单标题。 一个占

7、用内存极少的菜单系统的实现 5图 7 带标题的菜单 图标层代码实现分析图标层代码实现分析 上下翻转是需要刷新图标和标题,偶尔也需要更改底部的按键功能提示。因此实现方法也就很简单了,根据上下翻转键刷新文字和图标。 滚动条通过当前位置和总的菜单项可以实现。 条项层代码实现分析条项层代码实现分析 分两种情况: 1 要求显示的全部菜单项多于 LCD 可以显示的菜单项的数目。比如,要求显示的项有 6项,但是 LCD 一次仅仅能显示 3 项,那么就涉及到如何刷新显示的问题了。 对照图 8,可分成如下 3 类情况: A顶部上移,当前反显项在 LCD 顶部,上翻。那么就是刷新整个 3 项的显示了,因为3 项的

8、内容都更改了。 B底部下移,当前反显项在 LCD 底部,下翻。那么就是刷新整个 3 项的显示了,因为3 项的内容都更改了。 C除了 AB 两种之外的都是当前反显项在 LCD 内部移动,取消原来的反显项,根据上下翻来反显当前项。 一个占用内存极少的菜单系统的实现 6图 8 条项层菜单上下翻的分析 图中 Item 表示当前显示项的编号,Where 表示当前显示项在液晶上的位置。可见上图中 Item 的取值范围是 04,where 的取值范围是 02。 2 要求显示的项不多于 LCD 可以显示的项的数目。 对照图 9,有 3 种情况: A顶部上移,取消顶部反显,反显底部。 B底部下移,取消底部反显,

9、反显顶部。 C除了 AB 两种之外的都是当前反显项在 LCD 内部移动,取消原来的反显项,根据上下翻来反显当前项。 查找 增加名字 删除 声控标签 查找 增加名字 查找 增加名字 删除 查找 增加名字 删除 增加名字 删除 修改 Item = 0 Where = 0 Item = 1 Where = 1 Item = 2 Where = 2 Item = 4 Where = 0 Item = 3 Where = 2 A B C C 要求显示的项多于可 以显示的项 要求:5 可以:3 查找 增加名字 删除 修改 声控标签 要求显示的项不多于可 以显示的项 要求:3 可以:3 查找 增加名字 删除

10、 查找 增加名字 删除 B A 查找 增加名字 删除 Item = 0 Where = 0 Item = 3 Where = 3 查找 增加名字 删除 Item = 2 Where = 2 C C 输入名字: 一个占用内存极少的菜单系统的实现 7图 9 条项层菜单上下翻的分析 从硬件行为上来分析,在某一层的菜单中,可以有:上翻,下翻,确定,退出这 4 种情况,上翻和下翻是在本层菜单内浏览菜单项,确定是进入选中菜单项的子菜单,退出是退出当前菜单,回到上层菜单。 对于条项层菜单,每一层条项型菜单用 5 个函数来实现,分别是: 表格1 条项菜单函数 MenuNameInit 初始化本层菜单 Menu

11、NameUp 向上按键处理函数, 向上按键默认作为确定键, 用来进入子菜单或确定输入。 MenuNameDown 向下按键处理函数, 向下按键默认作为退出键, 用来返回父菜单或取消输入。 MenuNameLeft 向左按键处理函数,选中上一项菜单项 MenuNameRight 向右按键处理函数,选中下一项菜单项 * MenuName 是菜单名,层菜单均有一个菜单名。 当有按键输入时,这些函数会被调用,代码中设计了一个 FSM 来管理多层菜单,每一层菜单在 FSM 的一个索引表格中占用 5 个索引号,分别对应于表格 1 的 5 个函数。代码运行时,保存着当前的索引号,当按键按下的时候,代码会在这

12、个索引表格中找到下一个索引号,以此作为当前索引号,同时会调用这个索引号对应的条项菜单函数。 表格2 索引表中函数和索引号的对应关系 函数 索引号 MenuNameInit MenuNameInit_ID MenuNameUp MenuNameInit_ID+1 MenuNameDown MenuNameInit_ID+2 MenuNameLeft MenuNameInit_ID+3 MenuNameRight MenuNameInit_ID+4 当当前状态为表格中的 MenuNameInit_ID+1 至 MenuNameInit_ID+4 时,是临时状态,所谓“临时状态”是指与这 4 个索引

13、号对应函数在被调用的时候,依然会修改当前索引 , MenuNameLeft和MenuNameRight会 把 索 引 号 修 改 为 本 层 菜 单 的MenuNameInit_ID, 而 MenuNameUp 则会修改成某个子菜单对应 MenuNameInit_ID,MenuNameDown 怎会修改成父菜单的 MenuNameInit_ID。唯有 MenuNameInit_ID是个恒久的状态。 一个占用内存极少的菜单系统的实现 8从上层菜单进入本层菜单后,索引号首先变为本菜单的 MenuNameInit_ID,同时会调用 MenuNameInit 函数, 该函数首先把一些指针修改到本层菜单

14、的资源中,包括条项的文字字符串开始位置,每个字符串长度,本层菜单条项的数目等,然后初始化本层菜单的第一次显示。 当向左按键被按下,根据当前索引号 MenuNameInit_ID 索引表格中查找,查处该按键对应的索引号是 MenuNameInit_ID+3,于是索引号被修改为 MenuNameInit_ID+3,同时调用 MenuNameLeft 函数,MenuNameLeft 函数首先维护条项的显示:把上一个菜单项作为选中项,代码处理的方法是图 8 图 9 的方式。在 MenuNameLeft 函数的最后,把索引号修改成 MenuNameInit_ID。 向右按键的处理跟向左按键的处理基本一致

15、。 当向上按键被按下,根据当前索引号 MenuNameInit_ID 索引表格中查找,查处该按键对应的索引号是 MenuNameInit_ID+1,于是索引号被修改为 MenuNameInit_ID+1,同时调用 MenuNameUp 函数, MenuNameUp 函数首先调用 PUSH 函数把本层菜单的特征参数保存到一个模拟堆栈中,目的是为了当从子菜单返回本层菜单时,可以把模拟堆栈中保存的特征参数恢复屏幕显示。MenuNameUp 然后根据当前选中菜单项,修改索引号为该子菜单对应的索引号,并把一个刷新标志 Flash 设置为 1,在下一次键盘扫描中,虽然没有按键按下,但依然会因为 Flash 为 1,而调用该子菜单的 MenuNameInit 函数,该函数初始化本层菜单的显示。 对于一个常见的条项型菜单,其实大部分情况每个条项显示内容在编写程序的时候是已经知道的,因此这些显示内容可以放在程序代码段中,并可以通过指针寻址。 因此条项型菜单某个时刻的状态能跟如下这几个参数有关。 DispItem 指向显示内容数组开始位置的指针 Item 当前显示条项在显示内容数组中的偏置 Where 当前显示条项在液晶上的位置 恢复一个菜单原有显示,在得到上面 3 个参数后,便能在

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号