外部中斷與按鍵消抖 1,用cubemx創建工程 設置中斷通道
1602405782(1).jpg (76.26 KB, 下載次數: 61)
下載附件
2020-10-11 16:44 上傳
2、設置觸發方式
1602405797(1).jpg (11.91 KB, 下載次數: 64)
下載附件
2020-10-11 16:43 上傳
3、開啟中斷
1602405814(1).jpg (3.79 KB, 下載次數: 77)
下載附件
2020-10-11 16:43 上傳
4、編寫中斷函數
在stm32l0xx_it.c文件中編寫 uint32_t EXIT_NUM = 0; uint32_t EXIT_CI(void) { returnEXIT_NUM; } void EXIT_INIT(void) { EXIT_NUM= 0; } void HAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin) { if(GPIO_Pin== EXIT_Pin) EXIT_NUM += 1; }
5、按鍵檢測函數 typedef enum { posedge, //按鍵剛按下 negedge, //按鍵剛松開 pressing, //按鍵按下 release //按鍵松開 }KeystateDef; //按鍵狀態 uint8_t key_num = 0; uint8_t key_ci = 0;
KeystateDef key_Rea(void) { if(EXIT_CI()!= 0) { if(EXIT_CI()!= key_num && EXIT_CI() != 0) { key_num= EXIT_CI(); key_ci= 0; } else { key_ci= key_ci == 10 ? 10 : key_ci + 1; if(key_ci== 9) { if(!HAL_GPIO_ReadPin(EXIT_GPIO_Port,EXIT_Pin))return posedge ; else{ EXIT_INIT(); returnnegedge; } } elseif(key_ci == 10) return pressing; } } returnrelease; } 6、讀取按鍵狀態 KeystateDefkey = key_Rea(); 7、調用 main() { while(1) { KeystateDef key = key_Rea();
switch(key) { case posedge: sprintf(tab,"剛按下"); break; case negedge: sprintf(tab,"剛松開"); break; } } }
|