Pin(脚号, 模式, 上下拉) 创建对象;
.on()/.off()/.value() 控制输出;
.value() 读输入;
.irq() 挂中断;
所有硬件交互的起点,都是它。
from machine import Pin
# 两种方式:一次性写完,或先创建再配置
led = Pin(25, Pin.OUT) # 25 号脚直接设为输出(Pico 板载 LED)
btn = Pin(14, Pin.IN, Pin.PULL_UP) # 14 号脚输入 + 内部上拉
led.on() # 输出高电平(3.3 V)
led.off() # 输出低电平(0 V)
led.toggle() # 电平翻转(高→低 或 低→高)
led.value(1) # 写 1;写 0 用 value(0)
print(led.value()) # 读当前输出状态,返回 0 或 1
print(btn.value()) # 按键未按下时上拉=1;按下接地=0
# 三种拉法可选(只能选一种)
pin_up = Pin(15, Pin.IN, Pin.PULL_UP) # 内部上拉,空闲=1
pin_down = Pin(16, Pin.IN, Pin.PULL_DOWN) # 内部下拉,空闲=0
pin_none = Pin(17, Pin.IN, pull=None) # 浮空,电平不确定
from machine import Pin
import time
# ===== 1. 下降沿中断(1→0)=====
# 按键一脚接 GND,另一脚接 GPIO 14,内部上拉
def falling_handler(pin):
print('↓ 下降沿触发,按键被按下') # 电平被拉低
key_f = Pin(14, Pin.IN, Pin.PULL_UP)
key_f.irq(trigger=Pin.IRQ_FALLING, handler=falling_handler)
# 没有硬件防抖,快速连按会多次打印
# ===== 2. 上升沿中断(0→1)=====
# 同一按键松手时产生上升沿
def rising_handler(pin):
print('↑ 上升沿触发,按键被松开') # 电平回到高
key_r = Pin(14, Pin.IN, Pin.PULL_UP)
key_r.irq(trigger=Pin.IRQ_RISING, handler=rising_handler)
# ===== 3. 双沿中断(按下+松开都进同一个回调)=====
# 如果只想用一条线,也可以同时监听两种沿
def both_handler(pin):
level = pin.value()
print('双沿中断,当前电平 =', level) # 0=按下 1=松开
key_b = Pin(14, Pin.IN, Pin.PULL_UP)
key_b.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler=both_handler)
# 主循环空跑,让中断有机会被触发
while True:
time.sleep(1)
注意:中断里不要 print 太多、不要分配大内存,设个标志位即刻退出。
# 开漏输出:自己只能拉低,外部必须接上拉电阻
od_pin = Pin(13, Pin.OPEN_DRAIN, value=1) # 默认释放(高阻)
od_pin.value(0) # 主动拉低
od_pin.value(1) # 释放,由上拉决定高电平
ADC(Pin(26)),这里不展开。from machine import Pin
import time
led = Pin(25, Pin.OUT)
key = Pin(14, Pin.IN, Pin.PULL_UP)
while True:
if key.value() == 0: # 按键被按下(接地)
led.toggle() # LED 翻转
time.sleep_ms(200) # 简单防抖
按一次键 LED 变一次状态,手不用松开自动防抖。
pin.off() 或 pin.init(Pin.IN) 释放驱动,省电。