爱收集资源网

单 Button 开发多功能:实现单击、、长按效果反馈的代码开源

爱收集资源网 2024-08-19 13:14

目录

一、概述

因为近来须要对单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,则说明这是单击后的结束风波,否则则是长按结束后的风波。

四、总结

本次活动通过计时的思路,剖析单击、双击、长按的区别,实现分辨,一键多用,发挥出不同的功能,提升开发效率。

抖音双击和单击的区别