5.2 SW1控制LED1亮滅(中斷功能)


中斷:CPU收到中斷請求后暫停正在執行的程序,而去執行中斷服務函數中的程序,處理結束后,繼續執行原來的程序。

能夠產生中斷請求的中斷源如下:

CC2530中斷設置步驟:使能端口組中斷(IEN)——端口組中具體端口中斷使能/禁止(PxIEN)——設置中斷觸發方式PICTL——使能系統總中斷(EA)

下文按此思路展開:

1、使能端口組中斷

IEN2|=0x10;    //10000,設置IEN2的第4位,使能P1端口組中斷

2、使能具體端口中斷

P1IEN|=0x04;    //0100,P1_2口中斷

3、設置中斷觸發方式

PICTL|=0x02;   //P_3到P1_1下降沿觸發中斷,SW1按下,電平由高變低

4、使能總中斷

EA=1;    

要想使用中斷功能,必須使能中斷總開關EA,並且使能各個中斷源的自身控制開關IEN。

具體寄存器詳情如下:

中斷服務函數格式:以P1為例。函數體不能帶有參數,也不能有返回值

#pragma vector=P1INT_VECTOR
__interrupt void P1_INT(void) //注意,interrupt前是兩個_
{
  /*處理程序*/
}

中斷向量名如下:可查看ioCC2530.h頭文件內容

中斷標志位:中斷源很多,需要識別觸發中斷的中斷源。

P0、P1、P2端口組的中斷標志位分別是P0IF、P1IF、P2IF。

P1_2連接着SW1按鍵,按鍵按下P1IF值變為1,CPU就去執行P1的中斷服務函數。標志位不能自動復位,需要手動清除該中斷標志位。

  P1IF=0;  //清除P1端口組中斷標志位

具體是P1中哪一個針腳引起的中斷,可以通過PxIFG寄存器的值來判斷。當然也需要手動清除具體的針腳標志位(在中斷服務函數中)。

  P1IFG&0x04     //判斷P1_2的中斷標志位是否為1

  P1IFG &=~ 0x04;   //清除P1_2的中斷標志位

 清除過程,先小再大。即先關局部再關總閘。

#include "ioCC2530.h"

#define  LED1   P1_0

/*==================端口初始化函數=====================*/
void Init_Port()
{
  //將P1_0設置為通用I/O端口功能
  P1SEL &= ~0x01;   
  //將P1_0的端口傳輸方式設置為輸出
  P1DIR |= 0x01;   
  LED1 = 0;
}
/*===============外部中斷初始化函數==================*/
void Init_INTP()
{
  IEN2 |= 0x10;         //端口1中斷使能
  P1IEN |= 0x04;        //端口P1_2外部中斷使能
  PICTL |= 0x02;        //端口P1_0到P1_3下降沿觸發 
  EA = 1;               //使能總中斷
}
/*================外部中斷1服務函數====================*/
#pragma vector = P1INT_VECTOR     //外部中斷1的向量入口
__interrupt void Int1_Sevice()
{
  LED1 = ~LED1;
/*先清除引腳標志位,再清除端口組標志位,否則會一直進入中斷*/
  P1IFG &= ~ 0x04;        //清除P1_2引腳的標志位
  P1IF = 0;               //清除P1端口組的標志位
}
/*====================主函數==========================*/
void main()
{
  Init_Port();          //初始化通用I/O端口
  Init_INTP();          //初始化外部中斷
}

 


免責聲明!

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



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