中断方式——按键控制LED亮灭(外部信号输入读取)
电路依然没变,若要使用CC2530的外部中断需要使用P0IEN、PICTL、P0IFG、INE1寄存器
通用I/O 引脚设置为输入后,可以用于产生中断,中断可以设置在外部信号的上升或下降沿触发,P0、P1或P2 端口都有中断使能位,对位于IENl(端口中断使能寄存器)寄存器内的端口所有的位都是公共的
IEN1.P0IE:P0 中断使能
IEN2.P1IE:P1 中断使能
IEN2.P2IE:P2 中断使能
除了这些公共中断使能之外,每个端口的位都有位于SFR 寄存器P0IEN、P1IEN 和P2IEN(单独引脚中断使能寄存器)的单独的中断使能,即使配置为外设I/O 或通用输出的I/O 引脚使能时都有中断产生
使能中断时候,还需要配置中断方式,这里需要用到PICTRL寄存器(配置中断方式)
当中断条件发生在I/O 引脚之一上面,P0-P2 中断标志寄存器P0IFG、P1IFG 或P2IFG(中断标志寄存器)中相应的中断状态标志将设置为1,不管引脚是否设置了它的中断使能位,中断状态标志都被设置,当中断已经执行,中断状态标志被清除,该标志写入0
这个标志必须在清除CPU 端口中断标志(PxIF)之前被清除,寄存器总结如下:
P0IEN: P0 中断使能
P1IEN: P1 中断使能
P2IEN: P2 中断使能
PICTL: P0、P1 和P2 触发沿设置
P0IFG: P0 中断标志
P1IFG: P1 中断标志
P2IFG: P2 中断标志
#include <ioCC2530.h> typedef unsigned char uchar; typedef unsigned int uint; #define LED1 P1_0 // P1.0口控制LED1 #define KEY1 P0_1 // P0.1口控制S1 void DelayMS(uint msec) { uint i,j; for (i=0; i<msec; i++) for (j=0; j<535; j++); } void InitLed(void) { P1DIR |= 0x01; //P1.0定义为输出口 LED1 = 1; //LED1灯上电默认为熄灭 } void InitKey() { P0IEN |= 0x02; // P0.1 设置为中断方式 1:中断使能 PICTL |= 0x01; //下降沿触发 IEN1 |= 0x20; //允许P0口中断; P0IFG = 0x00; //初始化中断标志位 EA = 1; //打开总中断 } #pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) { DelayMS(10); //延时去抖 LED1 = ~LED1; //改变LED1状态 P0IFG = 0; //清中断标志 P0IF = 0; //清中断标志 } void main(void) { InitLed(); //设置LED灯相应的IO口 InitKey(); //设置S1相应的IO口 while(1) { } }