cc2530的第三次實驗,按鍵中斷控制流水燈


cc2530的第三次實驗:按鍵中斷控制流水燈

效果為按一次按鍵,流水燈亮一次

實驗相關電路圖:
alt 實驗三電路圖

實驗相關寄存器:
alt 實驗三寄存器

初始化函數

//初始化LED燈
    //設置P1SEL,通用為0,外設為1 11111100
    P1SEL &=~0x03;

    //設置P0SEL,    11101111
    P0SEL &= ~0x10;

    //設置P1DIR,輸出為1,輸入為0  00000011
    P1DIR |= 0x03;

    //設置P0DIR     00010000
    P0DIR |= 0x10;     


//初始化按鈕和中斷
//初始化按鈕
    //初始化P0SEL,通用為0     11111101
    P0SEL&=~0x02;
    //初始化P0DIR,輸入為0     11111101
    P0DIR&=~0x02;

//初始化中斷
    //設置引腳中斷 1為中斷使能 00000010
    P0IEN |= 0x02;
    //設置端口中斷
    IEN1=1;
    //設置端口中斷觸發方式 1為中斷使能
    IEN1|=0x20;
    //設置總中斷
    EA=1;
    //清空標志位
    P0IFG=0;

中斷服務函數


//中斷服務函數
#pragma vector = P0INT_VECTOR        //這一行的P0INT_VECTOR是中斷源的名稱嗎?
__interrupt void P0ISR(void)
{
  //清除端口中斷標志位
  P0IFG=0;
  
  //LED燈流水亮一遍
  BLink();

  //清除端口中斷標志位
  P0IF=0;


}


上面的代碼一定要注意P0IFG一定要在P0IF之前清除,話說P0IF與P0IFG到底是干啥用的?他們之間什么關系,端口的標志寄存器?(記得查一下)
P0IFG是端口0中斷狀態標志,P0IF是cpu內中斷標志寄存器,什么鬼,沒弄明白啊,問一下老師吧!

全部代碼


#include <ioCC2530.h>

typedef unsigned int uint;
typedef unsigned char uchar;
#define LED1 P1_0
#define LED2 P1_1 
#define LED3 P0_4
#define BUTTON1 P0_1 

uint time=300;

//延遲函數
void Delay(uint time)
{
  for(uint i=0;i<time;i++)
      for(uint j=0;j<1070;j++);
}



//初始化函數
void Init(void)
{
//初始化LED燈
    //設置P1SEL,通用為0,外設為1 11111100
    P1SEL &=~0x03;

    //設置P0SEL,    11101111
    P0SEL &= ~0x10;

    //設置P1DIR,輸出為1,輸入為0  00000011
    P1DIR |= 0x03;

    //設置P0DIR     00010000
    P0DIR |= 0x10;     


//初始化按鈕和中斷
//初始化按鈕
    //初始化P0SEL,通用為0     11111101
    P0SEL&=~0x02;
    //初始化P0DIR,輸入為0     11111101
    P0DIR&=~0x02;

//初始化中斷
    //設置引腳中斷 1為中斷使能 00000010
    P0IEN |= 0x02;
    //設置端口中斷
    IEN1|=0x20;
    //設置端口中斷觸發方式 1為下降沿觸發
    PICTL|=0x01;
    //設置總中斷
    EA=1;
    //清空標志位
    P0IFG=0;


}




void BLink()
{
  Delay(time);
  LED1=0;
  LED2=1;
  LED3=1;
  Delay(time);
  LED1=0;
  LED2=0;
  LED3=1;
  Delay(time);
  LED1=0;
  LED2=0;
  LED3=0;
  Delay(time);
  LED1=1;
  LED2=1;
  LED3=1;



}

//中斷服務函數
#pragma vector = P0INT_VECTOR        //這一行的P0INT_VECTOR是中斷源的名稱嗎?
__interrupt void P0ISR(void)
{
  //清除端口中斷標志位
  P0IFG=0;
  
  //LED燈流水亮一遍
  BLink();

  //清除端口中斷標志位
  P0IF=0;

}







//主函數
void main()
{
  
 
  Init(); 
  LED3=0;
  while(1)
  {
  //LED3=0;
  }



  //return ;

}







這個實驗的難點以及重點主要是在初始化中斷這個過程,
初始化引腳的寄存器P0IEN|=0x02;
設置端口中斷的寄存器IEN1|=0x20;
設置端口中斷觸發方式PICTL|=0x01;
設置總中斷EA=1
清空標志位:P0IFG=0;


免責聲明!

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



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