题目:
用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用普通的延时函数实现按键单击与双击的区分也是一个快速的处理手段。按键SW1单击的时候,切换D3灯的开关状态;按键SW1双击的时候,切换D4灯的开关状态。其中:
按键SW1--->P1_2 D3灯--->P1_0(高电平点亮) D6灯--->P1_4(高电平点亮)
思路:
<1> 定义一个普通的延时函数Delay()、一个计算时间的变量count和一个延时阈值TT。
<2> 当SW1第1次按下的时候,等待按键松开,只要count小于TT时,调用Delay()进行延时,累计count变量。
<3> 在count小于TT时,发现SW1按键再次按下,则为双击按键。
<4> 如果在count大于等于TT的延时过程中都没有第二次按键按下,则为单击按键。
代码:
#include "ioCC2530.h"
#define D3 P1_0
#define D6 P1_4
#define sw1 P1_2
unsigned int count = 0;
void Delay(unsigned int t)
{
while(t--);
}
void Init_port()
{
P1SEL &= ~0x1b;
P1DIR |= 0x1b;
P1 &= ~0x1b;
}
void Scan_keys()
{
if(sw1 == 0)
{
Delay(100); //按键去抖动
if(sw1 == 0)//确认有按键按下
{
while(sw1 == 0);
while(count < 20)
{
Delay(10000);
count++;
if(sw1 == 0) //双击处理
{
Delay(200);
if(sw1 == 0)
{
while(sw1 == 0);
D3 = ~D3;
count = 0;
break;
}
}
}
if(count >= 20) //单击处理
{
D6 = ~D6;
count = 0;
}
}
}
}
void main()
{
Init_port(); //初始化端口
while(1)
{
Scan_keys();//按键扫描函数
}
}