使用定时器完成跑马灯流程。闪烁规则:从上往下逐个点亮,从下往上逐个 熄灭,上下逐个往中间点亮,从中间往外围熄灭。K1 断开跑马灯全部熄灭。
时间: 2024-05-12 10:18:50 浏览: 75
以下是使用Arduino实现的代码:
```arduino
int leds[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 8个LED灯的引脚
int numLeds = 8; // LED灯的数量
int currentIndex = 0; // 当前亮起的LED灯的索引
bool isRunning = true; // 跑马灯是否正在运行
void setup() {
// 初始化LED引脚为输出模式
for (int i = 0; i < numLeds; i++) {
pinMode(leds[i], OUTPUT);
}
// 设置定时器,每500毫秒调用一次timerCallback函数
Timer1.initialize(500000);
Timer1.attachInterrupt(timerCallback);
}
void loop() {
if (digitalRead(K1) == LOW) {
// K1按下,跑马灯全部熄灭
isRunning = false;
for (int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], LOW);
}
} else {
// K1未按下,跑马灯开始运行
isRunning = true;
}
}
void timerCallback() {
if (!isRunning) {
return;
}
// 从上往下逐个点亮
if (currentIndex < numLeds) {
digitalWrite(leds[currentIndex], HIGH);
currentIndex++;
return;
}
// 从下往上逐个熄灭
if (currentIndex >= numLeds && currentIndex < numLeds * 2) {
digitalWrite(leds[numLeds * 2 - currentIndex - 1], LOW);
currentIndex++;
return;
}
// 上下逐个往中间点亮
if (currentIndex >= numLeds * 2 && currentIndex < numLeds * 3) {
digitalWrite(leds[currentIndex - numLeds * 2], HIGH);
digitalWrite(leds[numLeds * 3 - currentIndex - 1], HIGH);
currentIndex++;
return;
}
// 从中间往外围熄灭
if (currentIndex >= numLeds * 3 && currentIndex < numLeds * 4) {
digitalWrite(leds[numLeds * 4 - currentIndex - 1], LOW);
digitalWrite(leds[currentIndex - numLeds * 3], LOW);
currentIndex++;
return;
}
// 一轮跑马灯完成,重置索引
currentIndex = 0;
}
```
在上述代码中,我们定义了一个包含8个LED灯引脚的数组,并通过定时器每500毫秒调用一次`timerCallback`函数来控制跑马灯的流程。在`loop`函数中,当按下K1时,将`isRunning`标志设为false,跑马灯全部熄灭;否则,`isRunning`标志为true,跑马灯开始运行。在`timerCallback`函数中,我们按照指定的流程逐步点亮和熄灭LED灯。当一轮跑马灯完成后,重置索引,准备开始下一轮跑马灯。
阅读全文