一、相关寄存器介绍
1.寄存器PxSEL
- x为端口标号0~2;
- 用来设置端口的每个引脚为通用I/O或者是外部设备I/O;
- 默认时,每当复位后,所有数字输入输出引脚都设置为通用输入引脚。
2.寄存器PxDIR
- 设置每个端口引脚为输入或者输出,设置PxDIR指定位为1,其对应引脚就被设置为输出。
3.中断屏蔽寄存器
- 中断请求可通过设置中断使能寄存器IEN0、IEN1或IEN2的中断使能位使能或禁止。
4.中断标志寄存器
- 中断产生时,cpu会在中断标志寄存器中设置中断标志位,可通过中断标志位来判断是否发生了相应的中断;
- TCON、S0CON、S1CON、IRCON、IRCON2是CC2530的五个中断标志寄存器;
- P0IFG、P1IFG、P2IFG是端口0、1、2每一位的中断标志寄存器。
二、电路图
- LED电路图
- 按键电路图
三、程序思路
程序实现按键中断控制两盏灯的亮灭,按一次,LED1亮,第二次,LED2亮,LED灭,第三次,全亮,第四次,全灭。
- 初始化LED;
- 初始化按键为中断方式;
- 初始化中断标志位;
- 进入死循环,检测是否有中断;
4.1 若有,执行中断处理函数;
4.2 否则,继续循环检测;
四、程序代码
#include<ioCC2530.h>
#define uchar unsigned char
#define uint unsigned int
#define LED1 P1_0
#define LED2 P1_1
#define Key1 P1_2
uchar count=0; //计数器
void Delay(unsigned int time)
{
unsigned int i,j;
for(i=0;i<time;i++)
for(j=0;j<10000;j++);
}
void main()
{
P1SEL &= ~0x07; //设置P1_0 P1_1为通用IO口
P1DIR |= 0x03; //设置P1_0 P1_1为输出模式,P1_2输入
LED1 = 0;
LED2 = 0;
P1INP |= 0x04; //P1_3为上拉
P1IEN |= 0x04; //P1_3设置为中断方式
PICTL |= 0x04; //下降沿触发
EA = 1; //打开总中断
IEN2 |= 0x10; //P1设置为中断方式
P1IFG |= 0x00; //初始化中断标志位
while(1)
{
;
}
}
#pragma vector= P1INT_VECTOR //端口P0中断处理函数
__interrupt void P1_ISR(void)
{
Delay(5);
if(Key1==0)
{
count++;
if(count%4==0) //按四次,全灭;
{
LED1 = 0;
LED2 = 0;
}
else if(count%4==1) //按一次,LED1亮
{
LED1 = 1;
LED2 = 0;
}
else if(count%4==2) //按两次,LED2亮
{
LED2 = 1;
LED1 = 0;
}
else if(count%4==3) //按三次,全亮
{
LED1 = 1;
LED2 = 1;
}
P1IFG = 0; //清除P1_3中断标志
P1IF = 0; //清除P1中断标志
}
}
注意:中断处理函数最后一定要清除标志位。