cc2530的第三次實驗:按鍵中斷控制流水燈
效果為按一次按鍵,流水燈亮一次
實驗相關電路圖:
實驗相關寄存器:
初始化函數
//初始化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;