去抖原理:
当扫描到按键位置变化后,判断变化后的状态保持时间是否达到按键动作判断时间(通常为30~40毫秒以上,或根据当前需要调整),若达到该时间则判断为按钮按下,然后再判断按钮是否弹起,若弹起则触发事件,调用相应的函数或执行相关的程序。如果不在按钮弹起后再调用程序,则会一直连续不停地调用程序,时间间隔为按键按下判断时间。
Code: Select all
# 开发环境:Debian9/64bit,EPS8266 V1.9.3
from machine import Pin, Timer
# 全局变量
butLab = 0 # 按钮扫描记次
staLab = 0 # 状态标志字,范围0-2
# 按钮扫描与触发事件相关参数
button = Pin(2, Pin.IN, Pin.PULL_UP) # 按键引脚
SER = 7 # 单次触发:保持7次以上扫描触发单次触发事件。
teg = 0 # 触发电平,0为低电平,1为高电平,默认为低电平触发。
tmBut = Timer(-1)
'''*************************************************************************
* 功 能:单个机械按键去抖
* 说 明:按键单次触发,默认下降沿触发,根据按键电路不同有所不同。
* 输入参数:
_pin 按键使用引脚
* 输出参数:None
* 返 回 值:True
**************************************************************************'''
def butOnoff(_pin):
global butLab, staLab, teg
butLab = (butLab * int(not(_pin.value() ^ teg)))+int(not(_pin.value() ^ teg)) # 当按键当前状态与需要监测的状态一致时,butLab+1,否则butLab = 0,采用的是同或原理,若以按键的默认状态为判断标准,则可以使用异或方式。
if butLab >= SER:
staLab += 1
butLab = 0
teg = int(not (teg))
if staLab == 2:
staLab = 0
# ************************
# 请在此输入您的处理代码
# ************************
return True
tmBut.init(period=10, mode=Timer.PERIODIC, callback=lambda t:butOnoff(button))