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