本次設計采用FPGA驅動4x4矩陣鍵盤,這個原理其實很簡單,但是我在做的時候曾經理解錯了一個地方,導致走了一天的彎路,因為感覺比較有意思,所以想在這分享一下。
014x4矩陣鍵盤驅動原理
首先看一下矩陣鍵盤的原理圖,矩陣鍵盤的原理與獨立按鍵類似,可以將單獨的一行或一列當做一個獨立按鍵使用。圖中的row_one ~ row_four表示矩陣鍵盤的四行,col_one~col_four表示矩陣鍵盤的四列。
矩陣鍵盤的掃描識別可以通過行列掃描來完成,首先我們先將4行的I/O口(row_one、row_two、row_three、row_four)全部輸出高電平,4列的I/O口(col_one、col_two、col_three、col_four)全部輸出低電平,若是這4行按鍵里有按鍵按下,那么按鍵按下的那一行對應的I/O口電平就會被拉低,這樣我們就能確定按下按鍵的行坐標。接下來便需要確定列坐標,獲取列坐標的方法與行坐標的方法類似,就是先讓4行的I/O口全部輸出低電平,4列的I/O口全部輸出高電平,這樣按鍵按下的那一列I/O口的電平就會被拉低,這樣我們便確定了對應的列坐標,如此便能獲取到對應按下按鍵的行列坐標。
02設計思路
這里需要討論的便是如何實現4×4矩陣鍵盤的程序,其邏輯流程圖如下圖所示。首先需要定義8個輸出端口,分別表示四行四列,然后先讓四行的I/O輸出高電平,四列的I/O輸出低電平,這是初始狀態。然后便是編寫消抖程序,當有按鍵按下時,首先便是進行消抖,利用狀態機編寫消抖程序,識別判斷當前狀態是否為抖動。確定為按鍵按下后便開始判斷4行中哪一行的電平被拉低,這樣便能確定是哪一行的按鍵被按下,這里需要定義一個表示行的標志位,用來標志是哪一行按鍵按下。隨后便將四行的I/O輸出低電平,四列的I/O輸出高電平,然后便開始逐列判斷哪一列的電平被拉低,如此便能判斷按下按鍵的列坐標。此處也需要定義一個表示列的標志位。最后便是綜合判斷,通過行的標志位和列的標志位來判斷按下按鍵的行列坐標,如此便確定具體按下的按鍵。
接下來看程序(此處分享的程序為沒有帶按鍵消抖的,只是按照矩陣鍵盤的掃描識別思路大致寫了一下),首先是端口的定義,定義四行四列,但是有一點,原理上講解的是輸出電平,在這里這四個端口先定義為輸入狀態,因為這不是頂層文件,在頂層文件中再定義為輸出。然后定義的key_lock為輸出控制端,我這里是利用矩陣鍵盤設置的密碼鎖,每一個矩陣按鍵對應一個鍵值,當按下四個按鍵對應密碼正確時,key_lock輸出高電平。key_row_flag為行標志位,當檢測到第一行的按鍵被按下時標志位置1,當第一行的按鍵被按下時標志位置2,同理,第三行置3第四行便置4。key_col_flag為列標志位,原理與行標志位一樣。然后row_flag與col_flag為行掃描標志位與列掃描標志位,當row_flag為1時進行行掃描,當col_flag為1時進行列掃描。key_output為輸出按下對應按鍵的鍵值。key_row_col為當前掃描狀態,為1時表示行掃描結束,為2時表示列掃描結束,標志列掃描結束后便開始獲取按鍵的鍵值。
接下來便開始看行掃描,行掃描和列掃描初始狀態為row_flag為1、col_flag為0。然后開始捕捉四行的引腳哪一行的引腳出現下降沿置0,若有一行的引腳被拉低置0時,行標志位立刻記下是第幾行被拉低,然后行列狀態標志位便置1,行掃描標志位row_flag清零,列掃描標志位置1,開始進入列掃描。
然后就是列掃描,在列掃描中與行掃描原理一樣,檢測每一列引腳的電平,若其中一列的電平被拉低,則列標志位立刻記錄被拉低的列數為第幾列,然后恢復行掃描標志位準備進入下一輪掃描,同時將列掃描標志位清零,行列狀態標志位置2,準備進入判斷按下按鍵鍵值模式。
接下來便是開始判斷按下按鍵的鍵值,因為我這里只需要0~9這十個數字,而矩陣鍵盤有16個按鍵,所以寫的稍微簡單一點。從第一行第一列開始為1,第一行第二列為2,后面的依次類推。將第四列和第四行的鍵值全部設置的為0。這里進入判斷鍵值的條件為行列標志位key_row_col置2,也就是必須在列掃描完成之后才能進入判斷。
這里在鍵值判斷完成之后便是將當前獲取的鍵值存儲起來。這里因為行列標志位key_row_col比按鍵輸出鍵值key_output差了一個時鐘周期,所以賦值錯誤,然后我便重新定義了一個寄存器key_row_col_r用來過渡一下。下面定義的one起初是為了在key_row_col為2時不重復賦值才寫的,是為了避免賦值后面輸出的按鍵鍵值,也就是20ns的周期中只進去賦值一次,但是后面發現了時序相差一個時鐘周期便在else中加入了那段,還未解決便定義了寄存器key_row_col_r,這才得以解決。
最后便是設置密碼,輸出控制部分。此處將密碼設置為2653。
接下來便是波形仿真部分,在這里寫入2653每一個鍵值對應按鍵的行列坐標便可。仿真腳本文件寫好之后便可導入仿真。
03仿真波形
在仿真波形圖中根據寫入的對應鍵值來觀察行、列標志位中的行列坐標是否正確,然后根據行列坐標來觀察按鍵輸出鍵值key_output是否一致,key_temp系列的值為存儲的四位密碼,當每一位與設置的密碼一致時,key_lock輸出高電平。
-
FPGA
+關注
關注
1630文章
21796瀏覽量
605987 -
原理圖
+關注
關注
1300文章
6358瀏覽量
235161 -
矩陣鍵盤
+關注
關注
7文章
207瀏覽量
31543 -
驅動設計
+關注
關注
1文章
111瀏覽量
15314
發布評論請先 登錄
相關推薦
評論