题目:
用一个按键实现长按与短按的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来进行按键按下的时间是通用的做法,然而对于不太熟悉定时器使用,又没有严格的延时长度的情况下,使用普通的延时函数实现长短按键的区分也是一个不错的选择。按键SW1短按的时候,切换D3灯的开关状态;按键SW1长按的时候,切换D4灯的开关状态。其中:
按键SW1--->P1_2 D3灯--->P1_0(高电平点亮)D6灯--->P1_4(高电平点亮)
思路:
<1> 定义一个普通的延时函数Delay()和一个计算时间的变量count。
<2> 在按键扫描函数中,当SW1按下的时候,不断调用延时函数Delay()并对调用的次数进行累计保存在count中。
<3> 当SW1松开的时候,停止调用延时函数Delay(),对count变量进行判断,大于某个阈值属于长按,否则是短按。
代码:
#include "ioCC2530.h"
#define D3 P1_0
#define D6 P1_4
#define sw1 P1_2
unsigned int count = 0; //定义变量标志位
//初始化端口
void Init_port()
{
P1SEL &= ~0x1b;
P1DIR |= 0x1b;
P1&= ~0x1b;
}
//延迟函数
void Delay(unsigned int t)
{
while(t--);
}
//按键扫描函数
void Scan_key()
{
if(sw1 == 0)
{
Delay(200);
if(sw1 == 0)
{
count = 0; //标志位清零
while(sw1 == 0)//判断按键状态
{
Delay(10000); //此处延迟一定要10000
count++; //按键按下时通过count累计时间
}
if(count < 15) //短按
{
D3 = ~D3;
}
else //长按
{
D6 = ~D6;
}
}
}
}
//主函数
void main()
{
Init_port(); //初始化端口
while(1)
{
Scan_key(); //按键扫描
}
}