【【電鹵藥丸】5×5矩陣鍵盤(pán)掃描,一條龍化繁為簡(jiǎn),值得擁有】https://toutiao.com/group/6636525037820051975/?iid=15906422033&app=explore_article×tamp=1548690813&group_id=6636525037820051975&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share
設計中在遇到按鍵較多,但是單片機I/O資源有限時(shí),采用矩陣鍵盤(pán)是一種很好的選擇方案。在按鍵較少時(shí),矩陣鍵盤(pán)沒(méi)有明顯的優(yōu)勢,比如3×3矩陣鍵盤(pán)占用I/O口6個(gè),只支持9個(gè)按鍵;但是,按鍵較多時(shí),矩陣鍵盤(pán)的優(yōu)勢就凸顯出來(lái)了,比如5×5矩陣鍵盤(pán)占用I/O口10個(gè),可支持25個(gè)按鍵;
?矩陣鍵盤(pán)的硬件設計非常簡(jiǎn)單,如圖1以5×5矩陣鍵盤(pán)為例,藍色行線(xiàn)5條,綠色列線(xiàn)5條(加上拉電阻),用按鍵代替行列交叉的節點(diǎn)即組成了矩陣鍵盤(pán),其中二極管處的紅色連線(xiàn)可用來(lái)檢測按鍵是否按下或作為中斷信號的(可以不需要,使用時(shí)沒(méi)有任何影響,本文不涉及)。
圖1:矩陣鍵盤(pán)
?如圖2為單片機STM32F103CBT6的外圍電路,帶顏色的I/O口為矩陣鍵盤(pán)行線(xiàn)PA1~PA5(藍色),列線(xiàn)PA6~PA10(綠色)。為方便編程,矩陣鍵盤(pán)最好選擇同組的I/O端口。
圖2:?jiǎn)纹瑱C外圍電路
硬件的設計就是以上部分,接下來(lái)講解程序部分,
矩陣鍵盤(pán)的掃描方法有多種,其中很青睞的是行列反轉掃描,不僅簡(jiǎn)單而且效率高,而且只需要掌握該方法就足夠了。
?行列反轉掃描的邏輯:
①行線(xiàn)輸出全為0(行線(xiàn)PA1~PA5配置成推挽輸出,列線(xiàn)PA6~PA10配置成上拉輸入)
②讀入列線(xiàn)值
③輸出列線(xiàn)值(行線(xiàn)PA1~PA5配置成上拉輸入,列線(xiàn)PA6~PA10配置成推挽輸出)
④讀入行線(xiàn)值
⑤組合行線(xiàn)列線(xiàn)值
對于STM32的單片機,直接操作寄存器會(huì )更簡(jiǎn)單,且無(wú)需再對I/O進(jìn)行另外的配置,全部代碼如圖3所示,完全可以當做一個(gè)模塊來(lái)使用。
圖3:矩陣鍵盤(pán)的行列反轉掃描
以下代碼與圖3里面的代碼完全一致(為方便瀏覽和拷貝)
?以下代碼為端口配置寄存器的操作,PA組I/O有16個(gè)引腳:PA0~PA15;3代表推挽輸出,4代表浮空輸入,8代表上拉輸入;
GPIOA->CRL = 0x88333334; //低8位配置GPIOA->CRH = 0x44444888; //高8位配置
?以下代碼中,GPIOA->ODR為端口輸出數據寄存器,用于寫(xiě)操作;GPIOA->IDR為端口輸入數據寄存器,用于讀操作;
0xFFC1的二進(jìn)制:1111 1111 1100 0001,表示要對PA1~PA5置0。
0x07C0的二進(jìn)制:0000 0111 1100 0000,表示要對PA6~PA10讀值。
行列反轉后的原理與上面完全一樣,這里就不一一闡述了。
?最后講一下組合行線(xiàn)列線(xiàn)值,假如S1按鍵按下去了,得到的二進(jìn)制為(注意黑體字)
cord_h:0000 0000 0011 1100
cord_l: 0000 0111 1000 0000
cord_h >>= 1 表示右移1位得到:
cord_l >> = 1 表示右移1位得到:
0000 0011 1100 0000
組合碼(鍵值):key_value=0000 0011 1101 1110,即0x03DE;最后函數返回key_value值,該值就作為判斷S1的鍵值。
?之所以右移1位,是因為PA0沒(méi)有用于矩陣鍵盤(pán),所得到的鍵值也就被左移了1位,事實(shí)上,也可以不用右移,只是得到的組合碼不同而已,右移是為了方便計算。
矩陣鍵盤(pán)的鍵值定義如下:
#define S1 0x03DE#define S2 0x03BE#define S3 0x037E#define S4 0x02FE#define S5 0x01FE#define S6 0x03DD#define S7 0x03BD#define S8 0x037D#define S9 0x02FD#define S10 0x01FD#define S11 0x03DB#define S12 0x03BB#define S13 0x037B#define S14 0x02FB#define S15 0x01FB#define S16 0x03D7#define S17 0x03B7#define S18 0x0377#define S19 0x02F7#define S20 0x01F7#define S21 0x03CF#define S22 0x03AF#define S23 0x036F#define S24 0x02EF#define S25 0x01EF
?要點(diǎn):
①行列反轉掃描的思想是行線(xiàn)作為輸出時(shí),讀出列線(xiàn)的值;然后反過(guò)來(lái),列線(xiàn)作為輸出時(shí),讀出行線(xiàn)的值,最后把兩個(gè)值組合起來(lái)就是該按鍵的鍵值;
聯(lián)系客服