• 简介:传统的按键扫描程序,大部分都是采用 delay_ms(5); 这样的语句来进行按键消抖,但当你把它放在你高速运行的程序中时,这5ms可能会拖慢你的成语运行,导致体验感受下降,因此,我便找到了新的按键扫描思想,并将这一思想移植到ESP8266中以便后续工程使用!
  • 这种新的按键扫描思想并不复杂,你需要定义一个 1ms 的定时器,在定时器中判断按键状态,如果按键按下,则按键的检测按下次数 加一,最后将 按键的检测按下次数  乘以 1ms 则可以得到按键按下时间,如果检测到按键松开,则令按键的检测按下次数  归零,这样一来,我们便可以实现按键的 短按&&长按。
  •  接下来看下例子吧!
/*
*@作者:刘泽文
*@功能:四个按键,放在定时器里边的按键扫描程序,防止拖慢程序
*@时间:2020/3/15*/#include <Ticker.h>
#include <ESP8266WiFi.h>//LED和按键引脚定义
#define LED         D4 //gpio2
#define UP_KEY      D6 //gpio12
#define M_KEY       D5 //gpio14
#define DOWN_KEY    D7 //gpio13
#define WAKE_UP     D3 //gpio0//读按键值
#define KEYU      digitalRead(UP_KEY)
#define KEYM      digitalRead(M_KEY)
#define KEYD      digitalRead(DOWN_KEY)
#define KEYW      digitalRead(WAKE_UP)#define LED_OFF   digitalWrite(LED, HIGH)//关灯
#define LED_ON    digitalWrite(LED, LOW)//开灯
#define LED_PWM   digitalWrite(LED, !digitalRead(LED))//灯闪烁#define short_press_time 10     //短按时间
#define long_press_time 1000    //长按时间#define NO_KEY_PRES     0   //无按键按下#define UP_KEY_PRES     1
#define M_KEY_PRES      2
#define DOWN_KEY_PRES   3
#define WAKE_UP_PRES    4#define UP_KEY_LONG_PRES     11
#define M_KEY_LONG_PRES      22
#define DOWN_KEY_LONG_PRES   33
#define WAKE_UP_LONG_PRES    44uint16_t KEYU_PRESS_COUNT = 0;//按KEYU时间计数
uint16_t KEYM_PRESS_COUNT = 0;//按KEYM时间计数
uint16_t KEYD_PRESS_COUNT = 0;//按KEYD时间计数
uint16_t KEYW_PRESS_COUNT = 0;//按KEYW时间计数bool KEYU_UP = 0;//按键状态,0为弹起,1为按下
bool KEYM_UP = 0;//按键状态,0为弹起,1为按下
bool KEYD_UP = 0;//按键状态,0为弹起,1为按下
bool KEYW_UP = 0;//按键状态,0为弹起,1为按下uint8_t KEYU_KEY_READ = NO_KEY_PRES;//KEYU按键状态
uint8_t KEYM_KEY_READ = NO_KEY_PRES;//KEYM按键状态
uint8_t KEYD_KEY_READ = NO_KEY_PRES;//KEYD按键状态
uint8_t KEYW_KEY_READ = NO_KEY_PRES;//KEYW按键状态Ticker key_tick;/*
*@定时器里边检测按键状态并计数
*/
void flip() {//UP_KEYif(KEYU==0){KEYU_PRESS_COUNT++;KEYU_UP = 1;if(KEYU_PRESS_COUNT<=short_press_time)KEYU_KEY_READ = NO_KEY_PRES;if(KEYU_PRESS_COUNT>=short_press_time&&KEYU_PRESS_COUNT<=long_press_time)KEYU_KEY_READ = UP_KEY_PRES;if(KEYU_PRESS_COUNT>=long_press_time)KEYU_KEY_READ = UP_KEY_LONG_PRES;}if(KEYU){KEYU_PRESS_COUNT = 0;KEYU_UP = 0;//按键状态,0为弹起,1为按下}//M_KEYif(KEYM==0){KEYM_PRESS_COUNT++;KEYM_UP = 1;if(KEYM_PRESS_COUNT<=short_press_time)KEYM_KEY_READ = NO_KEY_PRES;if(KEYM_PRESS_COUNT>=short_press_time&&KEYM_PRESS_COUNT<=long_press_time)KEYM_KEY_READ = M_KEY_PRES;if(KEYM_PRESS_COUNT>=long_press_time)KEYM_KEY_READ = M_KEY_LONG_PRES;}if(KEYM){KEYM_PRESS_COUNT = 0;KEYM_UP = 0;//按键状态,0为弹起,1为按下}//DOWN_KEYif(KEYD==0){KEYD_PRESS_COUNT++;KEYD_UP = 1;if(KEYD_PRESS_COUNT<=short_press_time)KEYD_KEY_READ = NO_KEY_PRES;if(KEYD_PRESS_COUNT>=short_press_time&&KEYD_PRESS_COUNT<=long_press_time)KEYD_KEY_READ = DOWN_KEY_PRES;if(KEYD_PRESS_COUNT>=long_press_time)KEYD_KEY_READ = DOWN_KEY_LONG_PRES;}if(KEYD){KEYD_PRESS_COUNT = 0;KEYD_UP = 0;//按键状态,0为弹起,1为按下}//WAKE_UPif(KEYW==0){KEYW_PRESS_COUNT++;KEYW_UP = 1;if(KEYW_PRESS_COUNT<=short_press_time)KEYW_KEY_READ = NO_KEY_PRES;if(KEYW_PRESS_COUNT>=short_press_time&&KEYW_PRESS_COUNT<=long_press_time)KEYW_KEY_READ = WAKE_UP_PRES;if(KEYW_PRESS_COUNT>=long_press_time)KEYW_KEY_READ = WAKE_UP_LONG_PRES;}if(KEYW){KEYW_PRESS_COUNT = 0;KEYW_UP = 0;//按键状态,0为弹起,1为按下}if(KEYU_KEY_READ == UP_KEY_LONG_PRES && KEYU_UP == 0){LED_PWM;Serial.println("--KEYU_UP长按");KEYU_KEY_READ = NO_KEY_PRES;}if(KEYU_KEY_READ == UP_KEY_PRES && KEYU_UP == 0){LED_PWM;Serial.println("----KEYU_UP短按");KEYU_KEY_READ = NO_KEY_PRES;}if(KEYM_KEY_READ == M_KEY_LONG_PRES && KEYM_UP == 0){LED_PWM;Serial.println("------KEYM_UP长按");KEYM_KEY_READ = NO_KEY_PRES;}if(KEYM_KEY_READ == M_KEY_PRES && KEYM_UP == 0){LED_PWM;Serial.println("--------KEYM_UP短按");KEYM_KEY_READ = NO_KEY_PRES;}if(KEYD_KEY_READ == DOWN_KEY_LONG_PRES && KEYD_UP == 0){LED_PWM;Serial.println("------------KEYD_UP长按");KEYD_KEY_READ = NO_KEY_PRES;}if(KEYD_KEY_READ == DOWN_KEY_PRES && KEYD_UP == 0){LED_PWM;Serial.println("--------------KEYD_UP短按");KEYD_KEY_READ = NO_KEY_PRES;}if(KEYW_KEY_READ == WAKE_UP_LONG_PRES && KEYW_UP == 0){LED_PWM;Serial.println("----------------KEYW_UP长按");KEYW_KEY_READ = NO_KEY_PRES;}if(KEYW_KEY_READ == WAKE_UP_PRES && KEYW_UP == 0){LED_PWM;Serial.println("------------------KEYW_UP短按");KEYW_KEY_READ = NO_KEY_PRES;}
}void setup()
{Serial.begin(9600);pinMode(UP_KEY,INPUT_PULLUP);pinMode(M_KEY,INPUT_PULLUP);pinMode(DOWN_KEY,INPUT_PULLUP);pinMode(WAKE_UP,INPUT_PULLUP);pinMode(LED,OUTPUT);LED_OFF;//灭灯key_tick.attach_ms(1, flip);//按键检测定时器(1ms)
}void loop()
{delay(10*1000);LED_PWM; //闪灯
}
  • 打开你的串口监视器(波特率:9600),按下你的按键看看效果吧~

