【文章內(nèi)容簡介】
行接口雙向傳送的連接線上,依次對每一行發(fā)出一個低電平,對列線進(jìn)行檢測,如顯示低電平,則確定按鍵。鍵盤處理的重要環(huán)節(jié)是掃描和去抖,這里采用定時掃描和計(jì)數(shù)去抖的鍵盤處理方法,它不僅使程序非常簡單高效,而且便于靈活擴(kuò)展實(shí)現(xiàn)處理更復(fù)雜的鍵盤要求。因?yàn)橐话闳说陌存I速度至多是10次/秒,亦即一次按鍵時間是100ms,所以按下的時間可估算為50ms。以取樣信號CP頻率為8ms(125Hz),則可取樣到6次。一般消抖動信號是頻率必須比其它的電路使用的脈沖信號頻率更高,一般消抖動頻率是鍵盤掃描或LED頻率的4倍或更高。這是矩陣鍵盤的完整描述,包括掃描、消抖動、譯碼:ENTITY key_44 IS PORT(CLK : IN STD_LOGIC。 系統(tǒng)時鐘脈沖 KEY_DRV : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)。 掃描序列 KEY_IN : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 鍵盤輸入 OUT_NUMB : OUT INTEGER RANGE 0 TO 15 按鍵輸入譯碼后的值 )。END 。ARCHITECTURE key44 OF key_44 IS 時鐘產(chǎn)生模塊 COMPONENT clk_gen IS PORT(CLK : IN STD_LOGIC。 全局時鐘 CLK_SCAN : OUT STD_LOGIC。 掃描鍵盤時鐘 125Hz CLK_XD : OUT STD_LOGIC 鍵盤消抖動時鐘 25Hz )。 END COMPONENT clk_gen。 掃描序列產(chǎn)生模塊 COMPONENT key_scan IS PORT(CLK_SCAN : IN STD_LOGIC。 掃描時鐘脈沖 KEY_DRV : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) 掃描序列 )。 END COMPONENT 。 消抖動模塊 COMPONENT key44_xiaod IS PORT(XD_CLK : IN STD_LOGIC。 消抖動時鐘脈沖 KEY_IN : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 鍵盤輸入 KEY_OUT :OUT STD_LOGIC_VECTOR(3 DOWNTO 0) 鍵盤輸出)。 END COMPONENT 。 譯碼模塊 COMPONENT key_yima IS PORT(SC_CLK : IN STD_LOGIC。 掃描時鐘脈沖 KEY_DRV : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 掃描序列 KEY_IN : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 鍵盤輸入 OUT_NUMB : OUT INTEGER RANGE 0 TO 15 按鍵輸入譯碼后的值 )。 END COMPONENT。SIGNAL CLK_SC : STD_LOGIC。SIGNAL CLK_X : STD_LOGIC。SIGNAL KEY_VALUE : STD_LOGIC_VECTOR(3 DOWNTO 0)。BEGIN clkgen1 :clk_gen PORT MAP(CLK=CLK , CLK_SCAN=CLK_SC , CLK_XD=CLK_X )。 key_scan1 : key_scan PORT MAP(CLK_SCAN=CLK_SC , KEY_DRV=KEY_DRV)。 xiaodou1 : key44_xiaod PORT MAP(XD_CLK=CLK_X, KEY_IN=KEY_IN , KEY_OUT=KEY_VALUE)。 key_yima1 : key_yima PORT MAP(SC_CLK=CLK_SC , KEY_DRV=KEY_DRV , KEY_IN=KEY_VALUE , OUT_NUMB=OUT_NUMB)。 END 。生成的電路符號如下圖所示: 鍵盤掃描電路符號圖算法的實(shí)現(xiàn)過程如下:CPU以一定時間間隔周期地執(zhí)行此鍵盤掃描處理程序。先是對鍵盤作掃描,獲得反映鍵盤狀態(tài)的鍵盤掃描碼;然后對掃描碼進(jìn)行前后對比和定時計(jì)數(shù),實(shí)現(xiàn)去抖;去抖后置位KReady標(biāo)志,通知鍵盤分析程序已檢測到有效按鍵。鍵盤掃描碼反映的是讀取鍵盤時刻的鍵盤動作狀態(tài)。對鍵盤掃描碼的基本要求是它要能對每一個單鍵作唯一編碼。我們知道,當(dāng)一個按鍵按下和釋放時,對應(yīng)信號線電平的變化有一個不穩(wěn)定期,即所謂“抖動”,這是因?yàn)槎鄶?shù)開關(guān)的閉合和斷開都有一個過程,并不是即刻實(shí)現(xiàn)的。在讀取鍵盤狀態(tài)是必須避開這個不穩(wěn)定期,以免造成誤判,這樣一個做法叫做“去抖”。如果當(dāng)在一段時間內(nèi)都連續(xù)多次讀到同一個非空(即有鍵按下)的掃描碼,我們可以認(rèn)為這時按鍵已處于穩(wěn)定狀態(tài),這時得到的掃描碼就代表了一個鍵盤動作,抖動的影響已經(jīng)被剔除。按照這個想法,我們只需設(shè)置一計(jì)數(shù)器,當(dāng)每次讀到的非空掃描碼與上一次的相同,就將計(jì)數(shù)器加1;而當(dāng)一旦讀到不同的掃描碼或空碼則立即將計(jì)數(shù)器清0。如果計(jì)數(shù)器的值達(dá)到某預(yù)定值N時,則表示連續(xù)N次讀到同一掃描碼,于是可認(rèn)為已經(jīng)讀到了有效的按鍵。設(shè)鍵盤掃描的間隔是T,則去抖的時間就是N * T。在實(shí)際中可以根據(jù)按鍵的特性選取適當(dāng)?shù)腘和T值,以達(dá)到可靠的去抖效果。通過一個譯碼程序,將鍵盤掃描后的值根據(jù)需要設(shè)定成相應(yīng)的功能鍵和菜單鍵。程序設(shè)計(jì)如下: ima:PROCESS(SC_CLK) BEGIN Z=KEY_DRV amp。 KEY_IN。 將掃描信號和消抖動后的按鍵輸入值存入Z IF SC_CLK39。EVENT AND SC_CLK=39。139。 THEN CASE Z IS 數(shù)字按鍵譯碼電路 WHEN 11100111= K_VALUE=0。 WHEN 11101011= K_VALUE=1。 WHEN 11101101= K_VALUE=2。 WHEN 11101110= K_VALUE=3。 WHEN 11010111= K_VALUE=4。 WHEN 11011011= K_VALUE=5。 WHEN 11011101= K_VALUE=6。 WHEN 11011110= K_VALUE=7。 WHEN 10110111= K_VALUE=8。 WHEN 10111011= K_VALUE=9。 WHEN 10111101= K_VALUE=10。 WHEN 10111110= K_VALUE=11。 WHEN 01110111= K_VALUE=12。 WHEN 01111011= K_VALUE=13。 WHEN 01111101= K_VALUE=14。 WHEN 01111110= K_VALUE