基于VHDL的矩陣鍵盤及顯示電路設(shè)計(jì)
如圖1所示,全部代碼由7個(gè)進(jìn)程(process)組成。其中,進(jìn)程P1和P2用于對(duì)列掃描輸入信號(hào)kbrow進(jìn)行讀取,并通過或非運(yùn)算產(chǎn)生行掃描使能控制信號(hào)en對(duì)行掃描輸出信號(hào)kbcol進(jìn)行控制,并生成一個(gè)與kbcol對(duì)應(yīng)的狀態(tài)信號(hào)state。若沒有按鍵被按下(即kbrow=0000),則en= '1',行掃描輸出信號(hào)kbcol不斷循環(huán)掃描各行;若有按鍵被按下,en=‘O’,則行掃描停止,并鎖存當(dāng)前kbcol的值。進(jìn)程P1和P2的代碼如下:
進(jìn)程P3使用“case…when”語句,根據(jù)狀態(tài)信號(hào)state的值(即kbcol的值)和列掃描輸入信號(hào)kbrow的值進(jìn)行按鍵值譯碼,生成一個(gè)4位二進(jìn)制按鍵數(shù)值信號(hào)dat,用以記錄當(dāng)前按鍵值。例如,當(dāng)kbcol=“0010”,kbrow=“0001”時(shí),“B”鍵按下,dat=“1011”。進(jìn)程P3的代碼在此不再贅述。
進(jìn)程P4和P5用于按鍵的防抖和按鍵值的移位寄存。通過將行掃描使能控制信號(hào)en不斷賦給一個(gè)8位二進(jìn)制變量reg8,再將reg8賦給8位二進(jìn)制信號(hào)key,實(shí)現(xiàn)對(duì)按鍵狀態(tài)的記錄,然后通過對(duì)key的各位數(shù)值進(jìn)行與運(yùn)算,生成防抖控制信號(hào)fnq。一旦有按鍵按下,en=‘O’,則即便是按鍵在抖動(dòng),key中至少也有1位數(shù)值為‘0’,從而使fnq=‘O’。只有當(dāng)按鍵再次彈起,并且在連續(xù)8個(gè)時(shí)鐘周期內(nèi)不再有新的按鍵按下,key的數(shù)值全為‘1’,則fnq=‘1’,fnq產(chǎn)生一個(gè)上升沿,從而觸發(fā)按鍵數(shù)值信號(hào)dat進(jìn)入數(shù)值寄存信號(hào)temp(32位二進(jìn)制數(shù))的第0~3位,并將temp原來的第0~27位左移到第4~31位,實(shí)現(xiàn)1次按鍵按下的數(shù)值存儲(chǔ)。進(jìn)程P4和P5的代碼如下:
進(jìn)程P6用于將數(shù)值寄存信號(hào)temp的32位二進(jìn)制數(shù)分配給8個(gè)數(shù)碼管,從而生成數(shù)碼管地址掃描輸出scan,以及數(shù)碼管數(shù)值信號(hào)data(4位2進(jìn)制數(shù))。進(jìn)程P6代碼如下:
評(píng)論