1,首先我们来认识一下几个寄存器
IEN0,IEN1,IEN2 //各外设或端口中断使能寄存器
P0IEN、P1IEN,P2IEN //通用I/O 中断使能寄存器
PICTL //端口中断控制为位,配置上升沿触发中断还是下降沿触发中断
EA //全局中断总开关,这个开关在IEN0寄存器的第七位,可位寻址。
如果想设置中断优先级可通过设置IP0,和IP1这两个寄存器来实现!
下面上数据手册说明图片
当使用外部中断的时候只需要配置以上的相关寄存器位就可以了!
2,例;使用P1_1端口的外部中断来使LED灯亮灭
#include <ioCC2530.h>
#define uint8_t unsigned char
#define uint16_t unsigned int
#define LED P1_0
#define Key P1_1
// 软件延时函数,使用不同的系统时钟,延时不一样
void delay_ms(uint16_t n)
{
uint16_t i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
/*******************************LED灯初始化************************************/
void LED_Init(void)
{
P1SEL &=~0x01; //将P1SEL的第0位置零,其实这句可以不写,因为上电默认IO口是0;不过为了严谨还是写上。
P1DIR |= 0x01; //将P1DIR的第0位置1,输出模式。
P1INP |= 0x01; //将的P1INP第0位置1,表示浮空,输出的话这个其实也不用配置
}
/*********************************按键初始化***********************************/
void Key_Init(void)
{
P1SEL &=~0x02; //将P1SEL的第1位置0,普通IO口。
P1DIR &=~0x02; //将P1DIR的第1位置0,输入模式。
P1INP &=~0x02; //将P1INP第1位置0,上下拉模式。
P2INP &=~0x40; //将P2INP第6位置0,设置P1口为上拉模式。
}
/*********************************中断初始化***********************************/
void Interrupt_Init(void)
{
Key_Init();
IEN2 |= 0x10; //端口1中断使能
P1IEN |= 0x02; //端口P1_1外部中断使能
PICTL |= 0x02; //端口P1_1下降沿触发
EA = 1; //使能全局中断
}
int main(void)
{
LED_Init();
Interrupt_Init();
while(1)
{
}
}
/**********************************中断服务子函数******************************/
#pragma vector = P1INT_VECTOR
__interrupt void Point_1()
{
if(Key == 0)
{
delay_ms(250);
if(Key == 0)
{
LED = !LED;
while(Key == 0);
}
}
P1IF = 0; //0: 无中断未决 1: 中断未决
P1IFG &=~0x02; //清除P1_1的中断标志位
}
其中中断子函数写法有点特别
#pragma vector = “P1INT_VECTOR ” 这一句前面等号前面的固定写法“”里面的是中断源,这个可以在头文件里面找到
__interrupt void “Point_1”() 这一句前面void前面的也是固定写法“”里面的是自己定义的函数名称
当然在中断函数的最后我们不要忘记了清楚中断标志哦,不然CPU会一直进入中断函数!
好了,以上就是中断的用法了!