四行四列共八個io口,矩陣鍵盤掃瞄難點在於確定是哪個按鍵按下,微控制器不像人類長有眼睛,一看就知道按鍵在哪一行那一列。那如何確定行列值呢?沒錯利用鍵盤行列線連線的io口。仔細觀察矩陣鍵盤原理圖,每個按鍵剛好在行線列線交點,也就是說按鍵按下時行線列線連線的io口導通。利用求同存異原則,只需將行線置高列線置地,當有按鍵按下時行線被拉低,此時求同存異的異出現,再用gpio_readinputdata( )函式讀出引腳狀態,即可得知按鍵所在行;列線亦是如此,只需將列線置高,行線置地,模擬行線。下面祭出**:
void
key_init1
(void
)void
key_init2
(void
)
這是得出按鍵所在行列的初始化**。別看就幾句io口配置**,這可是鍵盤掃瞄成功的關鍵,坑來了,坑來了,坑來了注意看,上面講到只需要將行線置高列線置低就行,那為什麼不用 gpio_mode_ipd下拉輸入gpio_mode_ipu上拉輸入來做呢?emmm,是的作者做了小白鼠,弄了上下拉來控制高低電平,發現怎麼按按鍵都沒反應,檢查了半天程式開始查電路,驚人的發現當按鍵按下時該被拉低到0的電平只從3.2v降到了1.6v,而該公升到高電平的引腳也只公升到了1.6v。我裂開了,那還玩個錘子,這樣gpio_readinputdata( )函式根本不能讀到正確狀態。又翻數篇部落格,查數篇資料,頭髮掉了數根,發現將io口配置成上下拉後,內部有電阻限位根本不可能降到0或者公升到3.2v,而且後來察覺到這樣配置相當於將兩引腳短路對微控制器相當不友好。找到原因後就簡單了,那就改io配置嘛。
通過gpio_readinputdata( )讀出的數值是整16個io 口的,而我們只要其中四位,若要低四位則將數值與上0x000f,若要4位到8位則與上0x00f0。在將兩個值相或即可確定按鍵所在行列。祭出**:
uint16_t key_scan (
void
)key_init2()
; value1=
gpio_readinputdata
(gpiof)
; value1=value1 &
0x000f;if
(value1!=
0x000f
) key_value=value | value1 ;}}
return key_value;
}
得出行列值後確定鍵值就簡單多了,只需要將得出的行列值與可能存在的行列值比對然後賦你想要的值即可。筆者用的是switch語句,具體如下:
int
main
(void
)oled_clear()
;oled_shownum(80
,0,56
,2,16
);oled_shownum(50
,4,sb,2,
16);delay_ms
(500);
}}
實物圖如下:
STM32 4x4矩陣鍵盤初始化及實現多位輸入
目的 實現矩陣鍵盤的多位資料輸入 這裡以兩位資料為例 引腳初始化pc0 pc7 void key config 按鍵掃瞄函式 int keyscan void gpio write gpioc,gpioc odr 0xfff0 0x0001 switch gpioc idr 0x00f0 while...
4X4矩陣鍵盤掃瞄程式
4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵 電路圖如下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每乙個引腳是否用...
4X4矩陣鍵盤掃瞄程式
4x4矩陣鍵盤掃瞄 1.4根行線的gio均設為output,根列線的gio均設為input 2.4根行線的gio分別置為0111 1011 1101 1110,讀逐一讀取列線gio的值,可確定是哪乙個按鍵。電路圖例如以下 注意 1.圖中用作輸入的gio,一定要有乙個上拉電阻。2.晶元中的每個引腳是否...