You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现按键触发仅打印一次并回到循环起始,同步LCD对应按键颜色

按键按下仅触发一次响应的解决方案

问题说明

需求:按下按键后,LCD屏幕显示对应颜色,程序仅打印一次按键触发信息。
当前问题:按键按下后,程序无限重复打印"ybutton ok"或"rbutton ok",添加continue无法解决。

问题原因

机械按键按下时,Pin.value()会持续返回True,主循环会反复执行print语句。必须检测按键按下的瞬间(边缘触发),或等待按键释放后再继续循环,才能实现单次触发。


方法1:检测按键释放(简易消抖)

思路:检测到按键按下后立即打印信息,然后等待按键释放,同时添加短延时处理机械按键的抖动问题,避免误触发。

修改后的代码:

from machine import Pin
import time

ybutton = Pin(14, Pin.IN, Pin.PULL_DOWN)
rbutton = Pin(15, Pin.IN, Pin.PULL_DOWN)
gbutton = Pin(13, Pin.IN, Pin.PULL_DOWN)

while True:
    if ybutton.value():
        print("ybutton ok")
        # 等待按键释放,同时消抖
        while ybutton.value():
            time.sleep_ms(10)
    elif rbutton.value():
        print("rbutton ok")
        while rbutton.value():
            time.sleep_ms(10)
    # 主循环添加短延时,降低CPU占用
    time.sleep_ms(10)

方法2:使用外部中断(高效触发)

思路:利用GPIO中断功能,仅在按键按下的**上升沿(从释放到按下的瞬间)**触发一次回调函数,自带消抖配置,CPU占用更低。

修改后的代码:

from machine import Pin
import time

ybutton = Pin(14, Pin.IN, Pin.PULL_DOWN)
rbutton = Pin(15, Pin.IN, Pin.PULL_DOWN)
gbutton = Pin(13, Pin.IN, Pin.PULL_DOWN)

# 按键回调函数,触发时执行
def ybutton_trigger(pin):
    print("ybutton ok")
    # 在此添加LCD显示黄色的代码

def rbutton_trigger(pin):
    print("rbutton ok")
    # 在此添加LCD显示红色的代码

# 配置中断:上升沿触发(按键按下),启用消抖
ybutton.irq(trigger=Pin.IRQ_RISING, handler=ybutton_trigger, hard=False)
rbutton.irq(trigger=Pin.IRQ_RISING, handler=rbutton_trigger, hard=False)

# 主循环保持程序运行
while True:
    time.sleep(1)

两种方法对比

  • 方法1:代码直观,无需理解中断机制,适合简单项目;
  • 方法2:响应速度更快,CPU占用低,适合需要处理多个事件的复杂场景。

内容的提问来源于stack exchange,提问作者rafael rébi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:11:44