PIN

Pin(脚号, 模式, 上下拉) 创建对象;
.on()/.off()/.value() 控制输出;
.value() 读输入;
.irq() 挂中断;
所有硬件交互的起点,都是它。


  1. 导入与创建引脚对象
from machine import Pin
# 两种方式:一次性写完,或先创建再配置
led = Pin(25, Pin.OUT)          # 25 号脚直接设为输出(Pico 板载 LED)
btn = Pin(14, Pin.IN, Pin.PULL_UP)  # 14 号脚输入 + 内部上拉

  1. 输出模式:写高 / 写低 / 翻转
led.on()                        # 输出高电平(3.3 V)
led.off()                       # 输出低电平(0 V)
led.toggle()                    # 电平翻转(高→低 或 低→高)
led.value(1)                    # 写 1;写 0 用 value(0)
print(led.value())              # 读当前输出状态,返回 0 或 1

  1. 输入模式:读取电平
print(btn.value())              # 按键未按下时上拉=1;按下接地=0

  1. 上下拉电阻
# 三种拉法可选(只能选一种)
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)      # 浮空,电平不确定

  1. 中断(回调):事件触发立刻执行函数
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 太多、不要分配大内存,设个标志位即刻退出。


  1. 开漏 / 推挽模式(高级用法)
# 开漏输出:自己只能拉低,外部必须接上拉电阻
od_pin = Pin(13, Pin.OPEN_DRAIN, value=1)  # 默认释放(高阻)
od_pin.value(0)                            # 主动拉低
od_pin.value(1)                            # 释放,由上拉决定高电平

  1. 读取外部模拟量?Pin 只负责数字,
    模拟读用 ADC(Pin(26)),这里不展开。

  1. 完整小例子:按键控制 LED 翻转
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 变一次状态,手不用松开自动防抖。


  1. 对象生命期
    • 引脚一旦实例化,配置就锁在硬件寄存器;
    • 重新创建同名 Pin 会覆盖旧配置;
    • 用完可 pin.off() 或 pin.init(Pin.IN) 释放驱动,省电。