按钮/按键

原理简介

按键是最基本的输入设备,用于检测用户的按下动作。

  • 工作原理:按下时两个引脚导通(接通到 GND),松开时断开
  • 常用接法:一个脚接 GPIO,另一个脚接 GND,GPIO 开启内部上拉电阻,松开时读 1、按下时读 0
  • 三种用法:轮询(一直问)、软件防抖、中断(按下才通知)
  • 接口:GPIO 数字输入

典型应用

  • 菜单选择和确认操作
  • 系统重置和唤醒
  • 紧急停止按钮
  • 游戏控制器
  • 计数器和计分板

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 按键一脚 → Pico GP14
  • 按键另一脚 → Pico GND
  • 用 Pico 内部上拉电阻(Pin.PULL_UP),不需要外接电阻

示例代码

基础示例:按键检测(轮询)

# ============ 接线 ============
# 按键一脚 → Pico GP14
# 按键另一脚 → Pico GND
# 用 Pico 内部上拉:松开读到 1,按下读到 0,无需外接电阻
# =============================
from machine import Pin
import time

key = Pin(14, Pin.IN, Pin.PULL_UP)   # 内部上拉

print('开始检测按键...')

while True:
    if key.value() == 0:             # 按键按下(接通到 GND)
        print('按键被按下!')
        while key.value() == 0:      # 等按键松开
            pass
        print('按键被释放')
    time.sleep_ms(50)                # 简单防抖

进阶示例:带防抖的按键

# ============ 接线 ============
# 按键一脚 → Pico GP14
# 按键另一脚 → Pico GND(内部上拉,无需外接电阻)
# =============================
from machine import Pin
import time

key = Pin(14, Pin.IN, Pin.PULL_UP)

key_state = 1
last_key_state = 1
time_last = 0
de_bounce_time = 50      # 防抖时间(毫秒)

print('带防抖的按键检测')

while True:
    current_time = time.ticks_ms()
    current_state = key.value()

    # 状态变化且超过防抖时间才算是一次有效动作
    if current_state != last_key_state and time.ticks_diff(current_time, time_last) > de_bounce_time:
        if current_state == 0:
            print('按键按下')
        else:
            print('按键释放')
        time_last = current_time

    last_key_state = current_state
    time.sleep_ms(10)

中断示例:按键中断

# ============ 接线 ============
# 按键一脚 → Pico GP14
# 按键另一脚 → Pico GND(内部上拉,无需外接电阻)
# =============================
from machine import Pin
import time

key = Pin(14, Pin.IN, Pin.PULL_UP)

# 中断回调函数:按键按下(下降沿)时自动被调用
def key_handler(pin):
    print('按键中断触发:按键被按下')
    # 注意:中断里尽量别做耗时操作,也别在这里用 input()/print 太频繁

# 下降沿触发(按下瞬间从高电平变低电平)
key.irq(trigger=Pin.IRQ_FALLING, handler=key_handler)

print('中断模式,按下按键测试')

while True:
    time.sleep(1)        # 主循环可以去做别的事,按键按下时中断会通知
    print('主循环运行中...')

注意事项

  • 上拉必须开:Pin(14, Pin.IN, Pin.PULL_UP) 不开上拉,松开时引脚悬空,读数会乱跳
  • 防抖:机械按键按下/松开瞬间会抖几下,轮询示例里用 time.sleep_ms(50) 去抖;更稳用进阶示例的防抖法
  • 读值含义:本接法下「按下 = 0,松开 = 1」,判断时注意别写反
  • 长按功能:记录按下的时刻,松开时算时长,超过阈值就是长按
  • 多按键:每个按键占一个 GPIO,写法一样,分别建 Pin() 即可

常见问题

Q: 按键检测不稳定、偶尔多触发怎么办? A: 加 Software 防抖(见进阶示例),或硬件上在按键两端并一个 0.1µF 电容滤波。

Q: 按键按下后程序没反应? A: 检查两脚有没有接反(一脚 GPIO、一脚 GND),并确认用了 Pin.PULL_UP。

Q: 怎么实现长按 / 双击? A: 长按:记下 key.value()==0 的起始时刻,松开时比较时长。双击:两次短按间隔小于设定值算双击。