从零开始的MicroPython(三) 按键与外部中断

上一篇:从零开始的MicroPython(二) GPIO及点灯代码

前言

点灯是嵌入式GPIO输出的典型,按键则是输入的典型。

硬件原理

按键对角接通。

软件原理

如果是一端接高电平,一端接单片机,按下按键两端接通,单片机判断高电平则是按下。

一般来说是接地,接通则单片机读到低电平为按下按键。

注意

  1. 按键有上升沿与下降沿之分。
  2. 按键存在抖动现象,一般不能简单判断电平。

代码编写

轮询

上升沿

from machine import Pin
import time

led = Pin(2, Pin.OUT)

button = Pin(23, Pin.IN, Pin.PULL_DOWN)

led_state = 0
old_button_state = 0
new_button_state = 0

while True:
    new_button_state = button.value()
    # 上升沿,从电平0到1
    if old_button_state == 0 and new_button_state == 1:
        led_state = led.value()
        led_state = not led_state
        led.value(led_state)
    old_button_state = new_button_state

延时消抖:

from machine import Pin
import time

# 定义引脚
button = Pin(2, Pin.IN, Pin.PULL_UP)  # 按钮连接到GPIO2,使用内部上拉电阻
led = Pin(16, Pin.OUT)  # LED连接到GPIO16

while True:
    if button.value() == 0:  # 按钮按下时,按钮值为0
        led.value(not led.value())  # 切换LED状态
        time.sleep_ms(200)  # 延时200毫秒,防止抖动

消抖还有其他的一些写法,比如状态机,或者像这样写:基于C语言实现的一种按键软件消抖

外部中断

from machine import Pin, Timer
import utime

led = Pin(2, Pin.OUT)
button = Pin(23, Pin.IN, Pin.PULL_DOWN)
timer = Timer(-1)

def button_callback(pin):
    led.value(not led.value())

button.irq(trigger=Pin.IRQ_RISING, handler=button_callback)

while True:
    utime.sleep(1)

在这个例子中,我们使用了machine模块中的Pin类来定义LED和按钮引脚。我们将LED连接到GPIO2,并将按钮连接到GPIO23。我们还使用了Timer类来创建一个定时器对象,用于处理外部中断事件。

button_callback函数中,我们切换LED的状态。当按钮被按下时,触发一个上升沿中断,并调用button_callback函数。这个函数会切换LED的状态(开或关)。

其他

还有基于时间片轮转、多线程、多任务的写法。

下一篇:串口

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值