引脚选择:P1_0,P1_1,P1_2,其中P1_2为KEY1
相关寄存器说明:
P1SEL寄存器:
P1DIR寄存器:
IEN2寄存器:因为KEY(P1_2)在端口1上
P1IEN寄存器:
PICTL寄存器:
实现基本步骤:
1、设置P1_0端口和P1_1为通用I/O口,设置P1_0端口和P1_1为输出端口,设置上电LED为熄灭的状态
2、外部中断初始化,使能P1端口中断,使能P1_2端口中断,配置中断为下降沿触发,打开总中断
3、编写P1口外部中断服务函数,P1IFG寄存器,当输入端口有未响应的中断请求时,相应标志位置1,需要软件复位
#include"ioCC2530.h"
#include <stdio.h>
#define LED1 (P1_0)
#define LED2 (P1_1)
#define SW1 (P1_2)
unsigned char flag_Pause=0; //流水灯运行标志位,为1为暂停,0为运行
void delay(unsigned int time)
{
unsigned int i;
unsigned int j;
for(i=0;i<time;i++)
for(j=0;j<240;j++)
{
asm("NOP"); //asm用来在C代码中嵌入汇编语言操作
asm("NOP"); //汇编命令nop是空操作,消耗1个指令周期
asm( "NOP" );
while(flag_Pause);
}
}
//***************P1口外部中断服务函数***********************
#pragma vector=P1INT_VECTOR
__interrupt void P1_INT(void)
{
if(P1IFG & 0x04) //P1IFG寄存器,当输入端口有未响应的中断请求时,相应标志位置1
//需要软件复位
{
if(flag_Pause=0)
{
delay(2000);
flag_Pause=1;
}
else
{
delay(2000);
flag_Pause=0;
}
P1IFG &=~0x04; //清除P1_2端口中断标志位
}
P1IF=0; //清除P1端口中断标志位
}
//******************************************************************
void main(void)
{
P1SEL &=~0x03; //设置P1_0端口和P1_1为通用I/O口
P1DIR |=0x03; //设置P1_0端口和P1_1为输出端口
LED1=0; //熄灭LED1
LED2=0; //熄灭LED2
/*
P1INP &=~0x04; //设置P1_2端口为上拉或下拉
P2INP &=~0x40; //设置P1端口所有引脚使用上拉
LED1=0; //熄灭LED1
*/
//***********外部中断初始化********
IEN2 |=0x10; //使能P1端口中断
P1IEN |=0X04; //使能P1_2端口中断
PICTL |=0x02; //下降沿触发;P1_3到P1_0端口下降沿触发
EA=1;
//*********************************
while(1)
{
delay(1000);
LED1=1;
delay(1000);
LED2=1;
delay(1000);
LED1=0;
delay(1000);
LED2=0;
}
}