使用CC2530的P10、P11、P14口为输出口,驱动 LED1/LED2/LED3 ;P01口为高电平即按键S1信号输入。本实验程序用外部中断方式实现按键控制 LED灯:开机按键一次,LED1灯亮;按键两次,LED3、 LED2、LED1依次闪烁;按键三次,LED1、LED2、LED3依次闪烁;按键四次,LED1、LED2、 LED3灯灭,如此循环。
#define unint unsigned int
#define uchar unsigned char
#define uint32 unsigned long
#define led1 P1_0
#define led2 P1_1
#define led3 P1_4
#define key1 P0_1
#include<ioCC2530.h>
#include"exboard.h"
uchar Keyvalue = 0 ; //定义变量记录按键动作
uint KeyTouchtimes = 0 ; //定义变量记录按键次数
uchar KeyScan(void)
{
if(KEY1 == 1) //高电平有效
{
Delay(100); //防抖检测,检测到按键
if(KEY1 == 1)
{
while(KEY1); //直到松开按键
return(1);
}
}
return(0);
}
void Delay(uint n)
{
uint i,j;
for(j = 0; j<5; j++)
{
for(i = 0;i<5;i++);
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG>0) //按键中断
{
P0IFG = 0;
Delay(100);
if(P0IFG==0) //按键中断
{
Delay(100);
KeyTouchtimes = KeyTouchtimes+1; //每次中断发生时记录按键次数加1
}
}
P0IF = 0; //清中断标志
}
void main()
{
P0SEL &= ~0x02;/*将P0_0端口设为通用I/O**/
P0INP &= 0x02;/*上拉**/
P0IEN &= 0x02;/*P0_1设置为中断方式**/
PICTL |= 0x02;/*下降沿触发**/
EA = 1;
IEN1 |= 0x20;/**P0设置为中断方式*/
P0IFG |= 0x00;/*初始化中断标志位**/
/*设置led灯**/
P1SEL &= ~0x13;/*P1SEL将端口014位设为通用I/O**/
P1DIR |= 0x13;/*P1DIR第014位设为输出模式**/
led1 = 0;
led2 = 0;
led3 = 0;
while(1)
{
Keyvalue = KeyScan(); //读取按键动作
if (Keyvalue==1)
{
KeyTouchtimes = KeyTouchtimes+1; //记录按键次数
}
if(KeyTouchtimes ==1) //第一次按下按键设置LED1灯亮
{
led1 = 1;
led2= 0;
led3= 0;
}
if(KeyTouchtimes == 2) //第二次按下按键设置为 LED3,LED2,LED1倒序流水闪烁
{
led2 = !led2; Delay(20000);
led3 = !led3;
Delay(20000);
LED1 = !led1;
Delay(20000);
}
if(KeyTouchtimes == 3) //第三次按下按键设置为 LED1,LED2,LED3顺序流水闪烁
{
led1 = !led1;
Delay(20000);
led3 = !led3;
Delay(20000);
led2= !led2;
Delay(20000);
}
if(KeyTouchtimes == 4) //第四次按下按键设置为 LED1,LED2,LED3全部关闭
{
led1 = 0;
led2 = 0;
led3 = 0; //关闭所有LED
KeyTouchtimes =0; //重置按键次数记录变量
}
}
}