一、實驗內容
通過外部中斷方式依次按下按鍵S1控制LED1的亮滅
二、實驗過程
1、電路原理圖同上
2、中斷的概念
比如說我們在執行main函數時,突然來了個指令。優先級比現在執行的main還高,那我們便選擇跳過去執行優先級高的,完了之后再執行main函數,中斷就類似這樣一個概念,使用中斷可以減少CPU的無效浪費,降低能耗。
3、寄存器調度
(1)LED1的初始化。。同前兩節,就是SEL,DIR,INP三個,還有附初始狀態。
(2)外部中斷初始化(S1的外部中斷初始化)
按鍵S1外部中斷初始化方法:
P0IEN = 0X01; | P00 設置為中斷方式 |
PICTL = 0X01; | 下降沿觸發 |
IEN1 = 0X20; | 允許P0口中斷;(S1中斷) |
P0IFG = 0x00; | 初始化中斷標志位 |
開中斷時,還要開啟中斷總閘
EA = 1; //開總中斷
4、代碼實現(AIR環境下)
#include<ioCC2540.h> #define LED1 P1_0 //定義LED1,方便查閱代碼 #define KEY1 P0_0 //定義按鍵S1 //函數聲明 void Delayms(unsigned int t); //延時函數,當我們按下S1的時候,開發板會檢測到無數個觸發沿,對此,在不用中斷 //的條件下,只能使用延時,過濾掉多余的不必要的觸發沿。 void Init();//初始化函數 void Delayms(unsigned int t) //控制t被的延時周長 { unsigned int i,j; for(i=t;i>0;i--) { for(j=1;j<500;j++); } } void Init()//初始化函數 { P1SEL = 0X00; //實現LED的初始化 P1DIR = 0X01; P1INP = 0X00; LED1 = 0; P0IEN = 0X01; //開P0的中斷 PICTL = 0X01; //下降沿觸發 IEN1 = 0X20; //允許P0中斷 P0IFG = 0X00; //清空標志位 EA=1; //開啟中斷總閘 } #pragma vector = P0INT_VECTOR //格式:#pragma vector = 中斷向量. 緊接着是中斷處理程序 __interrupt void fu(void) { Delayms(10); //除抖動 LED1=~LED1; P0IFG=0; //清除中斷標志 } void main(void) { Init(); while(1) { } }
三、實驗結果