上一帖学习了 RGB三色灯的颜色控制以及LCD屏幕的点亮输出:
https://forum.eepw.com.cn/thread/398105/1
今天抓紧来学习和测试下 CircuitPython 下按键输入的用法。
l D2按键硬件上下拉
查看开发板的手册,用户按钮D1和D2,默认不按下时是LOW电平,按下时是HIGH电平。这么说,就可以确定它 默认为下拉模式了。手册如下图:

其实上上一贴中用GPIO作为输出控制红色LED闪烁,已经使用过控制GPIO的库 digitalio 库,按钮无非是更改输出方向为input,并读取针脚的value() 值来判断按钮状态。
l 按键消抖 Debounce
对于按钮来说,其他特别要注意的,就是要处理好按钮消抖!如下图:

常规的方法,无非就是加上消抖延迟,如果20ms以后按钮状态扔保持稳定,才认为是真正的被按下,否则认为是仍处于抖动过程中。在其他单片机编程中,一般也都是这么处理的。
虽说是用的 CircuitPython 写代码,但是原理一样,加上消抖延迟,滤波后基本也不会有什么问题。
l 使用 CircuitPython Debounce 库
但是, 既然使用了 CircuitPython,adafruit给我们提供了非常好用的消抖库 Debouncer,用起来也很简单,程序代码也更清晰! Debouncer 库文档:
https://docs.circuitpython.org/projects/debouncer/en/stable/
文档写的很清楚,依赖 debouncer库 和 ticks库,都是非内置库,需要把对应两个mpy文件拷贝到lib文件夹下即可。

基本用法上面文档里有例子,就是构建 Bouncer对象,在每个循环中周期性 update() 引脚状态,两个边缘检测函数 fell() 和 rose() 分别检测电平的下降沿和上升沿,value()函数返回消抖后的电平高低状态。
l D2按钮输入测试
下面来试一试,把文档中的例子稍微改改,代码如下:
import board
import digitalio
import time
from adafruit_debouncer import Debouncer
# Configure the digital input pin
pin = digitalio.DigitalInOut(board.D2)
pin.direction = digitalio.Direction.INPUT
pin.pull = digitalio.Pull.DOWN #下拉,默认低电平
# Initialize the debouncer with the pin
switch = Debouncer(pin)
while True:
# Update the debouncer state
switch.update()
# Check for state changes
if switch.fell: #电平由1-->0
print("Just released")
if switch.rose: #电平由0-->1
print("Just pressed")
# Check the current state
if switch.value: #高电平1
print("Pressed")
else: #低电平0
#print("Not pressed")
pass
time.sleep(0.01)保存后运行,不显示任何输出。当按下D2按钮,会先输出一行 Just Pressed, 然后打印当前电平值 pressed 多次,松开手的刹那,打印出 Just Released。多次测试,均准确无误,说明消抖的效果非常好!
上动图:

-------------------------------------------------------------------------------
接下来,就要研究下 蜂鸣器 播放音符 ♪ 啰~
2025-12-9 13:45
我要赚赏金