《ESP8266学习笔记》之 采用定时器内的按键扫描方法,摒弃传统的延时按键消抖相关推荐

  1. ESP8266学习笔记:实现ESP8266的局域网内通信

    ESP8266学习笔记:实现ESP8266的局域网内通信 现在就以实例入手.工程使用的是IOT_DEMO,据DEMO文档可以知道ESP8266初始工作模式为softAP+station共存的模式.于是 ...

  2. ESP8266学习笔记(1)——搭建环境、编译烧写(NONOS SDK)

    RTOS SDK环境搭建参看 ESP8266学习笔记(17)--搭建环境.编译烧写(RTOS SDK) 一.搭建环境 1.1 ESP8266 SDK 入门指南 官网下载:https://www.esp ...

  3. esp8266 蓝牙耳机_走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二)...

    走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二) 2020-05-09 13:44:11 9点赞 72收藏 6评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标 ...

  4. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  5. Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数

    16_采用SharedPreferences保存用户偏好设置参数 Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数 2013-03-08 16_采用Shar ...

  6. C++学习笔记_3_ C++入门 内联函数

    C++学习笔记_3_ C++入门 内联函数 目录 C++学习笔记_3_ C++入门 内联函数 一.内联函数 1.查看方式 2.特性 宏的优缺点 C++有哪些技术替代宏? 一.内联函数 以inline修 ...

  7. 【学习笔记】求解简单递归式的一般方法

    [学习笔记]求解简单递归式的一般方法 手动博客搬家: 本文发表于20180618 15:53:06, 原地址https://blog.csdn.net/suncongbo/article/detail ...

  8. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  9. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别

    知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...

