總體思路:中斷線為4行連線的gpio口,先初始化矩陣的4行輸出低電平4列輸出高電平,當有按鍵按下時的上公升沿觸發中斷;然後在相應的中斷處理函式裡面採取查詢的方式(參考上篇)獲得鍵值。
部分程式
void
exti9_5_irqhandler
(void
)//外部中斷中斷函式
if(gpio_readinputdatabit ( line2_gpio_port, line2_gpio_pin ))if
(gpio_readinputdatabit ( line3_gpio_port, line3_gpio_pin ))if
(gpio_readinputdatabit ( line4_gpio_port, line4_gpio_pin )
)exti_clearitpendingbit
(exti_line7)
;//清除標誌位 }if
(exti_getitstatus
(exti_line6)
!= reset)
//檢測中斷標誌位
if(gpio_readinputdatabit ( line2_gpio_port, line2_gpio_pin ))if
(gpio_readinputdatabit ( line3_gpio_port, line3_gpio_pin ))if
(gpio_readinputdatabit ( line4_gpio_port, line4_gpio_pin )
)exti_clearitpendingbit
(exti_line6)
;//清除標誌位}if
(exti_getitstatus
(exti_line5)
!= reset)
//檢測中斷標誌位
if(gpio_readinputdatabit ( line2_gpio_port, line2_gpio_pin ))if
(gpio_readinputdatabit ( line3_gpio_port, line3_gpio_pin ))if
(gpio_readinputdatabit ( line4_gpio_port, line4_gpio_pin )
)exti_clearitpendingbit
(exti_line5)
;//清除標誌位
}//重置gpio,等待下次中斷
//行置高
gpio_resetbits ( row1_gpio_port, row1_gpio_pin )
; gpio_resetbits ( row2_gpio_port, row2_gpio_pin )
; gpio_resetbits ( row3_gpio_port, row3_gpio_pin )
; gpio_resetbits ( row4_gpio_port, row4_gpio_pin )
;//列置高
gpio_setbits ( line1_gpio_port, line1_gpio_pin )
; gpio_setbits ( line2_gpio_port, line2_gpio_pin )
; gpio_setbits ( line3_gpio_port, line3_gpio_pin )
; gpio_setbits ( line4_gpio_port, line4_gpio_pin );}
void
exti4_irqhandler
(void)if
(gpio_readinputdatabit ( line2_gpio_port, line2_gpio_pin ))if
(gpio_readinputdatabit ( line3_gpio_port, line3_gpio_pin ))if
(gpio_readinputdatabit ( line4_gpio_port, line4_gpio_pin )
)exti_clearitpendingbit
(exti_line4)
;//清除標誌位
}//重置gpio,等待下次中斷
//行置高
gpio_resetbits ( row1_gpio_port, row1_gpio_pin )
; gpio_resetbits ( row2_gpio_port, row2_gpio_pin )
; gpio_resetbits ( row3_gpio_port, row3_gpio_pin )
; gpio_resetbits ( row4_gpio_port, row4_gpio_pin )
;//列置高
gpio_setbits ( line1_gpio_port, line1_gpio_pin )
; gpio_setbits ( line2_gpio_port, line2_gpio_pin )
; gpio_setbits ( line3_gpio_port, line3_gpio_pin )
; gpio_setbits ( line4_gpio_port, line4_gpio_pin )
;}
注意事項:
①在選擇開發板的io口時一定要看看原理圖或者資料手冊,確定這8個io口是可用的
②使用外部中斷時要開啟復用io時鐘afio
③中斷程式裡面一定要有按鍵鬆開的檢測,不然會一直進入中斷服務函式。
STM32鍵盤掃瞄程式
stm32鍵盤掃瞄程式 帶中斷觸發輸入 可注釋忽略 include key.h include delay.h 按鍵初始化函式 void key init void while gpiob idr 0x0f00 0x0000 等待鬆開 gpio setbits gpiob,gpio pin 12 g...
矩陣鍵盤掃瞄
矩陣鍵盤掃瞄一般採取行列掃瞄法。比如先拉低所有列線,拉高行線,之後讀取行線狀態,如果行線有一行為低,則假設有按鍵按下,此時再延時20毫秒左右後判 斷行線的某一行是否仍然為低,若為低則確認有鍵按下。這時可以進行按鍵鍵值判斷,即判別在哪一行哪一列有按鍵按下。判斷的方法是通過拉高列線,依次置行線 的某一行...
矩陣鍵盤掃瞄
矩陣鍵盤掃瞄 module matrix keyboard input clk 50m,50m時鐘 input rst n,復位 input 3 0 row,矩陣鍵盤行輸入 output reg 3 0 col,矩陣鍵盤列輸出 output reg key flag,按鍵按下標誌 output re...