1开启中断的步骤
1-1使能端口组的中断
IEN1
IEN2
实例
IEN2 |= 0x10 //使能P1口中断
1-2 端口中断屏蔽
P0IEN和P1IEN
P2IEN
实例
P1IEN |=0x10; //使能P1_2口中断
1-3设置触发方式
PICTL
实例
PICTL |=0X02 ;//P1_3到P1_2口下降沿触发
1-4设置中断优先级
必要时更改,一般不动
1-5开启总中断
IEN0
实例
EA = 1 //使能总中断
1-1-1 编辑中断函数
1)中断处理函数的编写格式中断服务处理的编写格式具体如下。
#pragma vector=<中断向量>__interrupt void <函数名称> (void){/*编写中断处理程序*/}
在每一个中断处理函数之前,都要加上一行起始语句:
#pragma vector = <中断向量><中断向量>
表示接下来要写的中断处理函数是为哪个中断源进行服务的。
该语句有两种写法,比如为任务所需的P1口中断编写中断处理函数时:
#pragma vector =0x78 或 #pragma vector =P1INT_VECTOR
前者是将<中断向量>用具体的值表示,后者是将<中断向量>用单片机头文件中的宏定义表示。
要查看单片机头文件中有关中断向量的宏定义,可打开“ioCC2530.h”头文件,查找“Interrupt Vectors”部分,便可以看到18个中断源所对应的中断向量定义,如图所示。
1-1-2进入中断后要清除中断标志
(一片)
P0、P1和P2口分别使用P0IF、P1IF和P2IF作为中断标志位,任何一个端口组的I/O口产生外部中断时,会将对应端口组的外部中断标志位自动置位。
(具体哪一个)
P0IFG和P1IFG寄存器的描述
P2IFG寄存器的描述
2代码实例(按键控制led)
#include "ioCC2530.h"int a=0;void delay(int n){int i,j;for(i=0;i<n;i++){for(j=0;j<240;j++){asm("NOP");asm("NOP");asm("NOP");}}
}void main(void){P1SEL &=~ 0x07; //(00000111) 设置为通用ioP1DIR |= 0x03;//(0000 0011) 设置为输出P1DIR &=~ 0x04;//(0000 0100) 设置为输入//中断时,不用写(此是按键的输入模式设置)
// P1INP &=~ 0x04;//(0000 0100) 设置输入模式
// P2INP &=~ 0x40;//(0100 0000)IEN2 |= 0x10;//(0001 0000) io端口组开启中断P1IEN |=0x04;//(0000 0100) 使能具体的io口中断PICTL &=~ 0x02;//(0000 0010) 中断触发模式EA =1; //开启总中断while(1){if(a==1){P1_0=~P1_0;P1_1=~P1_1;delay(500);}else{a=0;}}
}#pragma vector=P1INT_VECTOR
__interrupt void P1_int(void){if(P1IFG & 0x04){a++;P1IFG &=~ 0x04;//清理具体的中断标志为P1IF = 0; //清理io端口的总中断}
}