当前位置: 首页 > >

一种单片机多级菜单的模块化设计方法_马志强_图文

发布时间:

一种单片机多级菜单的模块化设计方法

马 志 强 ,王 文 交 ,胡 明 ,孙 少 林
(总 参 谋 部 通 信 训 练 基 地 ,宣 化 075100)

引 言
在单片机设计中,往往需要在显示屏上显示多级 操 作 菜单,每级菜单都有 一 些 菜 单 项 和 对 应 的 按 键 操 作 ,以 及 为响应各种操作而执行的后续处理程序 。参考文献[1]以 函数指针为结构元素 ,把整个菜单结构拉伸成一个结 构 数 组,内部包含了全部菜单项 。这种方法没有将菜单项 数 据 与功能函数分开设 计 ,而 把 菜 单 项 数 据 写 在 功 能 函 数 中 , 当菜单项数据需要 改 变 时 ,必 须 修 改 功 能 函 数,这 在 很 大 程度上限制了程序的通用性 ,不利于程序的维护 。参 考 文 献[2]在前者的基 础 上 略 加 改 进 ,在 原 结 构 体 中 增 加 了 菜 单项显示文字和按 键 复 用 标 识 ,这 使 得 结 构 体 较 为 庞 大, 且菜单项 的 文 字 内 容 非 常 固 定 ,保 存 在 EEPROM 中,无 法灵活改变显示内容和位置 。参考文献[3]引入 Windows 系统下的窗口和消息机制实现多级菜单设计 ,该方法 需 要 维护堆栈、消息队列和窗口定时器等 ,设计过于复杂。
本文旨在提供一个轻量级的单片机多级菜单实现方 法,以较少的系统资源消耗和简单方便的方法完成菜 单 设 计。考虑到菜单程序需要具备3个基本要素:一是 每 个 菜 单窗口要显示的内容 ;二是每个窗口对应的按键定义 与 响 应;三是窗口内菜单 项 之 间 切 换 和 窗 口 之 间 的 切 换 机 制 。 因此,将菜单分为菜 单 窗 口 模 块 和 键 盘 处 理 模 块 两 部 分 , 独立进行设计。
1  菜 单 窗 口 模 块 设 计
菜单窗口模块主要功能是按照菜单窗口切换机 制 ,实 时完成窗口的显示控制。
1.1  菜 单 窗 口 切 换 机 制
菜单窗口切换机制包括两点 :一是不同窗口之间 切 换 效果的实现;二是窗口内的同级菜单项之间滚动切换 效 果 的实现。为实现上述功 能 ,定 义 了 两 个 结 构 体 MenuState 和 MenuItems。MenuState定义如下: typedef struct{
u8CurIndex; u8 UpIndex; u8DnIndex; u8BackIndex; void (*CurOperate)();

}MenuState; MenuState是一个 与 窗 口 跳 转 和 窗 口 显 示 有 关 的 结
构体数组,用于全局调度 各 窗 口 之 间 的 切 换 。 其 中,CurI- ndex是 窗 口 的 索 引 值,用 来 标 识 当 前 窗 口。UpIndex、 DnIndex、BackIndex 用 来 标 识 当 有 “上 页 ”、“下 页 ”、“返 回 ” 按键操作时,程 序 应 转 向 的 窗 口。 其 取 值 为 255 时,表 示 无转向窗口,取值在0~254时表示要转向的窗 口 索 引 ,因 此本设计可 支 持 255 个 菜 单 窗 口,足 以 满 足 工 程 应 用 需 要。CurOperate是 函 数 指 针,用 来 指 向 当 显 示 当 前 窗 口 时,应执行的窗口显示控制程序 ,以实现窗口的显示 。
MenuItems是一个菜单项结构体 ,用以保 存 当 前 窗 口 的全部菜单项的显示位置和内容 ,这个结构体的内容 是 随 着窗口的切换,在新窗口初始化过程中被更新的 。这 样 就 满足了窗口的切换和菜单项之间反显滚动的需要。由于 只保存与当前窗口 有 关 的 菜 单 项 ,因 此,该 结 构 体 的 系 统 资源消耗很小。 typedef struct{
u8x;//x 坐 标 u8y;//y 坐 标 u8 WndIndex;  //当按下“确认”时要转向的窗口索引 u8strItem[32];  //要 显 示 的 菜 单 项 内 容 }MenuItems; MenuItems *Items; Items包含了当前窗 口 内 的 所 有 菜 单 项 ,考 虑 到 有 的 菜单项是没有转向窗口的 ,所以对应这种菜单项设置 该 值 为 255。 当 显 示 一 个 窗 口 时,Items会 被 填 入 当 前 窗 口 的 菜单项信息,并且填写时是按照菜单项的先后顺序依 次 构 建的。这样当有“上 移”、“下 移”按 键 操 作 时,就 可 迅 速 找 到 目 标 行 ,并 反 显 该 行 。
1.2  菜 单 窗 口 显 示 控 制
窗口显示部分是将每一个菜单窗口都以一个独立命 名的函数形式封 装 ,函 数 里 包 括 对 Items进 行 赋 值,在 显 示屏指定位置显示当前窗口的菜单项 ,以及根据需要 完 成 画点、画线、画按钮等绘图操作 。这些函数彼此功 能 独 立 , 分别对应不同 的 菜 单 窗 口 ,仅 在 窗 口 切 换 时 赋 予 CurOp- erate即可,因此非常适合多人合作开发 。
需要说明 的 是,菜 单 窗 口 的 显 示 控 制 是 基 于 显 示 屏 的,工程中常用的是 TFT 屏或点阵液晶屏 ,使用时 需 要 实

7 4 Microcontrollers & Embedded Systems  2012 年第10 期

www .mesnet.com .cn 

现显示屏的驱动程序 ,对 屏 进 行 初 始 化、读、写 等 操 作,由 于不是本文重点 ,因此这部分内容略过 。
2  键 盘 处 理 模 块 设 计
单片机的菜单操作多是以按键形式完成的 ,一般 会 有 多个按键,分别对应 不 同 功 能。 此 外,也 要 考 虑 按 键 复 用 问题,也就是说,同一 位 置 的 按 键 在 不 同 窗 口 内 可 能 会 有 不同的功能定义 ,因此,要在程序中对按键进行采集 、解 析 键值,以正确响应操作 。按键处理的流程如图1所示。

图 1  键 盘 处 理 模 块 设 计 流 程 图

例如当按下“上页”按 键 时,程 序 会 接 收 到 按 键,根 据

当前所处的窗口解 析 该 键 定 义 ,判 断 为 “上 页”;然 后 在 窗

口结构体 数 组 MenuIndex 中 取 得 要 转 向 窗 口 的 索 引 值 ,

根据索引值取得该窗口显示控制程序的指针 ,并释放 菜 单

项结构体Items,执行该窗口显示控制程序 。代码如下:

void KeyEvent(void){           //键 盘 处 理

  ……

  case KEY_PREWINDOW: //上页

   if(MenuIndex[CurWnd].UpIndex<255){

       CurWnd= MenuIndex[CurWnd].UpIndex;

        WndPtr= MenuIndex[CurWnd].CurOperate;

       free(Items);

    (* WndPtr)();

//显 示 该 窗 口

  }

   break;

  ……



3  应 用 实 例

在某装备模拟项目中 ,以 AT89C52芯片为核心器件 ,

显示部分采用图 形 点 阵 液 晶 显 示 模 组 HG3202405V2 B

LWH LV,外部复合功能按键6个,实 现 菜 单 设 计。 部

分代码如下:

u8CurWnd;

//当 前 菜 单 窗 口 索 引

u8CurItem;

//当 前 菜 单 项 索 引

u8ItemNums;

//菜 单 项 数 量

void (*WndPtr)(); //窗口功能函数指针

MenuItems*Items; //当前窗口菜单项

MenuState MenuIndex[WNDCOUNTS]= {

{0,255,255,255,(* MainWnd)},//主界面

{1,255,4,0,(* QunLu1)}, //设 置 群 路 速 率 和 接 口 界 面 1

{2,255,255,0,(* Call)}, //设 置 勤 务 呼 叫 界 面

{3,255,255,0,(* Encrypt)}, //设 置 勤 务 加 密 界 面

{4,1,255,0,(* QunLu2)}, //设 置 群 路 速 率 和 接 口 界 面 2

……

};

/* 窗 口 显 示 控 制 程 序 */ void MainWnd(){//主 菜 单
……

MenuItems Temp[]= { {2,5,255," 设置参数" },

{3,29,1," 1群路速率和接口" },

{3,53,2," 2网勤务呼叫" },

{3,77,3," 3设置勤务加密" },

};

SizeOfStruct=sizeof(Temp); Items= (MenuItems)malloc(SizeOfStruct);

……



void QunLu1(){//群 路 速 率 和 接 口 界 面 1 ……



主菜单窗口如图2所示。

结 语
单片机的多级菜单设计是项目开发中较为常见的问 题,本文给出了解决方案并在项目中得到应用 。其特 点 表 现 在 两 个 方 面:一 是 系 统 开 销 小 ,仅 靠 MenuState 和 MenuItems两个结构 体 和 几 个 变 量 即 可 维 护 各 窗 口 和 窗 口内的同级菜单项 ;二是模块各部分功能独立性强 , 81

 paper@mesnet.com .cn(投 稿 专 用 ) 

2012 年第10 期  

 7 5

的处理工作都放到任务级代码中完成 ,从而允许通过 给 调 度器上锁的方式实现临界段代码的保护 ,这样就使内 核 关 中断的时钟周期几乎 为 零 。μC/OS III内 置 了 对 系 统 性 能进行测试的代码 ,能 够 检 测 每 个 任 务 的 执 行 时 间 、堆 栈 使用 情 况、每 个 任 务 运 行 的 次 数、CPU 利 用 率、关 闭 中 断 和给调度器上锁的时 间 等 。μC/OS III还 支 持 内 核 觉 察 式调试,可以以友好的方式对 μC/OS III的 变 量、数 据 结 构进行检查和显示 ,并且带有 μC/Probe调试工具,可在程 序运行过程中察看和修改变量。
结 语
相比 μC/OS II,μC/OS  III做 了 很 多 改 进 ,比 如 改 进了任务调度方法 、改 进 了 时 钟 节 拍 管 理 机 制、增 加 了 中 断处理任务、允许向 任 务 直 接 发 信 号 或 消 息 、增 加 了 时 间 戳功能、支 持 内 核 觉 察 式 调 试 等 。 从 这 些 改 进 来 看,μC/ OS III比 μC/OS II上 升 到 一 个 更 高 的 档 次。 其 中,一 些主要的改进,比如 μC/OS III的任务 调 度 方 法 的 改 进、 时钟节拍管理机制的改进 、中断管理方法的改进等会在后

续专题文章中详细介绍。
参考文献
[1]Jean J Labrosse.μC/OS  II源 码 公 开 的 实 时 嵌 入 式 操 作 系 统 [M].邵 贝 贝 ,等 译 .北 京 :北 京 航 空 航 天 大 学 ,2001.
[2]Jean J Labrosse.嵌入式实时操作系统 μC/OS II[M].邵贝 贝 ,等 译 .2 版 .北 京 :北 京 航 空 航 天 大 学 ,2003.
[3]Freescale.Book E:Enhanced PowerPC Architecture,2002. [4]Freescale .MC9S12XDP512Data Sheet,2006. [5]邵贝贝.浅谈 μC/OS 任 务 调 度 算 法 的 硬 件 实 现 [J].单 片 机
与 嵌 入 式 系 统 应 用 ,2010(9). [6]龚光华,车惠军.μC/OS优先级调度机制在 PowerPC 架 构 处
理 器 上 的 优 化 [J].单 片 机 与 嵌 入 式 系 统 应 用 ,2010(10). [7]冯泽东,邵贝 贝.用 协 处 理 器 提 高 μC/OS  II的 实 时 性 [J].
单 片 机 与 嵌 入 式 系 统 应 用 ,2008(4). [8]邵贝贝,宫辉.嵌入 式 系 统 中 的 双 核 技 术 [M].北 京:北 京 航
空 航 天 大 学 出 版 社 ,2008.
(责 任 编 辑 :杨 迪 娜   收 稿 日 期 :2012-08-07)

75
图 2  主 菜 单 窗 口 各菜单窗口的显示 控 制 程 序 彼 此 独 立 、互 不 影 响,键 盘 处 理程序也自成一体 。因此,该方案模块化程度高 ,开发过

程简单方便,扩展性好,可移植性强,适于团队合作开 发 和 维护。
参考文献
[1]陆铮,罗嘉.单片机 C 语言下 LCD 多级菜单的一种实 现 方 法 [J].工 矿 自 动 化 ,2006(1):50  51.
[2]宋晓辉,叶 桦,丁 昊.基 于 单 片 机 的 多 级 菜 单 实 现 方 法 改 进 [J].东 南 大 学 学 报 :自 然 科 学 版 ,2007,37(1):66  70.
[3]王勇.一种易于移植的单片机液晶显 示 多 级 菜 单 设 计[J].计 算 机 应 用 与 软 件 ,2011,28(12):263  268.
马 志 强 (硕 士 ),主 要 研 究 方 向 为 无 线 通 信 、嵌 入 式 系 统 、自 动 控 制 。 (责 任 编 辑 :梅 栾 芳   收 稿 日 期 :2012-06-08)

ARM 推出第二代 Mali 600图形处理器
ARM 推出第二代 ARM Mali T600 图形处理器(GPU)系列产品,将为平板电脑、智能手机和智能电视提供非凡的用户体 验。 第二代 ARM Mali T600GPU 全线产 品 不 仅 性 能 提 升 50%,而 且 是 首 次 加 入 全 调 适 纹 理 压 缩 技 术 (Adaptive Scalable Texture Compression,ASTC)的 GPU 系列产品。ASTC 是源自 ARM 的纹理压缩技术,能显著地优化 GPU 性能和提升终端 设 备 的 电 池 续 航能力,带来“永远连线、持续 运 作 (always  on,always connected)”的 体 验。 这 项 技 术 已 被 业 界 致 力 于 开 放 标 准 发 展 的 重 要 协 会 ———Khronos集 团 所 采 用 。
基于 Mali Midgard架构所研发的第二代 Mali T600系列包括三款 GPU 产品:Mali T624、Mali T628 和 Mali T678,能 分 别为不同的终端设备提供最佳的性能和能效。其中 Mali T624和 Mali T628将 为 智 能 手 机 和 智 能 电 视 带 来 优 秀 的 图 形 处 理 和 GPU 计算能力,而 Mali T678特别针对快速发展的平板电脑市场需求进行了优化。
ARM 不断地关注于 GPU 计算能力的提升,将其在 CPU 领域的优势和 Cortex系 列 处 理 器 充 分 进 行 整 合 并 应 用 到 Mali GPU 架构,GPU 计算能为平衡 CPU 和 GPU 之间的任务分配提供更好的控制,确保采用最有效的架构实现特定任务的最佳性能。

 paper@mesnet.com .cn(投 稿 专 用 ) 

2012 年第10 期  

 8 1




友情链接: 高中资料网 职业教育网 成人教育网 理学 大学工学资料