### Micropython官方教程知识点详解:按键开关、回调函数与中断 #### 一、按键开关基础 在微控制器开发过程中,按键开关是非常重要的输入设备之一。通过按键,用户可以直接与微控制器进行交互,实现诸如菜单选择、功能切换等操作。 在Micropython环境下,pyboard开发板自带两个按键:USR和RTS。其中,RTS按键主要用于开发板的复位操作,即当按下RTS按键时,开发板将会重新擦写并重启,相当于对开发板进行了电源的切断和重新上电过程。 USR按键则是提供给用户使用的通用按键。用户可以通过创建一个`Switch`对象来控制USR按键的状态。创建`Switch`对象的基本语法如下: ```python import pyb sw = pyb.Switch() ``` 这里需要注意的是,如果在使用`pyb.Switch()`时出现“pyb未定义”的错误,那么通常是因为忘记了在代码中加入`import pyb`这一行。 获取按键状态的基本方法是通过直接调用`Switch`对象,如果按键被按下,则返回`True`;反之,则返回`False`。例如: ```python print(sw()) # 如果按键被按下,则输出True;否则输出False ``` #### 二、回调函数的应用 **1. 基础概念** 回调函数是在某个事件发生时(如按键被按下)自动执行的函数。在Micropython中,可以使用`Switch`对象的`callback`方法来设置一个回调函数。当按键被按下时,该回调函数就会被触发执行。 **2. 设置回调函数** 设置回调函数的基本语法如下: ```python sw.callback(callback_function) ``` 其中,`callback_function`是回调函数。这个函数可以在按键被按下时执行任意有效的代码块。回调函数可以通过lambda表达式或普通的函数定义来实现。 **3. 示例代码** 下面通过几个具体的示例来演示如何设置和使用回调函数。 **例1:使用lambda表达式** ```python sw.callback(lambda: print('按键被按下!')) ``` 这段代码会在每次按键被按下时,在控制台输出“按键被按下!”的信息。这里的lambda表达式是一个简短的匿名函数,用于快速定义回调函数。 **例2:使用普通函数** ```python def toggle_led(): pyb.LED(1).toggle() sw.callback(toggle_led) ``` 在这个例子中,每当按键被按下时,LED灯的状态就会发生改变。这里通过定义一个普通的Python函数`toggle_led`来实现回调功能。 **4. 关闭回调** 如果不再需要回调函数,可以通过将`callback`方法的参数设置为`None`来关闭它: ```python sw.callback(None) ``` #### 三、中断原理 **1. 中断的概念** 在微控制器系统中,中断是指当某个特定事件(如按键按下)发生时,微控制器会暂时中断当前正在执行的程序,并转而执行一段预设好的代码(即中断服务程序)。处理完中断后,微控制器会返回到之前被中断的地方继续执行原程序。 **2. 中断的工作流程** 当调用`sw.callback()`时,实际上是在配置一个外部中断。具体工作流程如下: 1. **边沿触发**:当按键被按下时,连接按键的GPIO引脚会发生电平变化,从而触发一个下降沿中断信号。 2. **中断请求**:处理器检测到该中断信号后,会记录这次中断,并保存当前的执行状态(包括CPU寄存器的内容等)。 3. **执行中断服务程序**:处理器跳转到预先设定好的中断服务程序处执行。这个程序就是我们在`sw.callback()`中定义的回调函数。 4. **中断返回**:中断服务程序执行完成后,处理器会返回到之前保存的中断点,继续执行之前的程序。 **3. 中断的注意事项** - **回调函数的简洁性**:为了确保中断服务程序能够快速执行并返回,回调函数应该尽可能地简单。避免在回调函数中进行复杂的计算或内存分配。 - **全局变量的使用**:如果需要在回调函数中使用复杂的数据结构(如列表或字典),建议在回调函数之外预先定义这些数据结构,并通过全局变量的方式访问。 - **中断的优先级**:当存在多个中断时,中断系统会根据每个中断的优先级顺序来决定它们的执行顺序。在pyboard中,按键中断的优先级相对较低,这意味着如果有更高优先级的中断发生,按键中断将被延迟执行。 通过以上内容的学习,我们不仅可以了解到按键开关的基本使用方法,还可以深入理解回调函数以及中断的工作机制。这对于开发基于微控制器的应用程序非常重要,尤其是在需要实时响应用户输入的场景下。
- 粉丝: 7
- 资源: 918
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MATLAB实现绘制NURBS曲线程序源码
- 处理word文档,解析文档格式、图片、表达式、表格-doc、docx篇
- C#微信营销平台源码 微信营销后台管理系统源码数据库 文本存储源码类型 WebForm
- 技术资料分享65C02汇编指令集很好的技术资料.zip
- 课程作业《用51单片机实现的红外人体检测装置》+C语言项目源码+文档说明
- app自动化小白之appium环境安装
- 课程设计-哲学家就餐问题(并发算法问题)-解决策略:资源分级、最多允许四个哲学家同时拿筷子、服务员模式、尝试等待策略
- C#大型公司财务系统源码 企业财务管理系统源码数据库 SQL2008源码类型 WebForm
- MDK文件编译配套工程
- java项目,课程设计-ssm企业人事管理系统ssm.zip