目录
一、概述
因为近来须要对单Button开发多功能,为此,我们须要实现单击、双击、长按的疗效反馈,实现不同的操作疗效。(代码开源)
二、整体思路
针对不同按压形式,我们首先要了解单击、双击、长按的区别在于哪些地方。
下边我们继续再看一下长按的波形。
通过剖析我们不难发觉,单击就是一个最简单的由高电平-低电平-高电平的过程,且低电平持续时间短,长按是两次快速的单击,中间间隔的高电平时间较短,长按本质上是一次单击,但中间低电平持续时间长。
电平变化
持续时间
单击
高-低-高
短
长按
高-低-高
长
双击
高-低-高-低-高
短
我们通过上述的表格确定员程思路,正式收到的按钮讯号分为两种,一是持续时间长的(长按),二是持续时间短的(单击或双击),由于我们须要一个变量来储存两次之间的时间,以便我们做判别。
三、代码实现
此处我选用低电平触发的Button,来实现如下功能。
首先初始化相关LED与Switch引脚。
P1SEL &=~ 0X44;
P1DIR &= ~0X44;
P1SEL &= ~0x1b;
P1DIR |= 0X1B;
此后我们先定义一个全局变量,此处我使用unsignedlong,受限于在单片机中的最大数,早已每秒单片机能处理的指令数目,诸位自行选择。
此后我们在主循环中让定义的标志位自增,我选择60000是由于在我们单片机上,60000大致相当于半秒。
if(flag<60000)
{
flag++;
}
此后我们继续完成主函数,并对此进行剖析。
if(sw1==0)
{
halMcuWaitMs(10);
if(sw1==0)
{
if(flag<60000)//认为是第二次双击
{
//执行双击策略
halLedToggle(2);//执行某个语句
}
flag=0;
while(!sw1)
{
if(flag<60000)
flag++;
if(flag==60000)
{
halLedSet(1);//执行某个语句
flag++;//只执行一次
}
}
if(flag==60001)
{
halLedClear(1);//执行某个语句
}
flag=0;
}
每次按键抬起就会重置标志位,当按键再度按下的时侯,假如flag大于60000则说明这是一次双击风波,否则则说明此次风波和先前风波的持续时间长,没有必然联系,我们就可以进一步剖析是否为单击或长按。
在等待键盘抬起的工程中,再度重置标志位,用标志位估算时间,假如按键抬起时,标志位大于60000,说明低电平持续时间大于0.5s,则属于一次单击,否则属于一次长按。
在键盘抬起后,通过判定flag的值,假如大于60000,则说明这是单击后的结束风波,否则则是长按结束后的风波。
四、总结
本次活动通过计时的思路,剖析单击、双击、长按的区别,实现分辨,一键多用,发挥出不同的功能,提升开发效率。