1.另一個外部中斷
前面兩講都是圍繞外部中斷0(P3.2的功能)來講解,這里我們也還有一個外部中斷1(P3.3的功能)。P3.3要想實現(xiàn)上一講的功能只需杜邦線接下面的IO端口即可
代碼就是把“EX0”改為“EX1”,“IT0”改為“IT1”。
interrupt后面的0要改為2,函數(shù)名我們改為“EXTI1_IRQHandler()”
#include <reg52.h> #include <function.h>//詳見第六章第8講 void main() { IT1 = 1; //下降沿觸發(fā)模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模塊 while(1); } void EXTI1_IRQHandler() interrupt 2 { LED2=!LED2; }
再次提醒,杜邦線的一頭接的是P3.3。
至于interrupt后面的數(shù)字為什么要為2,大家先熟悉這張圖了解一下先
更多中斷知識的概念參考《手把手教你學51單片機》文檔6.5節(jié)。
2.按鍵觸發(fā)中斷
我們每次要把P3.2和P3.3外部拉低或釋放,都需要拔插杜邦線,這樣太麻煩,我們可以用按鍵來取代這些拔插動作,按鍵按下不放就相當于一直拉低,跟杜邦線一直插著GND一個效果,松開按鍵就跟杜邦線沒插GND一樣。
可是P3.2和P3.3沒有直接相連的按鍵,不過沒關系,我們把杜邦線這樣接,讓P3.3和P2.3一起相連,K4的按鍵動作可以使P2.3和P3.3同步電平
我們要用到按鍵,所以別忘了初始化按鍵模塊。
#include <reg52.h> #include <function.h>//詳見第六章第8講 void main() { IT1 = 1; //下降沿觸發(fā)模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模塊 KEY_Init();//初始化按鍵功能模塊 while(1); } void EXTI1_IRQHandler() interrupt 2 { LED2=!LED2; }
3.去抖動
按鍵似乎沒能很靈敏的按一下松手LED2就跳變一次亮或滅的效果,那是因為我們沒有延時消抖,一個按鍵動作就存在好幾個下降沿了,導致中斷函數(shù)被執(zhí)行了幾遍。
在中斷函數(shù)中加延時就可以消除這種失靈現(xiàn)象了,不過在以后編程里不能在中斷函數(shù)里使用延時,這樣會使程序的執(zhí)行效率大打折扣,我們本次只是作為測試代碼才在中斷函數(shù)里用延時。
#include <reg52.h> #include <function.h>//詳見第六章第8講 void main() { IT1 = 1; //下降沿觸發(fā)模式 EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模塊 KEY_Init();//初始化按鍵功能模塊 while(1); } //請把P3.3和P2.3用杜邦線連接起來 void EXTI1_IRQHandler() interrupt 2 { delay_ms(50);//去抖動 if(INT1==0) //P3.3是否還處于低電平的穩(wěn)定接觸狀態(tài),INT1已在“#include <reg52.h>”中定義好了 { LED2=!LED2; } }
這樣就可以達到按下松手一次,LED2的狀態(tài)只能取反一次的靈敏效果。如果我們一直按著不放,LED2也只是跳變一次而已,有點像不支持連按功能,這是因為“IT1=1;”的原因。
要是改為“IT1=0;”,這樣K4按鍵就有種支持連按的感覺從而LED2就會不停閃爍了。按鍵按下一直不放就會不停地進入中斷函數(shù)。
#include <reg52.h> #include <function.h>//詳見第六章第8講 void main() { IT1 = 0; //低電平狀態(tài)下觸發(fā) EX1 = 1; EA = 1; LED_Init();//初始化LED硬件模塊 KEY_Init();//初始化按鍵功能模塊 while(1); } //請把P3.3和P2.3用杜邦線連接起來 void EXTI1_IRQHandler() interrupt 2 { delay_ms(50);//去抖動 if(INT1==0) //P3.3是否還處于低電平的穩(wěn)定接觸狀態(tài) { LED2=!LED2; } }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程