//此程序仅供cslg单片机课程1624221,1624222演示用
//在Arduino Mega 2560(或任何其他基于AVR微控制器的Arduino板)上,
//中断函数(Interrupt Service Routine, ISR)中使用延时函数(如delay())是不推荐的,
//甚至可能是危险的。
const int ledPin = 13; // LED连接的引脚
const int buttonPin = 2; // 按钮连接的引脚,对应interrupt 0
char ledc=0,leda=8,ledi=0,leds=0; // 快闪中断配置变量
volatile boolean buttonState = LOW; // 用于在ISR和主程序之间传递状态
void zhangrelaydelay(unsigned int delay_ms) {
// 将毫秒转换为微秒
unsigned long delay_us = delay_ms * 1000;
// 定义每次delayMicroseconds()调用的最大微秒数
// (根据平台可能有所不同,但通常1000或更少是安全的)
const unsigned int max_micros_per_call = 1000;
// 循环直到达到所需的总延时
while (delay_us > 0) {
// 计算本次循环应该延时的微秒数
unsigned int current_delay_us = min(delay_us, max_micros_per_call);
// 使用delayMicroseconds()进行延时
delayMicroseconds(current_delay_us);
// 更新剩余的延时
delay_us -= current_delay_us;
}
}
void setup() {
pinMode(ledPin, OUTPUT); // 设置LED引脚为输出模式
pinMode(buttonPin, INPUT_PULLUP); // 设置按钮引脚为输入模式,并启用内部上拉电阻
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, CHANGE); // 设置外部中断
}
void loop() {
digitalWrite(ledPin, HIGH); // 慢闪烁5s亮
delay(5000);
digitalWrite(ledPin, LOW); // 5s灭
delay(5000);
}
void buttonISR() {
// 在ISR中切换快闪状态
leds=digitalRead(ledPin);
for(ledc=0;ledc<leda;ledc++)
{
digitalWrite(ledPin, HIGH); // 中断led亮
for(ledi=0;ledi<leda;ledi++)
{
zhangrelaydelay(100);
}
digitalWrite(ledPin, LOW); // 中断led灭
for(ledi=0;ledi<leda;ledi++)
{
zhangrelaydelay(10000);
}
}
digitalWrite(ledPin,leds);
}