測(cè)控系統(tǒng)的微機(jī)化監(jiān)控程序設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
引言
監(jiān)控程序負(fù)責(zé)系統(tǒng)中全部硬件和軟件資源的分配、調(diào)度工作,是系統(tǒng)設(shè)計(jì)中的一個(gè)重要組成部分。它提供用戶接口, 使用戶獲得友好的工作環(huán)境, 使計(jì)算機(jī)獲得很高的效率和高度的自動(dòng)化。隨著系統(tǒng)結(jié)構(gòu)的日益復(fù)雜和功能的全面, 其監(jiān)控程序的設(shè)計(jì)難度也越來(lái)越大。監(jiān)控程序的質(zhì)量直接影響系統(tǒng)的操作和運(yùn)行,一個(gè)高質(zhì)量的監(jiān)控程序應(yīng)是功能齊全、鍵數(shù)合理、操作方便、容錯(cuò)性好。監(jiān)控程序在一定的意義上就是鍵盤分析程序,因此如何在面積較小的面板上設(shè)計(jì)一個(gè)功能多、操作簡(jiǎn)便的鍵盤操作系統(tǒng)成為智能儀器設(shè)計(jì)中非常重要的任務(wù)之一。
鍵盤上的按鍵可分為2類:?jiǎn)瘟x鍵和多義鍵。單義鍵,是指按鍵的含義是固定的,一個(gè)按鍵代表一個(gè)命令或一個(gè)數(shù)字,執(zhí)行一種功能,即一鍵一義;多義鍵是指一個(gè)按鍵的鍵義不是單一的,而是具有多重含義,多個(gè)鍵互相配合才產(chǎn)生一個(gè)動(dòng)作,執(zhí)行一種功能,即一鍵多義。下面結(jié)合實(shí)例介紹這2種鍵盤監(jiān)控程序的設(shè)計(jì)。
1 單義鍵監(jiān)控程序的設(shè)計(jì)
CPU對(duì)鍵盤管理的方式一般有3種,即查詢法、中斷法和定時(shí)查詢法。這3種方式的主要差別在于CPU轉(zhuǎn)向鍵盤處理程序的方法。如果從程序設(shè)計(jì)邏輯講,都是“有鍵按下則轉(zhuǎn)去處理”。因此它們的鍵盤管理程序是可以相互轉(zhuǎn)化的。下面以查詢法為例,介紹一鍵一義鍵盤管理程序的設(shè)計(jì)。
微處理器周而復(fù)始地掃描鍵盤,當(dāng)發(fā)現(xiàn)按鍵時(shí),首先判別是命令鍵還是數(shù)字鍵。若是數(shù)字鍵,則把按鍵讀數(shù)讀入存儲(chǔ)器,通常還進(jìn)行顯示;若是命令鍵,則根據(jù)按鍵讀數(shù)查閱轉(zhuǎn)移表,以獲得處理子程序的入口。設(shè)一4×8的鍵盤,其中下面16個(gè)鍵為數(shù)字鍵,上面16個(gè)鍵為功能鍵。通過(guò)鍵盤掃描已經(jīng)獲得按鍵的編碼,并且將該編碼存儲(chǔ)于累加器A中。那么,當(dāng)鍵碼小于10H時(shí)為數(shù)字鍵,否則為功能鍵。具體程序如下:
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:……
一鍵一義鍵盤管理的核心是一張一維的轉(zhuǎn)移表,在轉(zhuǎn)移表內(nèi)順序登記了各個(gè)處理子程序的轉(zhuǎn)移命令。
2 多義鍵監(jiān)控程序的設(shè)計(jì)
對(duì)于功能復(fù)雜的微機(jī)化系統(tǒng),若仍然采用“一鍵一義”,則按鍵使用往往過(guò)多,不但增加了費(fèi)用,而且面板難以布置,操作也不方便。因此,有些鍵盤設(shè)計(jì)成一鍵多義方式。在一鍵多義的情況下,一個(gè)命令不是由按鍵,而是由一個(gè)按鍵序列組成。也就是說(shuō),對(duì)于一個(gè)按鍵的解釋除了本次的按鍵外,還取決于這之前按了一些什么鍵。一鍵多義的監(jiān)控程序有2種方法,即轉(zhuǎn)移表法和狀態(tài)轉(zhuǎn)移法。下面對(duì)這兩種方法進(jìn)行介紹。
2.1 轉(zhuǎn)移表法實(shí)現(xiàn)多義鍵監(jiān)控程序
多義鍵的監(jiān)控程序仍然可以采用轉(zhuǎn)移表法進(jìn)行設(shè)計(jì),不過(guò)這時(shí)要用多張轉(zhuǎn)移表。首先,要判斷一個(gè)按鍵序列是否構(gòu)成了一個(gè)合法的命令。若已經(jīng)構(gòu)成了合法命令,則根據(jù)前幾個(gè)按鍵把控制引向某張合適的轉(zhuǎn)移表,根據(jù)最后一個(gè)按鍵編碼查閱該轉(zhuǎn)移表,就找到了要求的子程序入口。
以一個(gè)8回路微機(jī)溫控儀為例。該系統(tǒng)中有6個(gè)按鍵:C(回路號(hào)為1~8,第8回路為環(huán)境溫度補(bǔ)償,其余為控溫點(diǎn))、P(參數(shù)號(hào),有實(shí)測(cè)值、設(shè)定值、P、I、D參數(shù),上下限報(bào)警值,輸出控制值等8個(gè)參數(shù))、 Δ(加1)、Δ(減1)、R(運(yùn)行)和S(停止運(yùn)行)。顯然,這些按鍵都是一鍵多義的。 Δ和Δ鍵的工作執(zhí)行與否,取決于前面按過(guò)的C和P鍵;R鍵的功能執(zhí)行與否,取決于當(dāng)前的C值。用轉(zhuǎn)移表法實(shí)現(xiàn)這些功能的流程如圖1所示。
圖1 轉(zhuǎn)移表法實(shí)現(xiàn)多義鍵監(jiān)控程序流程
從流程圖可以看出,用轉(zhuǎn)移表法實(shí)現(xiàn)多義鍵的設(shè)計(jì)需要兩級(jí)轉(zhuǎn)移表。
一級(jí)轉(zhuǎn)移表
TBJ1 AJMP RUM
AJMP STOP
AJMP INCR
AJMP DECR
AJMP CHAL
AJMP PARA
二級(jí)轉(zhuǎn)移表
TBJ2 AJMP C1P0
……
AJMP C1P7
AJMP C2P0
……
AJMPC7P7
2.2 狀態(tài)轉(zhuǎn)移法實(shí)現(xiàn)多義鍵監(jiān)控程序
狀態(tài)轉(zhuǎn)移法是整體地來(lái)考慮應(yīng)用系統(tǒng),把它看作是一個(gè)系統(tǒng),從而引入“狀態(tài)”的概念。將系統(tǒng)工作過(guò)程劃分為若干個(gè)“狀態(tài)”,在任一狀態(tài)下,每個(gè)按鍵都有一個(gè)確定的含義,即執(zhí)行某一個(gè)子程序且變遷到下一個(gè)狀態(tài)(稱為“次態(tài)”,NEXST)。因此,就需要在存儲(chǔ)器內(nèi)開(kāi)辟一個(gè)單元記住當(dāng)前狀態(tài)(稱為“現(xiàn)態(tài)”,PREST),根據(jù)當(dāng)前狀態(tài)和當(dāng)前按鍵這兩個(gè)關(guān)鍵詞,就能對(duì)當(dāng)前按鍵的含義作出正確的解釋。用狀態(tài)轉(zhuǎn)移法設(shè)計(jì)的監(jiān)控程序,其程序基本框架是相同的,具有通用性強(qiáng)、修改方便、便于閱讀的優(yōu)點(diǎn)。本文結(jié)合“多功能波形發(fā)生器”應(yīng)用實(shí)例,詳細(xì)介紹了狀態(tài)轉(zhuǎn)移法的監(jiān)控程序設(shè)計(jì)過(guò)程。
2.2.1 鍵語(yǔ)分析的定義
鍵語(yǔ)必須有明確的定義, 而且應(yīng)有一套無(wú)二意的語(yǔ)法規(guī)則。假設(shè)多功能波形發(fā)生器的按鍵如圖2 所示,且各按鍵的定義如下: AMPL(幅度)、FREQ(頻率)、FUNC(函數(shù))、OFST(偏移)、MODE(模式)、UNIT(單元號(hào))、ON(開(kāi))、OFF(關(guān))、CHS(換符號(hào))、DIG(數(shù)字鍵統(tǒng)稱)、MULT(乘法)。
圖2 多功能波形發(fā)生器的按鍵
2.2.2 建立鍵語(yǔ)狀態(tài)圖
用普通語(yǔ)言對(duì)全部鍵語(yǔ)做出詳盡準(zhǔn)確的規(guī)定是很困難的, 可以用鍵語(yǔ)狀態(tài)圖的方法對(duì)全部的鍵語(yǔ)做出完備的定義。這里用圖3所示的鍵語(yǔ)狀態(tài)圖來(lái)描述鍵語(yǔ)的完備集。狀態(tài)圖中每一個(gè)方框表示一個(gè)狀態(tài)(按過(guò)一次鍵), 框內(nèi)的數(shù)字是狀態(tài)的代號(hào)。箭頭表示狀態(tài)變遷的方向, 箭頭上的標(biāo)語(yǔ)是一個(gè)按鍵的代名, 表示變遷的條件, 其中非法鍵統(tǒng)稱為“*”。假設(shè)最初開(kāi)機(jī)時(shí)初始化使系統(tǒng)處于0態(tài), 只要按過(guò)一個(gè)鍵之后, 系統(tǒng)就不可能再處于0態(tài)。假定系統(tǒng)現(xiàn)在處于0態(tài),按下AMPL鍵后系統(tǒng)就轉(zhuǎn)入了1態(tài)。在1態(tài)中,如果按下CHS或者DIG鍵就可以進(jìn)行幅值的設(shè)定;如果按下其他的鍵,則為無(wú)效鍵,系統(tǒng)重新回到0態(tài)。
圖3 鍵語(yǔ)狀態(tài)圖
2.2.3 建立鍵語(yǔ)狀態(tài)表
根據(jù)鍵語(yǔ)狀態(tài)圖就可以制作出鍵語(yǔ)狀態(tài)表。狀態(tài)表中規(guī)定:當(dāng)儀器設(shè)備處于某一狀態(tài)(現(xiàn)態(tài))時(shí),若滿足一定的條件就必須脫離該狀態(tài)而進(jìn)入另一個(gè)指定的狀態(tài)(次態(tài)),以及儀器設(shè)備所應(yīng)采取的行動(dòng)。該系統(tǒng)的部分狀態(tài)表如表1所列。
表1 鍵語(yǔ)狀態(tài)表
對(duì)于每個(gè)按鍵, 可以用2個(gè)變量描述其特征:
FNKYC = 功能性鍵碼(functional keycode),用來(lái)代替每一按鍵的實(shí)際鍵碼編碼。功能相同的按鍵可以賦予相同的FNKYC 值, 例如一切數(shù)字鍵的FNKYC值為1。各按鍵的FNKYC值如表2所列。
表2中,各按鍵的FNKYC 值NUMB=數(shù)。數(shù)字鍵所對(duì)應(yīng)的NUMB值就是該鍵所規(guī)定的數(shù)字, 例如, [3] 的NUMB為3;[GHz] [MHz] [kHz] [Hz] 規(guī)定為10、11、12、13;其他鍵的NUMB值統(tǒng)一規(guī)定為0。
表2 按鍵的FNKYC值對(duì)照表
2.2.4 建立狀態(tài)索引表
根據(jù)狀態(tài)表可以建立狀態(tài)索引表,狀態(tài)索引表為兩級(jí)表。其中,第一級(jí)狀態(tài)索引表中為每一狀態(tài)的轉(zhuǎn)移命令;第二級(jí)狀態(tài)索引表中,為該狀態(tài)下按下某一鍵后進(jìn)入的次態(tài)和執(zhí)行的子程序號(hào)。
如圖3所示, 系統(tǒng)共有7 種不同的狀態(tài),可以在內(nèi)存的一塊連續(xù)空間中存儲(chǔ)這7 種狀態(tài)的特征,這就是第一級(jí)狀態(tài)索引表。而對(duì)應(yīng)于每一狀態(tài)的相關(guān)參數(shù)可以用下面幾個(gè)變量來(lái)描述。
① FNKYT: 狀態(tài)表中所列的功能性鍵碼。將根據(jù)實(shí)際按下的鍵的FNKYC 值, 查找狀態(tài)表中是否有一個(gè)與之相符的FNKYT值。
② NEXST: 下一個(gè)狀態(tài)(NEXT STATE)。它指出當(dāng)某一FNKYC 與FNKYT 相符時(shí), 系統(tǒng)應(yīng)進(jìn)入哪一個(gè)狀態(tài)。
③ ACTN: 行動(dòng)子程序號(hào)碼。它指出當(dāng)系統(tǒng)處于某一狀態(tài)時(shí)所應(yīng)執(zhí)行的行動(dòng)。
這3個(gè)參量就建立了第二級(jí)狀態(tài)索引表。該系統(tǒng)的狀態(tài)索引表如圖4所示。
圖4 狀態(tài)索引表
2.2.5 程序設(shè)計(jì)流程
現(xiàn)在可以設(shè)計(jì)鍵語(yǔ)分析程序。首先,要有一個(gè)識(shí)鍵程序來(lái)識(shí)別所按下的按鍵,從所獲得的實(shí)際鍵碼中求出其對(duì)應(yīng)的FNKYC 和NUMB 值, 這可以利用查表法或適當(dāng)?shù)乃惴ǖ玫?;然后,根?jù)當(dāng)前的狀態(tài)PREST在第一級(jí)狀態(tài)索引表中得到對(duì)應(yīng)當(dāng)前狀態(tài)的第二級(jí)索引表的入口地址,在第二級(jí)狀態(tài)索引表中將FNKYC與表中的FNKYT逐項(xiàng)比較,當(dāng)二者相同時(shí)得到對(duì)應(yīng)該按鍵的下一個(gè)狀態(tài)NEXST, 以及所對(duì)應(yīng)的行動(dòng)ACTN; 隨后, 把這個(gè)NEXST 值替換為當(dāng)前狀態(tài)PREST。如果FNKYT為0時(shí)始終沒(méi)有與FNKYC對(duì)應(yīng)的FNKYT,就意味著該FNKYT是一個(gè)非法鍵, 應(yīng)該不予理睬; 反之, 則是有效鍵, 程序就轉(zhuǎn)移到相應(yīng)的子程序去執(zhí)行。具體設(shè)計(jì)流程如圖5所示。
圖5 程序設(shè)計(jì)流程
3 結(jié)論
用狀態(tài)法進(jìn)行多義鍵的設(shè)計(jì),有以下幾方面的優(yōu)點(diǎn):
① 應(yīng)用一張狀態(tài)表, 統(tǒng)一處理任何一組按鍵和狀態(tài)的組合, 化繁為簡(jiǎn), 降低了程序設(shè)計(jì)的難度, 增強(qiáng)了程序的可讀性。
② 翻譯、解釋按鍵程序和執(zhí)行子程序完全分離,避免了兩者之間的相互交叉和混淆。
③ 當(dāng)系統(tǒng)的功能發(fā)生改變時(shí), 主控程序的結(jié)構(gòu)不變, 只需對(duì)狀態(tài)表進(jìn)行修改。