基于状态机的LCD多级菜单设计

合集下载

由LCD12864初探嵌入式菜单设计(完全资料)

由LCD12864初探嵌入式菜单设计(完全资料)

1、位操作 向 LCD12864 这种二值屏幕,我们习惯于用 1 个字节表示连续的 8 个点,1 对应对应位被点亮,0 表示不
亮,所以对图形的操作最基本的手段就是位操作。 复习下,常用的位操作,假设 Dis 表示某一个现存地址的内容 Dis = Dis~ 黑白颠倒 Dis &= ~(1<<n) 第 n 处被擦去, Dis |= (1<<n) 第 n 处被画了一个点 Dis ^= (1<<n) 如果 n 处是亮的,就变被擦掉;如果 n 处是空白的,就被点亮…… …… 差不多就这些
default: TempData |= (1 << BX);
}
setY(X);
500361 sendDataToLCD(TempData); ll648 } om/ba 特别说明一下,关于贪食蛇范例的问题,这篇文章里面只会简单得提及一下。 idu.c 作为嵌入式系统开发的一个范例,我会另外开一个帖子详细说明开发过程。 i.ba 这个范例将作为介绍嵌入式系统开发方法的一个很好的例子,用于解释一个系统和一段表示您调通了某一 ://h 个功能的代码之间有什么区别,同时也将介绍嵌入式开发系统的几种模式(超级循环、调度器),顺便侃一
PDF 文件使用 "pdfFactory Pro" 试用版本创建
首先,我们从最基本的数学算法说起。 如果我们使用公式 y = kx + b 来作为绘图的依据,那么就需要分 3 种情况:水平直线,斜率为 0;垂直直
硬件平台:AVR Mega8 级 LCD: 不带字库的 12864 软件平台:ICC 规范: 符合基本的 C 编程规范
3、何时开始正文 其实,本文应该算是计算机图形学的一个具体分支,所以,计算机图形学的基本要求就是本文的基本要求, 考虑到各位兄弟的胃口,我就多罗嗦下。

旋转编码器控制12864液晶多级菜单显示

旋转编码器控制12864液晶多级菜单显示

(5)、工作电流:2.0mAmax
5、接口说明
管 管脚 电平 脚 号
1 VSS 0V
2 VDD 5.0V
3 V0
说明
逻辑电源地。 逻辑电源正。 LCD 驱动电压,应用时在 VEE 与 V0 之间加一 10K 可调电阻。
4 D/I H/L
5 R/W H/L
6
E H.H/L
7 DB0 H/L
8 DB1 H/L
Line 0 1/0 1/0 1/0 1/0 …………
1/0 1/0 1/0 DB0
Line 1 1/0 1/0 1/0 1/0 …………
1/0 1/0 1/0 DB1
Line 2 1/0 1/0 1/0 1/0 ………… X=0
1/0 1/0 1/0 DB2
Line 3 1/0 1/0 1/0 1/0 …………
(4)、输入电压:Vee~Vdd
(5)、工作温度
:0~55℃(常温) / -20~70℃(宽温)
(6)、保存温度
:-10~65℃
4、电气特性
(1)、输入高电平
:3.5Vmin
(2)、输入低电平(Vil):0.55Vmax
(3)、输出高电平( ):3.75Vmin
(4)、输出低电平(Vol):1.0Vmax
(1)、显示开/关设置
L
L
L
L
H
H
H
H
H H/L
功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。不影响显示 RAM(DD RAM)中的内容。
(2)、设置显示起始行
L
L
H
H
行地址(0~63)
功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由 Z 地址计数 器控制的,该命令自动将 A0-A5 位地址送入 Z 地址计数器,起始地址可以是 0-63 范围 内任意一行。Z 地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后 自动加一。

oled多级菜单实现方法

oled多级菜单实现方法

OLED多级菜单实现方法引言随着智能设备的普及,O LE D(Or ga ni cLi g ht-E mi tt in gD iod e)显示屏在各种应用中得到广泛应用。

在许多情况下,我们需要为用户提供一种直观且易于操作的界面,以便他们与设备进行交互。

其中,多级菜单是一种常见的交互方式。

本文将介绍在OL ED显示屏上实现多级菜单的方法。

一、概述多级菜单是一种具有层级结构的菜单,它允许用户在不同层级间进行导航和选择操作。

通过使用O LE D显示屏,我们可以以图形化的方式展示多级菜单,使用户操作更加方便和直观。

二、实现步骤1.准备工作在开始实现多级菜单之前,我们需要准备以下材料:-一块可驱动OL ED显示屏的硬件设备-相应的开发板或单片机-适配器或连接线等连接硬件设备所需的配件2.设计菜单结构在实现多级菜单之前,我们需要先设计菜单的层级结构。

通常,多级菜单由一级菜单和多个子菜单组成。

一级菜单可以包含多个子菜单,子菜单之间可以进行跳转和切换。

我们可以用树状结构来表示并管理菜单的层级关系。

3.显示菜单通过OL ED显示屏,我们可以将菜单以图形化的方式展示出来,提供给用户进行选择。

在显示菜单时,我们需要根据当前菜单层级和用户选择的位置来进行显示,以及在用户进行操作时进行相应的响应。

4.用户操作多级菜单的核心在于用户的操作。

用户可以使用特定的按键或触摸屏进行导航和选择。

我们需要监听用户的操作,并对其进行相应的处理。

比如,当用户选择某个菜单项时,我们需要根据其选择进行相应的跳转或执行相应的操作。

5.实现菜单功能菜单不仅仅是显示和选择,还需要实现相应的功能。

根据不同的应用场景,我们可以为菜单的不同选项分配不同的功能,并在用户选择时执行相应的操作。

6.菜单管理和维护在实际应用中,菜单通常需要进行管理和维护。

这包括对菜单项的增加、删除和修改,以及对菜单结构的调整和优化。

我们需要提供相应的管理界面和功能,以便管理员或用户对菜单进行维护和配置。

u8g2多级菜单原理 -回复

u8g2多级菜单原理 -回复

u8g2多级菜单原理-回复u8g2多级菜单原理:实现复杂显示效果的逐级菜单控件一、引言介绍(100-150字)u8g2多级菜单是一种用于显示复杂文字和图形的逐级菜单控件,基于u8g2图形库开发。

它提供了一种结构化管理菜单选项和层级关系的方法,使用户可以通过使用方向键和确定键进行导航和选择。

