文档库 最新最全的文档下载
当前位置:文档库 › CC2530中断入门

CC2530中断入门

/*
本程序用来演示CC2530的外部中断,
用开关S1,S2分别控制Led1,LED2,
中断方式,下降沿触发,有按键动作,
Led翻转。
*/
#include

#define S1 P0_1 //开关S1在P0_1
#define S2 P2_0 //开关S2在P2_0
#define Led1 P1_0 //Led1在P1_0
#define Led2 P1_1 //Led2在P1_1
#define Led3_CSN P1_4 //Led3在P1_4
#define Led4_RX P0_2 //Led4在P0_2
#define Led5_TX P0_3 //Led5在P0_3

//程序目标:产生一个下降沿触发的中断
//S1开关控制Led1,S2开关控制Led2

void Intrpt_Init()
{
/*
初始化中断
一个端口(P0,P1,P2)的某一引脚产生中断,
需要配置的配置条件:
1、总中断打开:
EA=1;

2、该中断所在的组开关打开:
P0组的中断开关在IEN1的第5位
P1组的中断开关在IEN2的第4位
P2组的中断开关在IEN2的第1位

3、中断对应的引脚的开关也要打开
P0INE:端口P0.7到P0.0中断使能
0:中断禁用
1:中断使能。
要把P0_1这个脚的开关打开,
就需要把P0INE的第1位在程序中设为1
P0IEN |=0x02;
要把P2_0这个脚的开关打开,
就需要把P2INE的第0位在程序中设为1
P2IEN |=0x01;

4、配置到底是上升沿还是下降沿产生中断,PICTL。 1:下降沿
*/
P0SEL &= ~0x02; //设定P0_1为一般的IO口
P2SEL &= ~0x01; //设定P2_0为一般的IO口
P0DIR |= 0x02; //S1 在 P0_1,0000 0010,作为输入
P2DIR |= 0x01; //S2 在 P2_0,0000 0001,作为输入
EA=1;
//开CPU中断开关
IEN1 |=0x20;
//0010 0000
//P0组中断使能,IEN1第5位
IEN2 |= 0x02;
//0000 0001
//P2口中断使能,IEN2 第1位
P0IEN |=0x02;
//0000 0010
//P0相应中断位打开,开关S1在P0_1
P2IEN |=0x01;
//0000 0001
//P2相应中断位打开,开关S2在P2_0
PICTL |= (0x01 | 0x08);
//P0和P2为下降沿触发中断
//配置上升沿还是下降沿产生中断,PICTL。 1:下降沿
//端口0、1、2输入模式下的中断配置
//0: 输入的上升沿引起中断
//1: 输入的下降沿引起中断
P0IFG &= ~0x02; //清P0.1中断标志
P2IFG &= ~0x01; //清P2.0中断标志
}
void Led_Init()
{
P1SEL &= ~0x03; //设定P1_0和P1_1为一般的IO口
P1DIR |= 0x03; //Led1 在 P1_0,0000 0001,作为输出
//Led2 在 P1_1,0000 0010,作为输出
Led1 = Led2 = 1;//初始状态:1,灯灭
}

void DelayMS(unsigned int msec)
{
unsigned int i,j;
for(i=msec;i>0;--i)
for(j=535;j>0;--j);
}
void main()
{
Intrpt_Init();
Led_Init();
while(1);
}
#pragma vector = P0INT_VECTOR
__interrupt void S1_Led1()
{
//P0口中断,S1在P0_1:0000 0010
if(0x02 & P0IFG)
{
DelayMS(10);
Led1=!Led1;
}

P0IFG =0;
P0IF

=0;
}
#pragma vector = P2INT_VECTOR
__interrupt void S2_Led2()
{
//P2口中断,S2在P2_0:0000 0001
if(0x01 & P2IFG)
{
DelayMS(10);
Led2 = !Led2;
}
P2IFG = 0;
P2IF = 0;
}

相关文档