stm32以中断方式扫描矩阵键盘
stm32矩陣鍵盤
- 矩陣鍵盤
- cubemx配置
- 編程思路
- 代碼編寫
矩陣鍵盤
普通的按鍵,都是一個IO口控制一個按鍵,但是當按鍵數量變多時,單片機可能沒有那么多的IO口來供給按鍵使用,這時候就需要用到矩陣鍵盤,比如45的矩陣鍵盤,用到了4+5共9根IO口線,可以控制45=20個按鍵。相應的,程序也要復雜些。
cubemx配置
X0到X3這4個IO口配置為低電平輸出,無上拉,無下拉,即推挽方式,速度為中
Y0到Y4這5個IO口配置為EXTI外部中斷模式,上拉,下降沿觸發。
編程思路
1 X0~3配置為輸出低電平
2 Y0~4配置為下降沿中斷,但是芯片內部配置了上拉,所以無按鍵觸發時不會進中斷。
3 當有按鍵按下,比如X2Y4按下時,X2路的低電平會進入到Y4路,觸發下降沿中斷。
4 在Y4中斷內,將Y4配置為低電平輸出,而X0~3配置為上拉輸入,記錄下Y值為4
5 逐一檢測X0~3的電平,哪一路為低,即對應的為X鍵值,本例X值為2
6 綜合x=2, y=4, 即可知道是哪一個按鍵按下了。
代碼編寫
定義一個結構體,有按鍵觸發時,active置1,x,y分別記錄行列值,num是最后的鍵值。
typedef struct KEYBOARD_TYPEDEF {u8 active;u8 x;u8 y;u8 num; }KEYBOARD_Typedef;KEYBOARD_Typedef keyboard;以Y4為例,列出一路中斷如下:
void EXTI15_10_IRQHandler(void) {/* USER CODE BEGIN EXTI15_10_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(KEY_Y4_Pin)){delay_us(10);if(KEY_Y4_READ() != 0){HAL_GPIO_EXTI_IRQHandler(KEY_Y4_Pin);return;}delay_us(10);if(KEY_Y4_READ() != 0){HAL_GPIO_EXTI_IRQHandler(KEY_Y4_Pin);return;}delay_us(10);if(KEY_Y4_READ() != 0){HAL_GPIO_EXTI_IRQHandler(KEY_Y4_Pin);return;}keyboard.active = 1;keyboard.y = 4;}keyboard_scan();/* USER CODE END EXTI15_10_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(KEY_Y4_Pin);/* USER CODE BEGIN EXTI15_10_IRQn 1 *//* USER CODE END EXTI15_10_IRQn 1 */ }增加了幾次延時,作為鍵盤消抖的判斷
確認不是誤觸發后,active置1,并相應的y值。
最后調用鍵盤掃描函數,來確認X的鍵值。
.
.
引腳功能模式切換
//切換GPIO引腳的方向 //port 端口號 //pin號 //dir 方向,0為輸入,1為輸出, 2為EXTI void pin_io_switch(GPIO_TypeDef *port, u32 pin, u8 mode) {switch(mode){ case GPIO_IN://輸入GPIO_InitStruct.Pin = pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(port, &GPIO_InitStruct);break;case GPIO_OUT://輸出GPIO_InitStruct.Pin = pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;HAL_GPIO_Init(port, &GPIO_InitStruct);break;case GPIO_EXTI:GPIO_InitStruct.Pin = pin;GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(port, &GPIO_InitStruct);break;} }.
.
本函數用來確認X軸的鍵值。
最后在主程序中檢查keyboard.active,若不為0,則表示有按鍵按下,此時需要做相應處理,并且將keyboard中的各成員清零。
總結
以上是生活随笔為你收集整理的stm32以中断方式扫描矩阵键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机cnc编程入门,数控车床编程入门自
- 下一篇: 元素不包括_干货 | FDA法规对元素杂