本文将详细介绍u8g2多级菜单的原理和实现步骤,旨在帮助读者理解u8g2多级菜单的工作原理以及如何开发和定制自己的逐级菜单。

二、什么是u8g2多级菜单(200-300字)u8g2多级菜单是一种以树形结构展示菜单选项的图形控件。

它使用u8g2图形库提供的功能来绘制文本、图标和边框等元素,实现了逐级展开、收起和选择的功能。

每个菜单选项都可以包含子菜单,用户可以通过方向键在不同的菜单选项之间进行导航,通过确定键选择某个菜单选项并进入子菜单。

该控件通过将菜单选项组织成树状结构,提供了一种有效管理和展示大量信息和选项的方式。

三、u8g2多级菜单的原理和实现逻辑(400-500字)u8g2多级菜单的实现原理可以概括为以下几个步骤:1. 初始化:首先,创建一个根菜单项,并设置当前菜单指针指向根菜单项。

根菜单项包含了所有的一级子菜单选项,以及每个子菜单选项对应的子菜单项数组。

2. 绘制:使用u8g2图形库提供的绘制函数,根据当前菜单指针指向的菜单项,将菜单选项的文本、图标和边框绘制到显示屏上。

3. 导航:在绘制菜单后,用户可以通过方向键(上、下、左和右)在不同的菜单选项之间进行导航。

根据用户的输入,更新当前菜单指针的位置,并根据需要重新绘制菜单。

4. 选择:当用户按下确定键时,记录当前菜单指针的位置,并根据当前菜单指针的指向进入下一级菜单。

重复步骤2和3,直到用户选择了最终的菜单选项。

5. 返回:在菜单的任何级别,用户都可以通过返回键返回上一级菜单。

通过管理一个菜单栈来记录菜单导航的历史,可实现返回菜单功能。

四、开发u8g2多级菜单的步骤与注意事项(500-600字)开发u8g2多级菜单需要以下几个关键步骤和注意事项:1. 创建菜单结构:首先,定义菜单结构和数据。

C51与单片机系统多级菜单的模块化设计_汪高勇

C51与单片机系统多级菜单的模块化设计_汪高勇
Key words: sing le chip m icrocomputer; m ulti level menu; funct ion point er; menu module
单片机的应用中, 除了进行数据运算和过程控 制外, 还会使用到人机接口. 人机接口处理了操作者 的指令输入, 这些操作普遍采用了菜单方式进行命 令输入, 在使用液晶显示器的场合, 菜单更是必需的 设计. 对于汇编语言而言, 菜单可以使用制表法进行 菜单编写, 但是由于汇编语言可移植性和可读性较 差, 所以对于菜单的复杂性、菜单的可移植性、可维 护性以及可扩充性方面, 汇编语言处于弱势. 使用 C 语言可以解决这方面的问题, 利用 C 语言的数据结 构, 对菜单进行数据组织, 将菜单进行模块化设计, 可解决上述问题.
第 24 卷第 2 期 2009 年 4 月
电路与控制
光 电技 术应 用
EL ECT RO - OPT IC T ECHNO LOG Y AP PLI CAT ION
Vo l. 24, No. 2 Apr 块化设计
汪高勇, 宋毅恒, 尚举邦
( 东北电子技术研究所, 辽宁 锦州 121000)
图 2 菜单模块组成
图 1 共用键盘处理程序
图 1 中, 工作程序是软件中需要在主程序轮询 执行的任务程序, 用于检查系统的各种功能标识和 消息并进行处理. 共用键盘处理程序也算作一种任 务程序, 由主程序轮询执行. 如图 1 虚框所示, 当键 标志有效时, 程序对键值进行匹配, 执行当前菜单模 块对应的按键程序. N 个菜单模块同一时刻仅有一 个模块通过按键函数指针初始化得以装载.
1 菜单模块化设计原理
1. 1 共用键盘处理
菜单的模块化设计主要分为共用键盘处理和 菜单模块两部分. 主要原理是在主程序中设置一个 共用键盘处理程序, 各菜单模块利用统一的键盘接 口函数对共用键盘处理程序中的按键函数指针进行 重定向设定, 使得共用键盘处理程序能够指向各菜 单模块. 每次按键操作完毕, 均回到主程序, 这与常 用的菜单编程方法类似.

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计摘要本设计介绍了以ARM内核嵌入式处理器STM32为控制核心,辅以低功耗的液晶模块MFG240160-3-A,以及相应的按键控制电路,实现了LCD多级菜单的设计。

在本系统中,侧重点在于LCD的显示上,因此此系统的硬件结构很简单,侧重点在于软件架构及程序的编写上,该系统程序量大,函数封装多,关于实时时钟信息、波形存储信息都留有相应的软件接口,以便与其它模块正确的相连接。

本系统硬件电路简单,但显示信息丰富,可以移植到各种便携式的电子产品上去,为电子产品的显示界面的设计提供了一个新的思路。

