STM32 矩陣鍵盤的設計實現

2021-10-11 05:07:14 字數 2850 閱讀 1136

專案開發或者日常實驗中有時候需要用到多個按鍵,但微控制器io口資源本身並不多,如果為每乙個按鍵都分配乙個io的話未免太過浪費,所以使用矩陣鍵盤可以盡可能的節省微控制器io口資源。

1.系統:windows

2.軟體:keil5

3.微控制器:stm32f103c8t6

矩陣鍵盤與普通的乙個io對應乙個按鍵的普通鍵盤不同。如圖所示,16個按鍵通過圖中的電路連線,構成了行和列,而只僅僅引出了8條線路,所以只需要8個io口就能識別16個按鍵。與之類似的還有4x2矩陣鍵盤、3x3矩陣鍵盤等。

掃瞄矩陣鍵盤的鍵值可以使用逐行(列)掃瞄法。在stm32中,4個行io設定為上拉輸入,4個列io設定為推挽輸出低電平。當其中乙個按鍵按下時,該按鍵對應的行io口會被置為低電平,這時,將4個列io逐個拉高,每拉高乙個的同時檢測行io的電平,如果行io的電平隨著變化的話,就能確定哪個按鍵按下。當然,設定列io為輸入,或者下拉也是可以的,原理同上。

實驗裡使用2x4的矩陣鍵盤檢測(原理一樣,只是少了兩行掃瞄而已)。

/*****gpio口配置*****/

static

void

mx_gpio_init

(void);

/* gpio ports clock enable */

__hal_rcc_gpiob_clk_enable()

;/*configure gpio pins : rowline1_pin rowline2_pin */

gpio_initstruct.pin = rowline1_pin|rowline2_pin;

//行io下拉輸入

gpio_initstruct.mode = gpio_mode_input;

gpio_initstruct.pull = gpio_pulldown;

hal_gpio_init

(gpiob,

&gpio_initstruct)

;/*configure gpio pins : column1_pin column2_pin column3_pin column4_pin */

gpio_initstruct.pin = column1_pin|column2_pin|column3_pin|column4_pin;

//列io推挽輸出,無上下拉

gpio_initstruct.mode = gpio_mode_output_pp;

gpio_initstruct.pull = gpio_nopull;

gpio_initstruct.speed = gpio_speed_freq_low;

hal_gpio_init

(gpiob,

&gpio_initstruct)

;/*configure gpio pin output level */

hal_gpio_writepin

(gpiob, column1_pin|column2_pin|column3_pin|column4_pin, gpio_pin_set)

;}

/*********列io操作巨集定義*********/

#define column1_out_low hal_gpio_writepin(column1_gpio_port, column1_pin, gpio_pin_reset)

#define column2_out_low hal_gpio_writepin(column2_gpio_port, column2_pin, gpio_pin_reset)

#define column3_out_low hal_gpio_writepin(column3_gpio_port, column3_pin, gpio_pin_reset)

#define column4_out_low hal_gpio_writepin(column4_gpio_port, column4_pin, gpio_pin_reset)

#define column1_out_high hal_gpio_writepin(column1_gpio_port, column1_pin, gpio_pin_set)

#define column2_out_high hal_gpio_writepin(column2_gpio_port, column2_pin, gpio_pin_set)

#define column3_out_high hal_gpio_writepin(column3_gpio_port, column3_pin, gpio_pin_set)

#define column4_out_high hal_gpio_writepin(column4_gpio_port, column4_pin, gpio_pin_set)

/*********行io操作巨集定義*********/

#define rowline1_input_read hal_gpio_readpin(rowline1_gpio_port, rowline1_pin)

#define rowline2_input_read hal_gpio_readpin(rowline2_gpio_port, rowline2_pin)

uint8_t key_scan

(void)}

}else

if(rowline2_input_read == gpio_pin_set)}}

return keynum;

}

上述**可以檢測到哪個按鍵按下,但在實際專案開發途中,按下以及鬆開都需要進行一系列的消抖操作來判斷到底是真的按下跟真的鬆開。關於這個問題,下文stm32–按鍵抖動問題的**會詳細的描述。

STM32使用中斷驅動矩陣鍵盤

巨集定義 b6,b7,c8,c9做行掃瞄,c10 c12做列掃瞄 define row1 gpio port gpiob 行1 define gpio clk rcc apb2periph gpiob rcc apb2periph gpioc gpio埠時鐘 define row1 gpio pin...

STM32(暫存器) 矩陣鍵盤

1 硬體 準備乙個2 2矩陣鍵盤,分別接pb8,9,10,11 2 矩陣鍵盤原理 讓pa8,9輸出高電平,pa10,11輸入 當pa10,11中檢測到高電平時,得到i值。然後翻轉,讓pa8,9輸入,pa10,11輸出高電平 當pa8,9中檢測到高電平時,得到j值 然後通過i,j確定是那個按鍵 3 k...

STM32 矩陣鍵盤控制數碼管

在以往的32部落格中,見過了數碼管和矩陣鍵盤,今天就將他們結合起來,如何用矩陣鍵盤去控制數碼管。我們都知道數碼管可以顯示從0 9十位數字,也可以顯示從a f的字母,將數碼管和2 2矩陣鍵盤結合起來也就是使用四個按鍵分別控制加,減,置0和全部點亮。加減的功能不用多說也就是從0加到f,如果繼續增加的話又...