Arduino第四次实验—自动垃圾清除车-中断代码调式

本文介绍了Arduino平台上的中断处理函数attachInterrupt的应用,详细解释了不同触发模式,并分享了使用中断进行自动垃圾清除车项目的调试经验。

作者 :alajl

日期: 2011-4-18

标题: Arduino第四次实验自动垃圾清除车 -中断代码调式

原文链接: http://blog.youkuaiyun.com/alajl

 

关于 attachInterrupt(),我想说点什么:

这个是一个中断函数,由于许多数字传感器的状态只有 0 1,两种状态,所以用这个方法来触发一个事件,是相当好不过了,例如:

1、寻线传感器,从线内到了线外, 0 1的改变,或者是 1 0的改变,这个改变取决于你线的颜色,一般黑色是 0,白色是 1

2、红外障碍传感器:有障碍和没障碍的感应,同样是 0 1的改变,或者是 1 0的改变

 

所以这个函数,可以异步处理这些传感器的值,因此你不用不断的去轮询那些传感器的状态了,而把主程序释放出来去控制别的逻辑。

 

Arduino的控制板,只提供了 2个数字口的中断,请看红色的标注部分,所以如果你想用中断,那么 D2 D3就不要被占用了。

它支持 4种模式的触发,如下:

  • LOW :只要是低电平就触发
  • CHANGE 只要电平的值改变了就出发,不管是 0 1,还是 1 0
  • RISING 由低电平到高电平触发
  • FALLING 当高电平到低电平触发

 

 

该函数文档如下:(摘自 http://arduino.cc/en/Reference/AttachInterrupt

attachInterrupt(interrupt, function, mode)

Description

Specifies a function to call when an external interrupt occurs. Replaces any previous function that was attached to the interrupt. Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). The Arduino Mega has an additional four: numbers 2 (pin 21), 3 (pin 20), 4 (pin 19), and 5 (pin 18).

Parameters

interrupt : the number of the interrupt (int )

function : the function to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as an interrupt service routine.

mode defines when the interrupt should be triggered. Four contstants are predefined as valid values:

  • LOW to trigger the interrupt whenever the pin is low,
  • CHANGE to trigger the interrupt whenever the pin changes value
  • RISING to trigger when the pin goes from low to high,
  • FALLING for when the pin goes from high to low.

 

写在最后:

当我真机测试时,晕倒!由于电机的干扰,我的中断完全乱序,当我停止电机时,中断工作良好, google 一下,有可能是因为,我的电机板和传感板公用的一块电源,导致了这个原因,只是可能啊,所以建议是分开供电,而我手上确没有单独的多余供电模块(也就是 9V 电池和电池盒),所以就只好把代码改回了轮询的方式了,以后有机会在试试这个方式

 

<think>好的,用户需要一个使用C++实现的LCD1602通过外部中断按键控制数字从0到9循环显示的代码示例。首先,我需要回忆LCD1602的基本操作和外部中断的处理方法。 LCD1602通常使用I2C接口,所以需要包含相应的库,比如LiquidCrystal_I2C。用户提到的代码中引用了这个库,所以示例代码应该基于它。接下来,外部中断需要配置中断服务例程(ISR),在Arduino中可以使用attachInterrupt函数。 需要注意中断防抖处理,避免按键抖动导致多次触发。可能需要设置一个标志位,在主循环中处理实际的数字递增,而不是直接在ISR中处理,因为ISR应尽量简短。同时,数字需要在0到9之间循环,所以取模运算是个好方法。 然后,需要初始化LCD,设置中断引脚,比如使用下降沿触发。在setup函数中初始化LCD和中断,在loop中检测标志位,更新显示。还要处理LCD的显示位置,确保每次更新时清除旧内容或覆盖。 可能遇到的问题包括I2C地址是否正确,中断引脚的选择,以及防抖延时是否足够。用户提供的引用中提到高亮显示,但当前需求不需要,所以可以忽略这部分。代码结构大致分为初始化、中断处理和主循环更新。 现在需要将这些步骤整合成一个示例代码,确保语法正确,并添加必要的注释。同时,需要测试代码是否能在实际硬件上运行,但在这里只能提供理论上的正确代码。最后,生成相关问题,帮助用户深入理解。</think>### C++实现LCD1602外部中断按键控制数字循环显示 #### 硬件连接要求 1. LCD1602使用I2C模块(地址通常为0x27或0x3F) 2. 按键连接至支持外部中断的引脚(如Arduino Uno的D2/D3) 3. 按键需配置下拉电阻或启用内部上拉 #### 示例代码 ```cpp #include <LiquidCrystal_I2C.h> // 配置硬件参数 #define INTERRUPT_PIN 2 // 中断引脚 volatile bool updateFlag = false; // 中断标志 int counter = 0; // 显示数值 LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C地址,16列2行 // 中断服务程序 void handleInterrupt() { static unsigned long last = 0; unsigned long now = millis(); // 防抖处理(200ms间隔) if (now - last > 200) { updateFlag = true; last = now; } } void setup() { // 初始化LCD lcd.init(); lcd.backlight(); lcd.print("Counter:"); // 配置中断引脚 pinMode(INTERRUPT_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), handleInterrupt, FALLING); // 显示初始值 lcd.setCursor(9, 0); lcd.print(counter); } void loop() { if (updateFlag) { counter = (counter + 1) % 10; // 0-9循环 // 更新显示 lcd.setCursor(9, 0); lcd.print(counter); updateFlag = false; } } ``` #### 关键实现原理 1. **中断配置**:使用`attachInterrupt`注册中断服务程序,检测按键的下降沿触发[^1] 2. **防抖处理**:通过200ms时间间隔过滤机械抖动产生的误触发 3. **数值循环**:采用`(counter + 1) % 10`实现0-9循环计数 4. **显示更新**:仅更新数值区域(第9列第0行),避免全屏刷新闪烁 #### 使用说明 1. 确认LCD的I2C地址(可用I2C扫描工具检测) 2. 按键需连接中断引脚与GND,按下时产生低电平 3. 首次上电显示初始值0,每次按键数值递增1,到9后循环回0
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值