关键词 STM32单片机;LCD多级菜单;低功耗;Base on STM32 Microprocessor LCD modules in the multi-level menu display systemAbstractThis design describes to STM32 embedded processor based on ARM core for control, coupled with low power consumption of LCD module MFG240160-3-A as well as the corresponding keys control circuitry, enabling multi-level menu design of LCD. In this system, the focus is on the LCD display, so this system hardware structure is very simple, the emphasis lies in software architectures and applications, the system capacity, function encapsulates the information about the real-time clock, waveform stored information will have the appropriate software interface so that correct with other modules that you are connecting to. This system is simple, but the display information-rich, portable to avariety of portable electronic products, for electronic product display interface design provides a new train of thought.Keywords: STM32; LCD multi-level menu; low-power;目录摘要(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((I Abstract(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ((II 前言 ............................................................... 4 1方案设计 (5)1.1 设计方案概述 (5)1.2 电路介绍 (5)2 器件介绍 (9)2.1 STM32简介 (9)2.2 MFG240160-3-A LCD介绍 (13)3 软件设计 (16)3.1 STM32单片机的初始化 (16)3.2 液晶屏的初始化 (20)3.3 数据的传输 (20)3.4 字模的提取 (21)3.5 菜单框架的设计 (23)3.6 字模库的建立 (25)3.7 函数库的封装 (25)3.8 菜单标记 (26)3.9 时钟信息的显示 (27)3.10 波形的显示 (28)4 结论 (30)参考文献 (31)致谢 ............................................ 错误~未定义书签。

基于有限状态机的SMS液晶显示终端的研究与实现

基于有限状态机的SMS液晶显示终端的研究与实现

发了状态的转移 , 使得系统运行在新的状态下,同时产生输出P 。
2 打 瞒d^h憎自 婶p0 o 4I I m& 瞄 -惜 a
维普资讯
计 算 机 应 用
ComDu erap l a i n t p i to s c
自动化技 术与应用》2 0 0 6年第 2 5卷第 1 期 1
状态 , 程序员不得 不花费大量的精力来协调各标志位 , 这样导致 程序的可读性变差 。 面向过程的程序设计方法要求程序跟随过程
2 有 限状 态机 的 实现
有限状态机的数学模型如下 : () 1 系统运行的状态是有 限的 ,并且在某个时刻系统只处在

个状态。 设系统的运行状态是 S 】s l .u 可 以定义系统 【 ,i , s , 0 l… 【 ( 系统运行状态的转移是有某个事件触发的。 没有事件触 2 )
t e i e ffn t t t a h n . e S S c n b e d so e n e e tb h rv r h d a o i ie s a e m c i e Th M a e r a ,t r d a d r s n y t e d i e .
Ke wo d : n t tt c ie LCD;S S sg l hp c mp tr y r sf i saema h n ; i e M ; in ec i o u e
1 引 言
由于没有操作系统 的支持 ,设计一个较为复杂的单片机短
消息显示系统应 用程 序是 比较麻烦 的。如果采用面 向过程 的方 法, 必然引入大量的标志位 , 用来实现键盘输入控制 、短消息 的
某一时刻的状态取值状态集合 S 中的某—值。没有事件的触发是 不可能有状态的转移 。 在某—时刻有事件 e 产生 , 该事件的产生触

51单片机实现多级液晶显示中文菜单

51单片机实现多级液晶显示中文菜单

51单片机实现多级液晶显示中文菜单【摘要】以AT89C51单片机控制使用比较普遍的YM12864液晶显示器为基础,介绍了一种采用分页原理实现多级中文菜单操作的方法。

给出了YM12864主要技术参数、显示特性和核心的程序。

设计的中文菜单具有一定的通用性,只需更改其中的菜单项即可将此设计应用到家电、仪器仪表等设备上,为操作者提供友好方便的中文操作界面。

【关键词】单片机;分页;YM12864液晶;中文菜单一、引言目前小型的显示器主要有LCD和LED,LED显示器只能显示数字和有限个英文字符,不能显示汉字,显示内容不直观,操作人员只能根据约定格式了解显示内容。

而LCD则可显示各种汉字和图形,尤其能实现中文菜单显示,为操作者提供方便友好的操作界面,并且功耗低,因此LCD得到广泛应用。

而现在市面上带中文字库的LCD比比皆是,价格适中,且大部分具有与MCU统一的标准接口,为使用LCD实现中文菜单操作提供了很大的方便。

相信更多的电子产品在提升性能的同时,设计更加人性化的中文菜单交互界面,将会使产品具有更广阔的前景。

二、YM12864液晶显示模块简介YM12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM (GDRAM)。

主要技术参数和显示特性:电源:VDD 3.3V~+5V(内置升压电路,无需负压)显示内容:128列×64行与MCU接口:8位或4位并行/3位串行多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。

其引脚功能为通用20脚LCD接口,用户指令集也为通用128*64LCD用户指令集,相关资料很容易获取。

因其内置中文字库,省去了自己造字库的工作量,而只需写入相应的汉字和字符内码即可显示所需要的汉字和字符,这在许多程序开发软件中很容易实现,如:WA VE、KEIL等。

所以使用带中文字库的LCD来实现中文菜单操会更加简便。

基于PLC的40 kW发射机控制系统的设计与实现

基于PLC的40 kW发射机控制系统的设计与实现

基于PLC的40 kW发射机控制系统的设计与实现党宏社;解琛;高赛赛;王黎【摘要】根据广播发射机实际的控制要求,设计了以PLC作为核心控制器的40 kW发射机控制系统,概述了系统的硬件设计,详细介绍了基于集成开发环境的软件设计;经过实验室测试和现场联调,该系统实现了对发射机的开关机控制、数据实时监测、故障分析及处理、历史信息记录及查询、参数设置等功能,不仅能够满足发射机所有的控制要求,还具备强大的远程控制能力和人机交互能力,有良好的可靠性和实时性.【期刊名称】《计算机测量与控制》【年(卷),期】2014(022)011【总页数】4页(P3581-3583,3587)【关键词】发射机;控制系统;PLC【作者】党宏社;解琛;高赛赛;王黎【作者单位】陕西科技大学电气与信息工程学院,西安 710021;陕西科技大学电气与信息工程学院,西安 710021;陕西科技大学电气与信息工程学院,西安 710021;陕西科技大学电气与信息工程学院,西安 710021【正文语种】中文【中图分类】TN948.50 引言发射机控制系统作为发射机设备的监控装置,通过与广播发射机的接口电路相接,实现对发射机运行状态实时监测,能够有效提高发射机工作的可靠性[1]。

当发射机出现异常时,控制系统对其做出相应的判断和必要的保护措施,能够极大地降低发射机工作过程中由于故障处理不及时而造成设备损坏的概率。

因此,发射机控制系统既能提高发射机工作稳定性和播出质量,又能减轻工作人员的负担和减少运营成本,一直是广电技术领域的研究重点。

随着科技的进步和数字化、信息化、网络化的时代到来,对广播发射机控制系统提出了更高的要求。

应用在发射机中的计算机控制系统常用的处理器种类主要可以分成3种:微控制器(单片机)、工控机和可编程逻辑控制器(PLC)[2]。

微控制器设计灵活,硬件成本低,但开发周期较长;PLC 抗电磁干扰能力强,可靠性高;工控机处于两种之间。

LCD12864菜单程序

LCD12864菜单程序

一起来学LCD12864菜单程序(包含完整程序)一起来学LCD12864菜单程序(包含完整程序)/*-------------------------------------------项目名:家电中央控制系统工程程序名:显示MCU总体程序编写人:杜洋初写时间:2005年9月5日晚20时程序功能:实现液晶、语音部分的人机对话和总线的通信实现方法:用中断实现总线接收CPU说明:89S5212MHZ晶振接口说明:(详见初定义)信息说明:修改日志:NO.1--------------------------------------------*/;----------------------------------------初定义LCDDAT EQU P2RS EQU P3.5RW EQU P3.6E EQU P3.7REDLED EQU P3.4BACKLED EQU P3.1PLAY EQU P1.7STOPIN EQU P3.0LIN EQU P3.2SPDAT EQU P1XX2 EQU P0.0LT_RAM EQU 30HLR_RAM EQU 40HSP_RAM EQU 20HDIS1_RAM EQU 50HDIS2_RAM EQU 70HDIS3_RAM EQU 60HDIS4_RAM EQU 80HRR1 EQU 26HRR3 EQU 21HRR4 EQU 22HT0_RAM EQU 23HQR3_RAM EQU 24HQR2_RAM EQU 25HLCDDISPLAY EQU 26H ;菜单显示移位寄存器MENU_RAM EQU 27H;菜单位置寄存器ONOFFLCD EQU 28H;-------------------------------------程序入口ORG 0000HJMP LCD_STARTORG 0003HJMP LIN_INT0ORG 000BHJMP LED_T0ORG 0030H;--------------------------------------主程序开始LCD_START br>SETB PLAYMOV T0_RAM,#250MOV TMOD,#01HSETB ET0MOV TL0,#0B0H ;50MS 定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值CLR IT0SETB EX0SETB TR0SETB EAMOV DPTR,#TAB_0CALL START_LCD;-----自检程序CALL DL1SMOV MENU_RAM,#00HMOV DPTR,#TAB_HCALL START_LCDCLR LCDDISPLAY;--------------------------------------主循环体程序LCD_LOOP br>JB ONOFFLCD,DISPLAY_PROLCD_LOOP_1br>JMP LCD_LOOP;---------------------------- 菜单显示处理DISPLAY_PRO br>MOV A,MENU_RAMMOV DPTR,#MENUTAB_HOSTRLC AJMP @A+DPTRMENUNEXT br>CALL START_LCDCLR LCDDISPLAYCLR ONOFFLCDJMP LCD_LOOP;-------------------------MENUTAB_HOST:JMP HOST_H ;主菜单JMP HOST_1 ; 1,控制JMP HOST_2 ; 2,设置JMP HOST_3 ; 3,智能JMP HOST_4 ; 4,帮助<。

单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现

单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现

单片机多级菜单编程实现(ZT) 建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。

采用这种办法,可以方便的添加或删减菜单。

并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。

具体结构定义我的定义,做个参考:#define MENU_HLP_EN 菜单帮助信息使能typedef struct{void (pMenuTaskInit)(void); 指向菜单任务初始化函数的指针void (pMenuTaskEnd)(void); 指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U MenuName; 菜单名称字符串WORK_MOD WorkMod; 工作状态编号MENU_TASK_TYP pMenuTask; 指向菜单任务的指针void (pTaskKeyDeal)(void); 指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U MenuHlp; 菜单帮助字符串#endifstruct MenuTyp pParent; 指向上层菜单的指针struct MenuTyp pChild; 指向子菜单的指针struct MenuTyp pRight; 指向右菜单的指针struct MenuTyp pLeft; 指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:菜单数据结构struct KeyTabStruct{uint8 MenuIndex; 当前状态索引号uint8 MaxItems; 本级菜单最大条目数uint8 ShowLevel; 菜单显示内容uint8 PressOk; 按下回车键时转向的状态索引号uint8 PressEsc; 按下返回键时转向的状态索引号uint8 PressDown; 按下向下键时转向的状态索引号uint8 PressUp; 按下向上键时转向的状态索引号void (CurrentOperate)(); 当前状态应该执行的功能操作};uint8 MenuID; 菜单ID号uint8 MenuNextID; 下级菜单ID号CurMenuID=本菜单IDMaxMenuItem=同级菜单最大项数OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DA TA_VIEW, MENU_NO, MENU_NO, MENU_NO, MenuEdit}, {MENU_DA TA_VIEW, 3, 1, MENU_DA TA_VIEW_FIRE, MENU_EDIT, MENU_SYS_EDIT, MENU_PRINT_DA TA,MenuEdit},{MENU_DA TA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_TROUBLE, MENU_STEP_FOLLOW, MenuDataViewIn},{MENU_DA TA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_REPEA T, MENU_DA TA_VIEW_FIRE, MenuDataViewIn},{MENU_DA TA_VIEW_REPEA T, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_FACE_CHECK, MENU_DA TA_VIEW_TROUBLE, MenuDataV iewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_STEP_FOLLOW,MENU_DA TA_VIEW_REPEA T, MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_FIRE, MENU_FACE_CHECK,MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DA TA, MENU_DA TA_VIEW, MenuEdit}, {MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULA TE,MENU_TIME_SET, MenuSumSet},{MENU_EDIT_INSULA TE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULA TE, MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET,MENU_LD_CONTROL, MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,MenuTimeSet},{MENU_PRINT_DA TA, 3, 3,MENU_PRINT_DA TA_FIRE, MENU_EDIT, MENU_DA TA_VIEW, MENU_SYS_EDIT, MenuEdit},{MENU_PRINT_DA TA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DA TA,MENU_PRINT_DA TA_TROUBLE, MENU_PRINT_SET, MenuPrintDataIn}, {MENU_PRINT_DA TA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINTER_CHECK,MENU_PRINT_DA TA_FIRE, MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_SET,MENU_PRINT_DA TA_TROUBLE, MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_DA TA_FIRE, MENU_PRINTER_CHECK, MenuPrintSet},};编程菜单显示数据const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, 选择消音→退出}, 主菜单{MENU_DA TA_VIEW , 1, 6, ⒈数据查看},{MENU_SYS_EDIT , 2, 6, ⒉系统编程},{MENU_PRINT_DA TA, 3, 6, ⒊数据打印}},{{MENU_NO , 0, 0, 数据查看消音→退出}, 数据查看{MENU_DA TA_VIEW_FIRE , 1, 4, ⒈火警},{MENU_DA TA_VIEW_TROUBLE, 2, 4, ⒉故障},{MENU_DA TA_VIEW_REPEA T , 3, 4, ⒊重码},{MENU_FACE_CHECK , 1,12, ⒋面板检测},{MENU_STEP_FOLLOW , 2,12, ⒌单步跟踪}},{{MENU_NO , 0, 0, 系统编程消音→退出}, 系统编程{MENU_SUM_SET , 1, 0, ⒈容量设置},{MENU_EDIT_INSULA TE , 2, 0, ⒉隔离点},{MENU_EDIT_HZ , 3, 0, ⒊汉字描述},{MENU_LD_CONTROL , 1,12, ⒋联动控制},{MENU_LD_DELAY, 2,12, ⒌模块延时},{MENU_TIME_SET , 3,12, ⒍时钟调整}},{{MENU_NO , 0, 0, 数据打印消音→退出}, 数据打印{MENU_PRINT_DA TA_FIRE , 1, 0, ⒈火警数据},{MENU_PRINT_DA TA_TROUBLE,2, 0, ⒉故障数据},{MENU_PRINTER_CHECK , 3, 0, ⒊打印机自检},{MENU_PRINT_SET , 1,12, ⒋打印设置}},};等待按键void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time = EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); 按键音return;}}}显示多级菜单void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC WhichKey == KEY_OK){ClearScreen();for(i=0;iKeyTab[MenuNextID].MaxItems+1;i++)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 初始化显示oldid =0;没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;指示原先的项}for(i=1;iKeyTab[MenuNextID].MaxItems+1;i++){if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow [j][i].Column,MenuEditShow[j][i].Pdata,1); 反显当前选择的项}}WhichKey = KEY_NONE;}系统编程uint32 Edit(void){struct KeyTabStruct NowKeyTab; 指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(NowKeyTab.CurrentOperate)(); 显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); 等待按键switch(WhichKey){case KEY_ESC if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(NowKeyTab.CurrentOperate) (); 显示当前菜单}elseescflag =TRUE; 退出编程状态break;case KEY_OK if(NowKeyTab.PressOk != MENU_NO){MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(NowKeyTab.CurrentOperate)(); 执行当前按键的操作break;case KEY_UP if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_DOWN if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_RESET ResetFlag = TRUE;break;default break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag)EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsigned char。

9基于状态机的设计

9基于状态机的设计
基于状态机的设计
状态机可以认为是组合逻辑和寄存器逻辑 的特殊组合,它一般包括两个部分:组合逻 辑部分和寄存器部分。 米里型(Mealy):输出是当前状态和当前 输入的函数。 摩尔型(Moore):输出只是当前状态的函 数。
摩尔型(Moore)
moore状态机比较容易用数学的方式来分析,因 此被更广泛的用在代数状态机理论中(algebraic FSM theory)。
PROCESS REG 时序进程 current_state next_state PROCESS COM 组合进程 LOCK
PROCESS LATCH 锁存器
LOCK1 CLK 模拟信号输入
AD574
CS A0 RC K12/8 STATUS D[11..0]
RAM
OR
FIFO
AD574采样状态机工作时序
米里型(Mealy)
Mealy 状态机通常可以有更少的状态变量,因此 在工程领域有更为广阔的应用, 状态变量越少,则所需的存储单元就越少。

状态A 进入100k量程 reset=1;std_f_sel=00; cntlow=1 clear=1 cntover=1 状态B 100k量程测量 reset=0;std_f_sel=00; cntover=1 状态D 10k量程测量 reset=0;std_f_sel=01; cntover=1 状态E 1k量程测量 reset=0;std_f_sel=11; cntlow=1
状态C 开始进入10k量程 reset=1;std_f_sel=01;
cntlow=1 状态E 进入1k量程 reset=1;std_f_sel=11;
状态编码
状态编码主要有5种编码方式: 1.顺序编码。 2.格雷码编码。 3.单热编码(one-hot)。 4.随机编码。 5.自动编码(面积最小化)。

LCD12864多级菜单课程设计

LCD12864多级菜单课程设计

LCD12864多级菜单课程设计一、课程目标知识目标:1. 理解LCD12864液晶显示屏的基本工作原理和接口技术。

2. 掌握多级菜单的设计方法,包括菜单结构、界面布局及跳转逻辑。

3. 学会编写程序代码实现LCD12864多级菜单的显示与操作。

技能目标:1. 能够运用所学知识设计出结构清晰、界面友好的多级菜单界面。

2. 熟练使用相关编程语言和开发工具,完成程序编写和调试。

3. 培养学生的动手操作能力和团队协作能力,提高问题解决能力。

情感态度价值观目标:1. 培养学生对电子技术和编程的兴趣,激发学习热情。

2. 培养学生严谨、细心的学习态度,养成良好的编程习惯。

3. 增强学生的创新意识,鼓励学生敢于尝试、勇于实践。

分析课程性质、学生特点和教学要求,本课程目标旨在帮助学生在掌握LCD12864多级菜单设计的基础上,提高实际操作能力,培养学生的创新思维和团队协作精神。

通过本课程的学习,使学生能够在实际项目中运用所学知识,为我国电子信息产业的发展做出贡献。

同时,注重培养学生的情感态度价值观,使学生在学习过程中形成积极向上的人生态度。

二、教学内容1. LCD12864液晶显示屏原理介绍:包括显示原理、接口技术、指令集等基本知识。

- 教材章节:第三章第二节- 内容列举:LCD12864工作原理、接口类型、指令功能。

2. 多级菜单设计方法:- 教材章节:第五章- 内容列举:菜单结构设计、界面布局、跳转逻辑、操作流程。

3. 编程实现LCD12864多级菜单:- 教材章节:第六章- 内容列举:编程环境搭建、代码编写、程序调试、功能实现。

4. 实例分析与操作:- 教材章节:第七章- 内容列举:典型多级菜单实例、操作方法、优化技巧。

5. 动手实践与团队协作:- 教材章节:第八章- 内容列举:实践任务分配、协作流程、成果展示。

根据课程目标,教学内容分为五个部分,确保学生系统掌握LCD12864多级菜单设计的相关知识。

教学大纲明确指出各部分内容的安排和进度,以及教材对应的章节和具体内容。

点阵式LCD菜单式用户界面的设计_叶廷东

点阵式LCD菜单式用户界面的设计_叶廷东

图 2 L CD 缓冲区 在此区间中, 系统用一个字节来表示当 前显示的窗口序号, 因此系统最多可以有 255 个窗口。本系统共设计了 7 个窗口, 分别 对 应于“数字 式输入、教导 式输入、试机、补
毛、植毛、产品参数和帮助”7 个工作界面。系 统再用一个字节来表示当前菜单, 当前菜单 主要用于光标的管理, 它表示光标正位于当 前菜单处。缓冲区的最后一部分为参数地址, 用两个字节来 存放显示内容存放的开 始地
0 概述
液晶显示器是一种应用十分广泛的显示 器件, 具有低功耗、重量轻和超薄等特点, 被 广泛应用在袖珍式仪点阵式 L CD 不仅可以显示字符与数 字, 还可以显示各种图形、曲线和汉字, 并且 可以实现屏 幕的滚动, 具 有动画、分区 开窗 口、反转、闪烁等功能。本文采用智能液晶终 端 KY—D104A ( 显示点阵 640×480) 。实现 了 5 轴植毛机控制系统中文界面的设计。
图 4 光标移动流程图 系统为了通过光标来选择菜单, 需要为 每个用户界面窗口建立一张光标位置和菜单 项、对话框参数地址的对照表。在菜单显示的 时候, 可由光标位置在窗口序号对应的对照 表里查找该菜单项的参数地址, 然后发送到 LCD 显示缓冲区, 由 LCD 显示程序进行发 送显示。如果在对照表中找不到, 则不进行任 何操作。
《电脑与信息技术》2004 年 第 5 期
·5 1·
栏, 在这一栏中有 7 个工作界面和两种工作 模式供用户选择, 他们的选择符号用“▲”来 表示。7 个工作界面即为 7 个主菜单。系统可 以通过这些主菜单选择不同的工作界面, 然 后显示和输入不同的参数。工作界面通过右
边的“工作状态/ 操作提示”栏显示。在图 1 用 户界面窗口的最下面一栏中, 左边有一个时 间项用来动态显示当前工作的时间, 右边的 3 个菜单项用于选择功能。

LCD课程设计---128X64液晶显示程序设计

LCD课程设计---128X64液晶显示程序设计

《CPLD/FPGA 》课程设计报告题目:128X64液晶显示程序设计院(系):信息科学与工程学院专业班级:通信1001班学生姓名:訚鹏学号:20101181021同组学生:秦佩指导教师:吴莉20 13 年 10 月 14 日至20 13 年 10 月 25 日华中科技大学武昌分校制128X64液晶显示程序设计课程设计任务书目录摘要 (3)1.课程设计的目的 (4)2.课程设计题目和要求 (4)3.课程设计报告内容 (4)3.1课程设计原理 (4)3.2课程设计相关图 (5)3.3课程设计程序 (6)3.4课程设计的结果 (14)3.5课程设计的波形仿真 (15)4.课程设计所遇到的问题及解决方案 (15)5.课程设计总结 (17)摘要在硬件电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,而VHDL语言是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体出发,自上至下地将设计任务分为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。

本课设主要是基于FPGA的128X64的液晶显示控制器。

控制部分采用VHDL语言编写,主体程序采用状态机作为主要控制方式。

关键字:VHDL,状态机,128641 课程设计的目的通过对液晶屏的安装调试,需学习掌握:(1)液晶屏显示文字的整体设计流程。

(2)Quartus2软件的调试方法及相关工具的使用。

(3)液晶屏LCD12864的使用方法。

(4)各种常见元器件的选择及使用。

2 课程设计题目描述和要求题目描述:频率计的设计制作要求:用VHDL编程控制LCD12864显示的频率计。

(1)用LCD12864显示“频率及姓名”等内容。

(2)显示过程:实验板通电开机后,下载运行之后,LCD显示器显示“频率及姓名”,本组成员等内容。

(3)熟悉单片机系统的工作原理及调测方法。

软硬件安装调测完成后根据系统的工作原理、过程、测试数据及遇到的问题与处理情况、体会等完成课设报告。

基于状态机的8路彩灯VHDL设计

基于状态机的8路彩灯VHDL设计

共 同决定输 出则 选用 Mel ay状态机 。 层次原 理 图设 计方法
自顶 而 下 ( O T O T P OD WN)的 层 次 化 设 计 方
可 以实 现手 动输入变 化花 型 。
2 设 计思路 : )
法在 现代 E DA设 计 中有 着明 显 的优势 ,越 来越 受
到 设计 者 的 欢 迎 。对 于 一 个复 杂 的 设 计 系统 , 运
调 试 方 式 , 即从 模 块调 试 向总 体 调 试 方 向开 展 调
试 工作 ,使 设计 中出现 的 问题在 模 块级 就能 发现 , 及 时 处 理 ,这 样就 会使 一 个 复 杂 的设 计 变 得 容 易
调试 ,缩短 了设 计时间 。
C L 器 件 为 载 体 , 将 应 用 电 子 技 术 、计 算机 技 PD 术、智能化技术 溶为一体 以实现 I C设 计 、 电 子
关键词 :8 路彩灯 ;V D ;状态机 H L 中图分类号 :T 3 21 U 5 .1 文献标识码 :B 文章编号 :1 0 - 1 4 2 1 ) ( -O 7-0 9 0 3 ( 0 11 下) l 6 3 0
D i 1 . 9 9 J is .0 9 1 4 2 1 . ( ) 6 o : 3 6 / . n 1 0 -0 3 . 0 1 1 下 . O 0 s
态机 要 限 据设 计 的具 体 情 况决 定 ,输 出 只 由当前
生 活 常用 的 电器 , 电子 彩灯 控 制 电路 的设 计要 求
也越 来越 高 。要 求我 们设 计 的彩灯 花 样 品种 更多 , 控 制更 加 方 便 ,灵 活 性 高 ,可 靠 性 高 。采 用 传 统 数 字 电路 设 计 的 彩灯 控 制 器 电 路 复 杂、设 计 周 期

一种用于触摸屏的多级菜单界面实现方法

一种用于触摸屏的多级菜单界面实现方法
党宏社 姚 勇 张新院
( 陕西科技大学 电气与信息工程学院 陕西 西安 7 1 0 0 2 1 )


介绍 一种用 于触摸屏 的 多级菜单界面的实现方 法, 该方法利用状 态转换 图将 人机界面 的 多级菜 单转化为 一级菜单 去实
现, 解除 了多级菜单概念上的隶属关系, 使各个菜单界面的设计与现实相互独立, 便于菜单的修改与扩展。该方法只需一个结构体
Ab s t r a c t An i mp l e me n t a t i o n me t h o d o f mu l t i — l e v e l me n u i n t e r f a c e f o r t o u c h i n g s c r e e n i S i n t r o d u c e d i n t h i s p a p e r .I n t h e me t h o d t h e
即可实现多级菜单结构 , 当菜 单界面较 多时, 可节省较大 的内存 空间。经实 际使用表 明, 使用该方法实现 的入机界面不仅工作 可靠、
操作简便 、 界面转换快 、 显示效果好 , 而且易于修 改与维 护。 关键词
中 图分 类 号
ቤተ መጻሕፍቲ ባይዱ多级菜单
触摸屏 人 机界面 状态转换 图 嵌入 式系统
文献标识码 A D O I : 1 0 . 3 9 6 9 / j . i s s n . 1 0 0 0 — 3 8 6 x . 2 0 1 3 . 1 0 . 0 4 4
T P 3 3 4 . 1
AN I M PLEM ENTATI oN M ETH oD oF M ULTI . LEVEL M ENU I NTERFACE Fo R ToUCHI NG SCREEN

基于状态机的工程设计

基于状态机的工程设计

2.6.4.2 基于状态机的工程设计方法学习利用quartusII软件中的状态机编辑器设计一个1110010序列检测器。

1.建立工程文件工程文件的建立主要包括指定工程文件名称、选择添加的文件和库及选择目标器件3个过程。

在quartusII菜单栏中选择Fil e→New Project Wizard,在弹出的图2.6.8对话框中输入新建工程所在的文件夹名称(exp_detect3)、工程名称(exp_detect3)和顶层实体名称(exp_detect3),然后点击Next,选择目标器件EPF10K20TC144-3,其他取系统默认设置,继续点击Next按钮,直至进入如图2.6.9所示的对话框,该对话框可以查看设置信息是否正确。

正确则单击Finish按钮,完成工程文件的建立。

图2.6.8 创建新工程文件1(指定工程文件名称)图2.6.9 工程创建结束对话框2.输入状态机⑴建立文件在quartusII菜单栏中选择Fil e→New,或单击工具栏中的按钮,在弹出的新建文件对话框中,选择State Machine File,单击OK按钮,进入如图2.6.10所示的状态机编辑器窗口。

图2.6.10 quartusII的状态机编辑窗口⑵创建状态机在quartusII的状态机编辑窗口的菜单栏中选择Tool s→State Machine Wizard,弹出如图2.6.11所示的状态机创建向导选择对话框。

在该对话框中选择Edit an existing state machine design,点击OK按钮,进入如图2.6.12所示的状态机向导4步中的步骤1对话框。

图2.6.11 状态机创建向导选择对话框①状态机向导步骤1:在图 2.6.12对话框中,选择复位Reset信号模式:同步(Synchronous)或者异步(Asynchronous),该序列检测器设计选择异步复位;选中复位信号Reset高电平有效(Reset is active-high);选中输出端的输出方式为寄存器方式(Register the output ports),点击Next 按钮,进入状态机向导步骤2对话框如图2.6.13。

基于光照传感器TSL2550的LCD亮度自动调节系统设计

基于光照传感器TSL2550的LCD亮度自动调节系统设计


专 4 系统总体设计 题
(4)
才对 LCD 显示器的亮度进行调节。当需要调节 LCD 显示器的亮度时,EPLD 先读取 LCD 显示器当前的 亮度值,然后根据当前外界的亮度值,即 TSL2550 检测的结果,计算出 LCD 显示器亮度调节值,对 LCD
光照传感器 TSL2550 检测环境光强度,经模数 显示器的亮度进行调节。系统状态机如图 3 所示。
测的结果会受到红外光的影响,输出光照强度大的 Intel 公司提出的应用于移动 PC 和桌面 PC 系统中的
测量值,与人眼的感觉有很大的差异。因此,在光 低速率通讯。它主要是希望通过一条廉价并且功能
照传感器设计中,一个关键的问题是要滤除红外光
专 对光照传感器检测结果的影响。本系统选用 TAOS 公 题 司的 TSL2550 型光照传感器,结构如图 1 所示。
发出读取 LCD 亮度命令
ST1
计算当前 LCD 亮度值 ST2
超出 可调 区间
模块,发出“读取 LCD 当前亮度”命令并读取 LCD
亮度值。计算亮度调节值模块根据比较器的另一个 输出——当前外界亮度值和 LCD 当前的亮度值,计
比较两个亮度 ST3 之间的差值
算出 LCD 亮度的调节值,并通过发数据模块对 LCD
Bmin/B 称为对比灵敏度阈,用 表示,
自然光
100
895
343
0.380
0.110
其值通常在 0.005 ̄0.05 之间。故只要
白炽灯
50
959
671
0.700
0.052
保持光源的最大亮度 Bmax 与最小亮度
46
2005 年第 6 期 中国仪器仪表
传感器技术 SENSOR TECHNOLOGY
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2012年12卷2期73-75页. 经验交流返回目录
基于状态机的LCD多级菜单设计
贾志成,程敏,宋涛,王彦,康志龙,郭艳菊
1. 河北工业大学信息工程学院,天津300401;
2.天津职业技术大学
1概述
液晶显示器(Liquid Crystal Display,LCD)由于其体积和功耗等因素,非常适合嵌入式环境的使用。

近年来,随着微处理器性能的提高,嵌入式系统实现的功能越来越强大,产生的数据量也越来越大。

相对应地,需要显示的数据量也随之增大。

嵌入式环境下使用LCD显示器,由于条件限制,体积较小,且显示的内容有限。

而且,传统的LCD显示模式总是不加选择地显示所有监控的信息,在监控的信息量非常庞大时会导致不能及时显示用户所需求的信息。

多级菜单显示则是将信息分类显示的一种显示方式,该方式根据用户的选择,对显示信息加以筛选并分级显示,这样既保证用户获取其所需的信息,又能保障信息显示的实时性。

2多级菜单的结构
设计多级菜单的目的在于将需要显示的信息分门归类,方便用户筛选。

所以在设计菜单时需要根据整个系统的功能和要求来设定菜单的级数,以及各级子菜单的个数。

整个多级菜单的拓扑结构为树型结构,主菜单为根节点,子菜单为枝节点,最后一级菜单为叶节点,如图1所示。

图1多级菜单的结构图
3多级菜单的程序设计
3.1循环方式
循环方式的设计思路:预先定义一个包含6个结构元素的结构体、5个字符型和1个指针型。

第1个字符变量存放当前界面的索引号;第2个字符变量存放按下“down(向下)”键时需要跳转到的索引号;第3个字符变量存放按下“up(向上)”键时需要跳转到的索引号;第4个字符变量存放按下“enter(进入)”键时需要跳转的索引号;第5个字符变量存放按下“esc (退出)”键时需要跳转的索引号;第6个变量为函数指针变量,存放当前索引号下需要执行的函数的入口地址。

将所有需要显示的界面其所对应的执行函数和按键索引号以结构体的形式列表存储。

具体实现如下:
typedef struct{
uchardown_index;
ucharup_index;
ucharenter_index;
ucharesc_index;
void (*operate)();
}Key_index_struct;
假设菜单分3级,共10个界面,则有:
Key_index_struct const Key_tab[10]={
{0, 0, 0, 1, 0,(*main_menu)},
{1, 2, 3, 4, 0,(*sub_menu1)},
{2, 3, 1, 5, 0,(*sub_menu2)},
{3, 1, 2, 7, 0,(*sub_menu3)},
{4, 4, 4, 4, 1,(*sub_menu1_1)},
{5, 6, 6, 5, 2,(*sub_menu2_1)},
{6, 5, 5, 5, 2,(*sub_menu2_2)},
{7, 8, 9, 7, 3,(*sub_menu3_1)},
{8, 9, 7, 8, 3,(*sub_menu3_2)},
{9, 7, 8, 9, 3,(*sub_menu3_3)},
};
void Lcd_display(void){
switch(Key_status){
case enter:
Key_fun=Key_tab[Key_fun].enter_index;
break;
case down:
Key_fun=Key_tab[Key_fun].down_index;
break;
case up:
Key_fun=Key_tab[Key_fun].up_index;
break;
case esc:
Key_fun=Key_tab[Key_fun].esc_index;
break;
default:
return;
break;
}
Key_fun_Pt=Key_tab[Key_fun].operate;
(*Key_fun_Pt)();//执行当前按键的操作
}
当微处理器扫描键盘检测到有按键按下时,根据按键按下的类型,返回在当前界面下其所对应的跳转索引号,并执行相应的函数。

由于每个界面的绘制都是由一个独立函数实现的,从循环方式的实现过程中发现,每发生一次按键按下操作都需要重新绘制整个屏幕。

如果核心处理器是低速主频的处理器,在界面切换的时候会闪烁。

而且,每一个界面都有固定不变的索引号,在增加或删除界面的时候需要重新修改整个列表,降低了程序的可移植性。

3.2查询方式
查询方式是通过结构体对自身的递归调用实现菜单的多级嵌套。

结构体通过对自身的两次调用构建双向列表。

一个菜单界面即为一个节点,节点的前驱和后继分别存放其父节点和子节
点的入口地址。

菜单参数的结构体定义如下:
typedef struct Lcd_menu_content{
uchar *lpIcon;//显示图标
uchar *lpText;//显示文本信息
uchar nTextCount; //菜单对应的文本信息的个数
}Lcd_menu_content;
每个界面对应一个节点,节点都定义成如下结构体的变量:
typedef struct Lcd_menu{
struct Lcd_menu*lpfather;//父级
struct Lcd_menu*lpson;//大儿子
uchar nSonCount;//父级的儿子个数
Lcd_menu_content lpIconAndText;
uchar Flag_return;//返回标志
void (*operate)();//处理函数入口地址
}Lcd_menu;
由图1可知,多级菜单的拓扑结构为树型拓扑结构,即每一个节点只有一个父节点和若干个子节点。

所以,对整个叉树进行遍历即可准确地查找到菜单界面所在的节点。

结构体实现的链表如图2所示。

图2结构体链表
查询方式与循环方式相比,由于减少了查表次数,因而改善了MPU的效率;但查询方式占用MPU处理时间过长,不适应需要高速处理数据的应用。

而且,在查询方式中增加或删除节点对程序改动较大,也不适合移植。

3.3状态机方式
状态机是由事件驱动,在各个状态之间跳转。

采用状态机方式时,只需要提供驱动事件(在此设计中驱动事件为有效的按键按下),然后根据按键扫描返回的键值,决定所要跳转的下一状态。

如图3所示,系统启动初始化是显示Main_menu界面,当按键检测有返回值(即有按键按下)时,根据按下的按键所代表的操作跳转到指定的状态。

例如:按下Up或者是down键时,只是在Main_menu界面内高亮显示不同区域;按下Enter时,则要根据原来按下的Up和down键来选择需要跳转的方向,假设在按下Enter之前仅按下一次down键,则key_v的值为2(key_v的值默认为1,即默认选中子菜单的第一项),就跳转为Sub_menu2界面;按下Esc键时,为从子菜单返回到上一级菜单,如果已经是主菜单了则返回的还是主菜单。

图3多级菜单的状态图
由于使用的是状态机的方式,只有发生一次有效的按键,状态才会发生一次跳转。

而且,仅当Enter和Esc键按下时,才会切换界面。

所以即便是在高速MPU应用中,也不会出现屏幕闪烁的效果。

从图3中可以看出,当要发生状态跳转时,目的状态只能是当前状态几个分支预测中的一个,从而不需要遍历整个列表,能够适应高速数据处理的场合。

多级菜单的程序流程如图4所示。

系统上电初始化后显示主菜单,键盘扫描可以通过主程序中循环查询或者中断扫描来实现,最终根据键盘返回的键值选择下一状态。

图5为基于状态机的多级菜单的实现。

图4多级菜单的程序流程图
图5多级菜单的实现
结语
以上三种多级菜单的实现方式均具有很强的实用性。

循环方式和查询方式下,程序结构简单易用,而状态机方式下程序可移植性强。

状态机程序设计不仅可以用在人机接口设计中,还可用于嵌入式通信协议等其他场合中。

参考文献
[1] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,1996:1415.
[2] 陆铮,罗嘉.单片机C语言下LCD多级菜单的一种实现方法[J].工矿自动化,2006(1):5051.
[3] 宋晓辉,叶桦,丁昊.基于单片机的多级菜单实现方法改进[J].东南大学学报:自然科学版,2007(37):66.
[4] 陈东,夏遂华.液晶显示多层菜单结构的软件设计[J].电气传动,2001(4):36.
程敏(硕士研究生),研究方向为电子遥测遥控、工业控制、嵌入式系统。

(责任编辑:芦潇静收稿日期:2011-09-06)。

相关文档
最新文档