告别死循环!Pico 外部中断控制 LED,比轮询高效 100 倍

在下面实验中,我们使用 风雅一号板-通用兼容扩展板

在使用外部中断时,我们需要明确在哪些引脚使用中断,中断触发的条件和中断响应后需要进行的操作。

在以下代码中,我们设置 GPIO22 为按键输入引脚使用上拉电阻使能,配置 GPIO22 为下降沿触发中断,在中断响应后执行 handle_interrupt 函数,切换 led_state 的值和 LED 灯状态,并在中断打印 LED 状态信息。

在主程序的 while 循环中,输出调试信息 "Waiting for button press...",主循环不会干扰中断的执行,中断由硬件触发且实时响应。

示例代码如下,在配套资料的文件夹:elegance-devkit v1\Demo\02 GPIO_EXTI 中:

Python 复制代码
# Python env   : MicroPython v1.23.0              
# -*- coding: utf-8 -*-        
# @Time    : 2024/6/14 上午11:10   
# @Author  : 李清水            
# @File    : main.py       
# @Description : GPIO外部中断实验,完成按键按下切换LED点亮/熄灭任务

# ======================================== 导入相关模块 ========================================

# 硬件相关的模块
from machine import Pin
# 时间相关的模块
import time

# ======================================== 全局变量 ============================================

# LED状态标志位:True 表示点亮,False 表示熄灭
led_state: bool = False

# ======================================== 功能函数 ============================================

def handle_interrupt(pin: Pin) -> None:
    """
​    GPIO外部中断的回调函数,用于切换LED的点亮/熄灭状态。

​    中断触发后,先进行按键消抖处理。确认按键仍然按下后,
​    根据当前LED状态切换为点亮或熄灭,并打印状态信息。

​    Args:
​        pin (Pin): 触发中断的GPIO引脚实例。

​    Returns:
​        None
​    """
​    ​# 声明全局变量
    global LED
    global led_state

    # 消抖处理:延时50ms
    time.sleep_ms(50)

    # 再次确认按键是否仍然按下(GPIO引脚电平为低)
    if pin.value() == 0:
        # 切换LED状态
        led_state = not led_state
        if led_state:
            # LED 点亮
            LED.on()
            print("The LED is ON")
        else:
            # LED 熄灭
            LED.off()
            print("The LED is OFF")

# ======================================== 初始化配置 ==========================================

# 上电延时3s
time.sleep(3)
# 打印调试消息
print("FreakStudio: Using GPIO EXTI interrupt to toggle LED")

# 设置GPIO 22 为按键输入引脚,启用上拉电阻
KEY = Pin(22, Pin.IN, Pin.PULL_UP)
# 设置GPIO 25为LED输出引脚,下拉电阻使能
LED = Pin(25, Pin.OUT, Pin.PULL_DOWN)

# 配置KEY的中断:中断回调函数为handle_interrupt,下降沿触发
KEY.irq(handler=handle_interrupt, trigger=Pin.IRQ_FALLING)

# ======================================== 主程序 ============================================

# 主循环:程序空闲时输出按键状态信息
while True:
    # 等待中断触发,打印调试信息
    print("Waiting for button press...")
    time.sleep(1)

烧录代码,打开终端,可以看到不按下按键时,终端输出如下:

按下按键时,LED 灯点亮;再次按下时,LED 灯熄灭,实验现象类似于 3.1 中 GPIO 读写例程。

第一次按下按键时:

当第二次按下按键时:

这里,我们在代码中增加了类型注解,并符合 PEP8 规范,所谓类型注解就是 Python 中用来标明变量、函数参数和返回值数据类型的一种机制,简单来说就是在代码中明确告诉别人或者程序工具:某个变量、函数参数或者返回值是什么类型(比如整数、字符串、列表等),它就像在给变量和函数做备注,比如说,你定义了一个函数接收数字,但是有人传了个文字进来,类型注解可以提前警告你哪里出问题了。

关于类型注解的更多内容,可以查看如下文章:

https://mp.weixin.qq.com/s/7r4hgM3a187si_D5ReEMCA

同时,我们整个代码遵守 PEP8 规范,PEP8 是 Python 编程语言的​代码风格指南 ​,全称是 Python Enhancement Proposal 8 (Python 增强提案第 8 号),它是一份文档,规定了编写 Python 代码时的最佳实践和格式要求,简单来说就是一种代码书写规则,类似写作文的格式要求。它教你怎么排版代码更整齐、更好看,比如变量名要用小写字母加下划线、函数之间留两行空白、每行代码不要超过 79 个字符等等,它的目标就是让大家写出来的代码风格统一,看起来更舒服,同时也更容易维护和合作。

关于 PEP8 规范的更多内容,可以查看如下文章:

https://mp.weixin.qq.com/s/rvHzNvuovU-3KY2FtcQK-Q

相关推荐
nangonghen15 分钟前
Agent如何传递不同类型的ID给MCP Server
开发语言·python
2601_9621229720 分钟前
解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南
java·tomcat·intellij-idea
AOI小白新手上路23 分钟前
江科协51单片机入门:新建第一个Keil工程,点亮第一个LED(含完整代码)
stm32·单片机·51单片机
luj_176827 分钟前
断舍离中的项目管理智慧
c语言·开发语言·c++·经验分享·算法
码视野30 分钟前
基于 Spring Boot + Vue3 的【城市雨污水管网液位淤积溯源与立交桥下穿隧洞防汛排涝智控中台】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端
老王爱玩车32 分钟前
关于函数递归的优缺点分析
开发语言·数据结构·学习·算法
Zzzzmo_34 分钟前
Maven+SpringBoot
java·spring boot
自小吃多38 分钟前
PCB Editor软件网络飞线常规处理笔记
笔记·嵌入式硬件
深圳市恒锐丰科技杨生40 分钟前
CL4056D 1A 单节锂电池线性充电芯片|ESOP‑8/DFN2×2‑8 便携充电方案
嵌入式硬件·硬件工程