通过本次实验,将会清楚如何捕获一个外部中断和CC2530捕获外部中断后的处理流程
本次实验所学到的新寄存器为:
P0IEN:各个控制口的中断使能,0为中断禁止,1为中断使能。
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
P0_7 |
P0_6 |
P0_5 |
P0_4 |
P0_3 |
P0_2 |
P0_1 |
P0_0 |
P0INP:设置各个I/O口的输入模式,0为上拉/下拉,1为三态模式
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
P0_7模式
|
P0_6模式 |
P0_5模式 |
P0_4模式 |
P0_3模式 |
P0_2模式 |
P0_1模式 |
P0_0模式 |
PICTL:D0~D3设置各个端口的中断触发方式,0为上升沿触发,1为下降沿触发。
D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压,确保在较低的电压下的驱动能力和较高电压下相同。0为最小驱动能力增强。1为最大驱动能力增强。
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
I/O驱动能力
|
未用
|
未用
|
未用
|
P2_0~P2_4
|
P1_4~P1_7
|
P1_0~P1_3
|
P0_0~P0_7
|
IEN1:中断使能1,0为中断禁止,1为中断使能
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
未用
|
未用
|
端口0 |
定时器4
|
定时器3
|
定时器2 |
定时器1 |
DMA传输 |
P0IFG:中断状态标志寄存器,
当输入端口有中断请求时,相应的标志位将置1。
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
P0_7
|
P0_6 |
P0_5 |
P0_4 |
P0_3 |
P0_2 |
P0_1 |
P0_0 |
源代码:#include <ioCC2530.h>
#define uint
unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define RLED P1_0 //定义LED1为P10口控制
#define YLED P1_1 //定义LED2为P11口控制
#define GLED P1_4 //定义LED3为P14口控制
#define KEY1 P0_1 //定义按键为P01口控制
//函数声明
void Delay(uint); //延时函数声明
void Initial(void); //初始化函数声明
void InitKey(void); //初始化按键函数声明
uchar KeyScan(void); //按键扫描函数声明
uchar Keyvalue = 0 ; //定义变量记录按键动作
uint KeyTouchtimes = 0 ; //定义变量记录按键次数
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}
void InitKeyINT(void)
{
P0SEL &= ~0X02; //普通功能
P0DIR &= ~0X02; //P0_1I/O口,设置为输入模式
P0INP |= 0x02; //上拉
P0IEN |= 0X02; //P01设置为中断方式
PICTL |= 0X01; //下降沿触发
EA = 1;
IEN1 |= 0X20; // P0设置为中断方式;
P0IFG |= 0x00; //初始化中断标志位
}
void InitIO(void)
{
P1DIR |= 0x13; //P10、P11、P14定义为输出
RLED = 0;
GLED = 0;
YLED = 0; //LED灯初始化为灭
}
#pragma vector = P0INT_VECTOR //中断服务子程序
__interrupt void P0_ISR(void)
{
if(P0IFG>0) //按键中断
{
P0IFG = 0;
Delay(25000);
if(P0IFG==0)