引言
监控程序负责系统中全部硬件和软件资源的分配、调度工作,是系统设计中的一个重要组成部分。它提供用户接口, 使用户获得友好的工作环境, 使计算机获得很高的效率和高度的自动化。随着系统结构的日益复杂和功能的全面, 其监控程序的设计难度也越来越大。监控程序的质量直接影响系统的操作和运行,一个高质量的监控程序应是功能齐全、键数合理、操作方便、容错性好。监控程序在一定的意义上就是键盘分析程序,因此如何在面积较小的面板上设计一个功能多、操作简便的键盘操作系统成为智能仪器设计中非常重要的任务之一。
键盘上的按键可分为2类: 单义键和多义键。单义键,是指按键的含义是固定的,一个按键代表一个命令或一个数字,执行一种功能,即一键一义;多义键是指一个按键的键义不是单一的,而是具有多重含义,多个键互相配合才产生一个动作,执行一种功能,即一键多义。下面结合实例介绍这2种键盘监控程序的设计。
1 单义键监控程序的设计
CPU对键盘管理的方式一般有3种,即查询法、中断法和定时查询法。这3种方式的主要差别在于CPU转向键盘处理程序的方法。如果从程序设计逻辑讲,都是“有键按下则转去处理”。因此它们的键盘管理程序是可以相互转化的。下面以查询法为例,介绍一键一义键盘管理程序的设计。
微处理器周而复始地扫描键盘,当发现按键时,首先判别是命令键还是数字键。若是数字键,则把按键读数读入存储器,通常还进行显示;若是命令键,则根据按键读数查阅转移表,以获得处理子程序的入口。设一4×8的键盘,其中下面16个键为数字键,上面16个键为功能键。通过键盘扫描已经获得按键的编码,并且将该编码存储于累加器A中。那么,当键码小于10H时为数字键,否则为功能键。具体程序如下:
MOV R1,A
CLR C
SUBB A,#10H
JC DIGIT
MOV DPTR,#TBJ2
MOV A,R1
ANL A,#0FH
ADD A,A
JMP @A+DPTR
TBJ2: AJMP PROG1
AJMP PROG2
……
AJMP PROGn
DIGIT:……
一键一义键盘管理的核心是一张一维的转移表,在转移表内顺序登记了各个处理子程序的转移命令。
2 多义键监控程序的设计
对于功能复杂的微机化系统,若仍然采用“一键一义”,则按键使用往往过多,不但增加了费用,而且面板难以布置,操作也不方便。因此,有些键盘设计成一键多义方式。在一键多义的情况下,一个命令不是由按键,而是由一个按键序列组成。也就是说,对于一个按键的解释除了本次的按键外,还取决于这之前按了一些什么键。一键多义的监控程序有2种方法,即转移表法和状态转移法。下面对这两种方法进行介绍。
2.1 转移表法实现多义键监控程序
多义键的监控程序仍然可以采用转移表法进行设计,不过这时要用多张转移表。首先,要判断一个按键序列是否构成了一个合法的命令。若已经构成了合法命令,则根据前几个按键把控制引向某张合适的转移表,根据最后一个按键编码查阅该转移表,就找到了要求的子程序入口。
以一个8回路微机温控仪为例。该系统中有6个按键:C(回路号为1~8,第8回路为环境温度补偿,其余为控温点)、P(参数号,有实测值、设定值、P、I、D参数,上下限报警值,输出控制值等8个参数)、 Δ(加1)、Δ(减1)、R(运行)和S(停止运行)。显然,这些按键都是一键多义的。 Δ和Δ键的工作执行与否,取决于前面按过的C和P键;R键的功能执行与否,取决于当前的C值。用转移表法实现这些功能的流程如图1所示。
图1 转移表法实现多义键监控程序流程
从流程图可以看出,用转移表法实现多义键的设计需要两级转移表。
一级转移表
TBJ1 AJMP RUM
AJMP STOP
AJMP INCR
AJMP DECR
AJMP CHAL
AJMP PARA
二级转移表
TBJ2 AJMP C1P0
……
AJMP C1P7
AJMP C2P0
……
AJMPC7P7
2.2 状态转移法实现多义键监控程序
状态转移法是整体地来考虑应用系统,把它看作是一个系统,从而引入“状态”的概念。将系统工作过程划分为若干个“状态”,在任一状态下,每个按键都有一个确定的含义,即执行某一个子程序且变迁到下一个状态(称为“次态”,NEXST) 。因此,就需要在存储器内开辟一个单元记住当前状态(称为“现态”,PREST),根据当前状态和当前按键这两个关键词,就能对当前按键的含义作出正确的解释。用状态转移法设计的监控程序,其程序基本框架是相同的,具有通用性强、修改方便、便于阅读的优点。本文结合“多功能波形发生器”应用实例,详细介绍了状态转移法的监控程序设计过程。
2.2.1 键语分析的定义
键语必须有明确的定义, 而且应有一套无二意的语法规则。假设多功能波形发生器的按键如图2 所示,且各按键的定义如下: AMPL(幅度)、FREQ(频率)、FUNC(函数)、OFST(偏移)、MODE(模式)、UNIT(单元号)、ON(开)、OFF(关)、CHS(换符号)、DIG(数字键统称)、MULT(乘法)。
图2 多功能波形发生器的按键
2.2.2 建立键语状态图
用普通语言对全部键语做出详尽准确的规定是很困难的, 可以用键语状态图的方法对全部的键语做出完备的定义。这里用图3所示的键语状态图来描述键语的完备集。状态图中每一个方框表示一个状态(按过一次键), 框内的数字是状态的代号。箭头表示状态变迁的方向, 箭头上的标语是一个按键的代名, 表示变迁的条件, 其中非法键统称为“*”。假设最初开机时初始化使系统处于0态, 只要按过一个键之后, 系统就不可能再处于0态。假定系统现在处于0态,按下AMPL键后系统就转入了1态。在1态中,如果按下CHS或者DIG键就可以进行幅值的设定;如果按下其他的键,则为无效键,系统重新回到0态。
图3 键语状态图
2.2.3 建立键语状态表
根据键语状态图就可以制作出键语状态表。状态表中规定: 当仪器设备处于某一状态(现态)时,若满足一定的条件就必须脱离该状态而进入另一个指定的状态(次态),以及仪器设备所应采取的行动。该系统的部分状态表如表1所列。
表1 键语状态表
对于每个按键, 可以用2个变量描述其特征:
FNKYC = 功能性键码(functional keycode),用来代替每一按键的实际键码编码。功能相同的按键可以赋予相同的FNKYC 值, 例如一切数字键的FNKYC值为1。各按键的FNKYC值如表2所列。
表2中,各按键的FNKYC 值NUMB=数。数字键所对应的NUMB值就是该键所规定的数字, 例如, [3] 的NUMB为3;[GHz] [MHz] [kHz] [Hz] 规定为10、11、12、13;其他键的NUMB值统一规定为0。
表2 按键的FNKYC值对照表
2.2.4 建立状态索引表
根据状态表可以建立状态索引表,状态索引表为两级表。其中,第一级状态索引表中为每一状态的转移命令;第二级状态索引表中,为该状态下按下某一键后进入的次态和执行的子程序号。
如图3所示, 系统共有7 种不同的状态,可以在内存的一块连续空间中存储这7 种状态的特征,这就是第一级状态索引表。而对应于每一状态的相关参数可以用下面几个变量来描述。
① FNKYT: 状态表中所列的功能性键码。将根据实际按下的键的FNKYC 值, 查找状态表中是否有一个与之相符的FNKYT值。
② NEXST: 下一个状态(NEXT STATE)。它指出当某一FNKYC 与FNKYT 相符时, 系统应进入哪一个状态。
③ ACTN: 行动子程序号码。它指出当系统处于某一状态时所应执行的行动。
这3个参量就建立了第二级状态索引表。该系统的状态索引表如图4所示。
图4 状态索引表
2.2.5 程序设计流程
现在可以设计键语分析程序。首先,要有一个识键程序来识别所按下的按键,从所获得的实际键码中求出其对应的FNKYC 和NUMB 值, 这可以利用查表法或适当的算法得到;然后,根据当前的状态PREST在第一级状态索引表中得到对应当前状态的第二级索引表的入口地址,在第二级状态索引表中将FNKYC与表中的FNKYT逐项比较,当二者相同时得到对应该按键的下一个状态NEXST, 以及所对应的行动ACTN; 随后, 把这个NEXST 值替换为当前状态PREST。如果FNKYT为0时始终没有与FNKYC对应的FNKYT,就意味着该FNKYT是一个非法键, 应该不予理睬; 反之, 则是有效键, 程序就转移到相应的子程序去执行。具体设计流程如图5所示。
图5 程序设计流程
3 结论
用状态法进行多义键的设计,有以下几方面的优点:
① 应用一张状态表, 统一处理任何一组按键和状态的组合, 化繁为简, 降低了程序设计的难度, 增强了程序的可读性。
② 翻译、解释按键程序和执行子程序完全分离,避免了两者之间的相互交叉和混淆。
③ 当系统的功能发生改变时, 主控程序的结构不变, 只需对状态表进行修改。
参考文献
[1] 周航慈. 单片机应用程序设计技术[M]. 北京: 北京航空航天大学出版社,1991.
[2] 何立民. 单片机应用系统设计系统配置与接口技术[M]. 北京: 北京航空航天大学出版社,1996.
孙守昌(讲师),主要研究方向为嵌入式系统开发。