上一篇:从零开始的MicroPython(二) GPIO及点灯代码
前言
点灯是嵌入式GPIO输出的典型,按键则是输入的典型。
硬件原理
按键对角接通。
软件原理
如果是一端接高电平,一端接单片机,按下按键两端接通,单片机判断高电平则是按下。
一般来说是接地,接通则单片机读到低电平为按下按键。
注意
- 按键有上升沿与下降沿之分。
- 按键存在抖动现象,一般不能简单判断电平。
代码编写
轮询
上升沿
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的状态(开或关)。
其他
还有基于时间片轮转、多线程、多任务的写法。
下一篇:串口