任务要求
选择找到一个国赛Zigbee节点盒或者小蜜蜂的XMF09C赛教套件,新建IAR工程并编写、编译代码,实现按键嵌套复合应用,完成以下任务要求:
【1】程序开始运行时,LED1闪烁2下后熄灭,LED2闪烁3下后熄灭,此时SW1按键处于锁定状态,即单击或双击该按键均不能控制2个LED灯的开关状态。
【2】在按键锁定的状态下,长按SW1按键松开后,LED1闪烁1下后熄灭,SW1按键处于解锁状态。
【3】在按键解锁状态下,单击SW1按键,可切换LED1的开关状态;双击SW1按键,可切换LED2的开关状态。
【4】在按键解锁的状态下,长按SW1按键松开后,LED1和LED2同时闪烁1下后熄灭,SW1按键重新回到锁定状态。
注:原创题目,转载请注明出处:www.xmf393.com
参考源码
#include "ioCC2530.h"
#define LED1 P1_0
#define LED2 P1_1
#define SW1 P1_2
#define TT 1000
unsigned char F_Lock = 0; //锁定状态标志
unsigned int count = 0; //时间片计数
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
while(t--);
}
/*=======================端口初始化函数========================*/
void Init_Port()
{
P1SEL &= ~0x03; //将P1_0,P1_1设置为通用I/O端口
P1DIR |= 0x03; //将P1_0,P1_1设置为输出方向
P1 &= ~0x03; //关闭2个LED灯
P1SEL &= ~0x04; //将P1_2设置为通用I/O端口
P1DIR &= ~0x04; //将P1_2设置为输入方向
P1INP &= ~0x04; //将P1_2设置为上拉/下拉
P2INP &= ~0x40; //将P1_2设置为上拉
}
/*========================LED灯闪烁函数========================*/
void LED_ShanSuo()
{
unsigned char i;
for(i = 0; i < 2; i++) //LED1灯闪烁2下
{
LED1 = 1;
Delay(60000);
LED1 = 0;
Delay(60000);
}
for(i = 0; i < 3; i++) //LED2灯闪烁3下
{
LED2 = 1;
Delay(60000);
LED2 = 0;
Delay(60000);
}
}
/*=======================按键扫描函数=========================*/
void Scan_Keys()
{
if(SW1 == 0) //发现有SW1按键信号
{
Delay(100); //延时片刻,去抖动处理
if(SW1 == 0) //确认为SW1按键信号
{
count = 0; //按键生命周期清0
while(SW1 == 0) //按键按下时,计算生命周期
{
Delay(200);
count++;
}
if(count > TT) //按下时间比生命周期长,长按
{
if(F_Lock == 0)
{
F_Lock = 1; //解锁
LED1 = 1;
Delay(60000);
LED1 = 0;
Delay(60000);
}
else
{
F_Lock = 0; //锁定
LED1 = 1;
LED2 = 1;
Delay(60000);
LED1 = 0;
LED2 = 0;
Delay(60000);
}
}
else if(F_Lock == 1)
{
while(count <= TT) //生命周期未结束
{
Delay(200);
count++;
if(SW1 == 0) //在生命周期内有按键按下,双击
{
Delay(100);
while(SW1 == 0);
LED2 = ~LED2;
break;
}
}
if(count > TT) //单击
{
LED1 = ~LED1;
}
}
}
}
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
LED_ShanSuo(); //LED灯闪烁
while(1)
{
Scan_Keys(); //按键扫描
}
}