目录

一、概述

二、整体思路

三、代码实现

四、总结


一、概述

由于最近需要对单Button开发多功能,因此,我们需要实现单击、双击、长按的效果反馈,实现不同的操作效果。(代码开源)


二、整体思路

针对不同按压方式,我们首先要了解单击、双击、长按的区别在于什么地方。

下面我们继续再看一下长按的波形。

通过分析我们不难发现,单击就是一个最简单的由高电平-低电平-高电平的过程,且低电平持续时间短,长按是两次快速的单击,中间间隔的高电平时间较短,长按本质上是一次单击,但中间低电平持续时间长。

电平变化 持续时间
单击 高-低-高
长按 高-低-高
双击 高-低-高-低-高

我们通过上述的表格确定编程思路,即将收到的按键信号分为两种,一是持续时间长的(长按),二是持续时间短的(单击或双击),因为我们需要一个变量来存储两次之间的时间,便于我们做判断。


三、代码实现

此处我选用低电平触发的Button,来实现如下功能。

首先初始化相关LED与Switch引脚。

    P1SEL &=~ 0X44;P1DIR &= ~0X44;P1SEL &= ~0x1b;P1DIR |= 0X1B;

随后我们先定义一个全局变量,此处我使用unsigned long,受限于在单片机中的最大数,已经每秒单片机能处理的指令数量,各位自行选择。

随后我们在主循环中让定义的标志位自增,我选择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,则说明这是单击后的结束事件,否则则是长按结束后的事件。


四、总结

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

Zigbee单片机开发板-实现单击、双击、长按的识别反馈-超简单方法-新大陆物联网-物联网竞赛-ZigbeeSTM32开发板相关推荐

  1. STM32独立按键实现单击双击长按功能

    目录 前言 一.按键功能定义 二.使用步骤 1.按键初始化 2.按键扫描函数(重点) 总结 前言 在使用STM32或其他单片机开发项目时,经常需要用到独立按键进行控制. 通常一个独立按键需要使用一个I ...

  2. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  3. Unity触摸屏幕 拖拽物体 旋转物体 放大缩小物体 单击 双击 长按

    Unity触摸屏幕 拖拽物体 旋转物体 放大缩小物体 单击 双击 长按 拖拽物体 using System.Collections; using System.Collections.Generic; ...

  4. 单个按键,实现单击+双击+长按

    按键函数:实现单击.双击.长按 按键按下时长超过1.5S,认为是长按事件. 连续两次按下时间间隔不超过350ms,认为是双击事件. 除以上两条,按键按键都属于单击事件. 废话不多说,直接上代码.如有问 ...

  5. 超简单!Vue 短信验证码组件开发详解

    1. Vue 组件代码如下: Vue.component('timerBtn',{template: '<button v-on:click="run" :disabled= ...

  6. 如何在pc上开发Android程序,电脑上运行Android应用(APK软件)超简单方法

    android是一个广阔.有活力的应用生态系统.根据统计,google play商店当中的应用数量已经超过1500万,其中当然也包含着众多高品质的热门应用. 但你是否想过,要是能在计算机上运行这些应用 ...

  7. 单片机按键开发库-支持连击、长按等操作

    Multi-Function Button Dectection Multi-Function Button Dectection,简称MFBD,是一个基于嵌入式C语言的按键库,自动消抖,支持单击.长 ...

  8. Android 单击+双击+短按+长按 逻辑

    ACTION_DOWN事件 ->mPrivateHandler.sendEmptyMessageDelayed(SWITCH_TO_SHORTPRESS, TAP_TIMEOUT) 发延迟处理的 ...

  9. 物联网入门学什么开发板_物联网入门:如何构建DIY Blynk板

    物联网入门学什么开发板 本教程适用于具有一定DIY硬件经验的人,尽管高级初学者可能会发现这是一个有趣的挑战. 此外,有经验的用户可能会发现设置此方法有趣,以便初学者学习. 要使该板不 带有带有Blyn ...

最新文章

  1. Oracle数据库查看表空间是否为自增的
  2. 分布式架构下,Session 共享有什么方案?
  3. 自动化测试,从入门到放弃
  4. 上海市国资大数据课题启动仪式暨数据资产技术及金融行业应用沙龙隆重开幕...
  5. Python Django 表单类Form(py代码画form表单仅渲染页面)
  6. retryexec.java 94_解决feign调用接口不稳定的问题
  7. 我感到惭愧不已的飞鸽传书
  8. re匹配字符串的中间一段_爬虫利器之 re 模块
  9. 外媒:三星电子与现代汽车考虑在汽车芯片领域结盟
  10. vue 开发中element-ui库的switch开关绑定number类型数据不成功问题 解决方法
  11. 字幕在看着你:利用恶意字幕文件劫持计算机
  12. requests 使用 socks5 协议 的另外一种方式
  13. hdu5064 dp
  14. 利用scrapy爬取句子迷网站优美句子存储到本地(喜欢摘抄的人有福了!)
  15. mysql-order by分页复杂排序条件替换union-limit(使用if和case when实现复杂排序)
  16. 智能客服搭建(1) - MRCP Server 搭建
  17. python学习笔记6--双色球需求实现
  18. 海尔简爱s11怎么进入bios_海尔简爱s11系统应用商店没有登录界面怎么办?
  19. 梦之光芒/黑客小游戏
  20. Creo建模(持续更新)

热门文章

  1. 阿里云服务器ECS通用型g5和ECS通用型g6实例区别在哪?如何选择?
  2. Pandas(一)--Series结构
  3. CMD命令批量抽取指定文件夹下所有文件路径
  4. Python爬虫教程-Python爬取股票数据过程详解
  5. 基于Java爬虫的课堂考勤管理系统(毕业设计论文)
  6. 浅谈百度地图的简单开发之引入基本地图以及修改地图样式(一)
  7. mysql-Front有json类型恢复不了数据库解决方法Connot create a JSON value from a string with CHARACTER SET ‘binary‘
  8. 笔记:在xt-form中插入el-table表格 和 在xt-form中插入el-button(基于iview-form)
  9. 3 Java的主要特点
  10. 银盛支付再吃罚单!严监管下行业乱象难禁,平台发力B端应做到合规当先