1.中斷函數(shù)概念
上一講里,當賦值IT0為1時,P3.2遇到下降沿,IE0被置1,要想使IE0自動清零,我們引用中斷函數(shù)就可以了。
我們可能已經習慣了都是在main函數(shù)里閱讀分析代碼,其實還有另一種函數(shù)需要我們認識的,那就是中斷函數(shù)。所謂中斷函數(shù)就是當它滿足一定的條件時就會暫停主函數(shù)的執(zhí)行內容,轉而去執(zhí)行中斷函數(shù)。關于這個概念網(wǎng)上很多說法都已經講解的很詳細了,這里點一下即可。
因為我們擅長的是從實踐中領悟真理,所以后面我們盡量用例程去理解中斷函數(shù)。
2.中斷函數(shù)的書寫
中斷函數(shù)與其他我們封裝過的子函數(shù)的寫法不同,有個區(qū)分標志“interrupt”。
至于后面為什么會有個數(shù)字0我們以后再講。
當然函數(shù)名我們可以隨意取,只要不跟以前封裝定義好的函數(shù)名沖突就行。這里我們取“EXTI0_IRQHandler”作為函數(shù)名是模仿STM32單片機的寫法。
3.EX0和EA
我們說過要想進入中斷函數(shù),必須滿足它的一些前提條件。這里的EX0(IE^0)和EA(IE^7)要初始化賦值給1才能進入的了中斷函數(shù)去執(zhí)行任務。
EA叫做總中斷開關,EX0是針對P3.2的外部中斷的開關。
也就是要想進入中斷函數(shù)必須滿足兩個開關都要閉合(都為1)。
4.實戰(zhàn)
同樣像上一講那樣拔插杜邦線觀察現(xiàn)象,可以看到程序中IE0的身影不再出現(xiàn)但實現(xiàn)功能也都是一樣的
#include <reg52.h> #include <function.h>//詳見第六章第8講 void main() { IT0 = 1; //下降沿觸發(fā)模式 EX0 = 1; EA = 1; LED_Init(); //初始化LED硬件模塊 while(1); //主函數(shù)什么事都不做,空循環(huán)這條語句 } void EXTI0_IRQHandler() interrupt 0 { LED2=!LED2; }
所以看起來主函數(shù)什么內容也沒有,但是在拔插杜邦線的過程中觸發(fā)了中斷函數(shù),所以LED2被執(zhí)行跳變,這就是中斷函數(shù)的作用。
即使主函數(shù)一直執(zhí)行“while(1);”,中斷函數(shù)還是能執(zhí)行的了的。
大家把“EX0=1;”改為“EX0=0;”,或者把“EA=1;”改為“EA=0;”再編譯下載進去拔插杜邦線發(fā)現(xiàn)LED2沒有反應,因為這樣做已經不滿足觸發(fā)中斷函數(shù)響應了。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程