最新文章

  1. MVC 区域内默认控制器不能访问(Multiple types were found that match the controller named ‘Index')...
  2. 1402 后缀数组 (hash+二分)
  3. 【spring-session】介绍
  4. Geodatabase中基于规则的拓扑关系管理机制
  5. Android之使用ACTION_USAGE_ACCESS_SETTINGS权限检测手机多少天没有未使用其它APP
  6. 无符号有符号乘法_刘帅嵌入式系统-乘法指令
  7. (7)FPGA十大设计思想(第2天)
  8. 创建钩子(Hook)
  9. 八年了,必须放手了,我不是你妈妈
  10. spring boot 实现文件下载
  11. PHP人民币金额数字转中文大写的函数
  12. 2021高考厦门科技中学成绩查询,2021年厦门重点高中名单及排名,厦门高中高考成绩排名榜...
  13. 2012-7-07可樂词汇积累#9314;
  14. 【JY】STKO助力OpenSEES系列:结构模态分析以及动力特性(MDOF与等效SDOF验证)
  15. Word插入Latex公式的几种方式(TeXsWord、EqualX、Aurora等工具)
  16. PDF是什么格式?如何在电脑上编辑PDF文件
  17. xstart连接linux桌面使用的端口,配置XManager5连接Linux图形化界面详解
  18. css 闪光_闪光VS。 CSS / HTML:您会选择哪个?
  19. delphi的bpl、dcp 、dcu文件意义
  20. 承接软硬件项目外包开发

热门文章

  1. 台塑集团获批收购奇梦达
  2. Google 收购摩托罗拉移动将会对全球手机市场格局带来哪些深远影响?
  3. python OSMNX路网处理 FMM GPS轨迹点绑路
  4. 用python自己动手做一个小游戏01
  5. IDEA eval reset
  6. JAVA项目实战开发电商项目案例(八)购物车功能开发
  7. Android File System安卓文件系统(安卓存储分区,/data /storage /sdcard)
  8. SpringCloud Alibaba 之Nacos集群部署-高可用保证
  9. for迭代求折纸超过珠峰高度
  10. 计算FLT_MAX的整数位长度