DSP系統(tǒng)中鍵盤處理的一種新方法
郭 建 張新政 摘要:介紹了一種新的用于dsp系統(tǒng)中的鍵盤處理方法。與單片機系統(tǒng)中常用的程序掃描鍵盤處理方式相比,這種定時-計數(shù)的方法能夠有效地節(jié)約系統(tǒng)開銷,且對鍵盤處理快速可靠。
關(guān)鍵詞:鍵盤處理;數(shù)字信號處理器;串行rom
1引言
在各種數(shù)字控制系統(tǒng)中,大多數(shù)都用鍵盤和led作為人機交互界面。一般地,鍵盤分為編碼和非編碼兩種。編碼方式的鍵盤要使用專門的硬件來識別按鍵,系統(tǒng)比較復(fù)雜且占用較多的硬件資源。實際應(yīng)用中編碼方式的鍵盤使用得越來越少,相應(yīng)地大多數(shù)系統(tǒng)都采用非編碼鍵,并用軟件的方式對鍵盤進行掃描處理。文獻[1]給出了單片機系統(tǒng)中三種軟件掃描鍵盤的方法:(1)程序控制掃描方式;(2)定時掃描方式;(3)中斷掃描方式。(2)和(3)都要占用單片機系統(tǒng)中的資源,故而大多數(shù)單片機控制系統(tǒng)都采用程序控制掃描方式來處理鍵盤。
近年來,dsp以其高速處理能力、高集成度、資源豐富、應(yīng)用靈活等優(yōu)點而在許多領(lǐng)域中得到了越來越廣泛的應(yīng)用。在數(shù)字控制領(lǐng)域目前用得最多的是ti的c2000系列dsp。dsp系統(tǒng)中可以采用程序控制掃描方式對鍵盤進行處理,但如果沿用單片機系統(tǒng)中常用的程序控制掃描方式會有很大的不足——失去了dsp控制系統(tǒng)的快速性。本文介紹了dsp系統(tǒng)一種新的程序控制掃描方式。
2兩種不同的程序掃描方式
我們知道按鍵在接通與斷開的瞬間都會產(chǎn)生抖動,為了避免因干擾信號造成的鍵盤誤處理以及對同一按鍵的多次處理,都要進行時間長短不等的延時掃描,一般經(jīng)過10~30ms的延時后再對鍵盤進行處理。其流程圖如圖1所示。在這種程序掃描模式下,延時去抖動的20ms內(nèi)程序不能做其它工作。對基于單片機的要求處理速度不高的系統(tǒng)來說這種方法是可以容忍的,但是對基于dsp的高速處理系統(tǒng),20ms延時卻是一個很大的浪費。下面以圖2所示的系統(tǒng)簡圖為例,介紹一種新的用在dsp系統(tǒng)中的鍵盤處理方法,采用此方法可以大大減少程序掃描鍵盤時的時間,從而為系統(tǒng)其它任務(wù)節(jié)約時間。
新的鍵盤處理方式采用定時-計數(shù)的方法來實現(xiàn)。程序流程圖如圖3示。定時由dsp系統(tǒng)內(nèi)部定時器來實現(xiàn)。定時時間可根據(jù)實際需要來設(shè)定,在此設(shè)置為1ms。計數(shù)則可通過在ram區(qū)設(shè)定計數(shù)器變量ct20ms來實現(xiàn)。有時候為了盡量少地設(shè)置按鍵,而使某些鍵具有雙重功能。也就是說用戶正常按某一按鍵keyi,程序處理keyi的第一功能;用戶長時間(比如大于1秒)則處理keyi的第二功能。例如在我們將key1設(shè)置為add鍵,正常情況下,每按一次所設(shè)置的參數(shù)加1,如果按add鍵超過1秒則參數(shù)值加10;將key2設(shè)置為停止/清故障標(biāo)志鍵,正常情況下按key2則系統(tǒng)停止運行,按key2超過1秒則清除系統(tǒng)因故障/保護而出現(xiàn)的標(biāo)志位。用圖1中程序掃描方法是不能實現(xiàn)單鍵雙重功能的,而采用圖3中的定時-計數(shù)方法卻是能夠做到的。
相關(guān)變量定義及鍵盤處理子程序如下:
.include“f240regs.h”
.bssct20ms,1
.bssct1sec,1
.bsskeyvalue,1
.bsskeyprogaddr,1
flag.setbit15...
.text
;定時-計數(shù)法鍵盤掃描子程序
keyroutine:
ldp#pbdatdir>>7;讀iopb
laclpbdatdir
and#0fh
ldp#keyvalue
saclkeyvalue;存鍵值
xor#0fh
bcndkeypressed,neq
nokeypressed:
splk#00h,ct20ms
splk#00h,ct1sec
bendkeyroutine
keypressed:
ldp#ct20ms
bitct20ms,flag
bcndcheck1sec,tc
laclct20ms
add#1
saclct20ms
sub#20
bcndendkeyroutine,lt
splk#8000h,ct20ms;置標(biāo)志位并清
;計數(shù)器為0
bjudgekey
check1sec:;是否到1秒?
ldp#ct1sec
laclct1sec
add#1
saclct1sec
sub#1000
bcndendkeyroutine,lt
splk#8000h,ct1sec
judgekey:
ldp#keyvalue
laclkeyvalue;鍵值范圍:06-0eh
sub#6
add#keytable
tblrkeyprogaddr
laclkeyprogaddr
bacc
keytable.wordkey1prog
.wordkey2prog
…
.wordkey9prog
endkeyroutine:
ret
key1鍵處理程序如下,兩個功能可根據(jù)實際需求來編寫。
key1prog:
ldp#ct1sec
bitct1sec,flag
bcndkey1func2,tc
key1func1:
…;key1的第一功能
bendkeyroutine
key1func2:
…;key1的第二功能
bendkeyroutine
對上述程序有幾點需要說明,首先,按照本程序所實現(xiàn)的按鍵的第一功能和第二功能兩者不能相互沖突,且第二功能只有在第一功能完成一次以后才能實現(xiàn)。對于單一功能的鍵只須在其相應(yīng)程序的開始之處置判斷ct20ms標(biāo)志位是否為1語句,如果ct20ms.flag=1則直接返回,不再重復(fù)處理。其次,第二功能可執(zhí)行一次(從圖3中的y*處直接返回)也可執(zhí)行多次(從圖3中的y**處再次調(diào)用功能2處理程序)。上文所述的key1鍵可以設(shè)置是允許多次執(zhí)行,從而實現(xiàn)連續(xù)加10功能;而key