CC2540開發板學習筆記(三)——外部中斷


一、實驗內容

    通過外部中斷方式依次按下按鍵S1控制LED1的亮滅

二、實驗過程

1、電路原理圖同上

image

2、中斷的概念

    比如說我們在執行main函數時,突然來了個指令。優先級比現在執行的main還高,那我們便選擇跳過去執行優先級高的,完了之后再執行main函數,中斷就類似這樣一個概念,使用中斷可以減少CPU的無效浪費,降低能耗。

3、寄存器調度

(1)LED1的初始化。。同前兩節,就是SEL,DIR,INP三個,還有附初始狀態。

(2)外部中斷初始化(S1的外部中斷初始化)

image

按鍵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)
  {
  }
}

三、實驗結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM