每个端口的位都有位于 SFR 寄存器 P0IEN 、 P1IEN 和 P2IEN 的单独的中断使能
当中断条件发生在 I/O 引脚之一上面,P0-P2 中断标志寄存器 P0IFG、P1IFG 或 P2IFG 中相应的中断状态
标志将设置为 1。
PxIEN :中断使能
P1CTL:设置上升沿触发还是
中断设置步骤:
1、 初始化IO工作在普通IO,上拉输入模式 (可忽略)
2、 首先开IO总中断 IEN
3、 开组内对应的具体某IO中断 PxIEN
4、 上升沿触发还是下降沿触发 PICTL
5、 开CPU总中断 EA
初始化时必须将相应的中断标志位清0!!
#include<ioCC2530.h>
#define LED1 P1_0 //定义P1_0口为LED1
#define LED2 P1_1 //定义P1_1口为LED2
#define KEY P1_2
/*
中断设置步骤:
1、初始化IO工作在普通IO,上拉输入模式 (可忽略)
2、首先开IO总中断 IEN
3、开组内对应的具体某IO中断 PxIEN
4、上升沿触发还是下降沿触发 PICTL
5、开CPU总中断 EA
注意:初始化时必须将相应的中断标志位清0!!
*/
//
void Init_INT1( void )
{
IEN2 |=(1<<4); // 开IO中断
P1IEN |=(1<<2); //打开端口1IO中断
PICTL |=0x02; //端口1 上升沿触发
EA=1; //CPU总中断打开
P1IFG &=~(1<<2); //中断标志位清零
}
//延迟时间 time ms
void delay_ms(int time)
{
int i,j;
for(i = 0 ;i < time;i++)
{
for(j = 0;j < 240;j++)
{
asm("NOP"); //执行一个空的机器周期,目的是消耗时间
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
//主函数
void main()
{
Init_INT1();
P1DIR |=0x03; //设置为输出模式
LED1=0;
LED2=1;
while(1); //使程序继续工作
}
//中断
#pragma vector = P1INT_VECTOR
__interrupt void P1INT_ISR(void)
{
if(KEY==0)
{
delay_ms(10); //作用是消抖
if(KEY==0)
{
if(P1IFG & 0x04)
{
LED1=!LED1;
LED2=!LED2;
while(!KEY);
P1IFG &=~(1<<2); //中断标志位清零
}
}
}
}