流水灯一次亮两个灭一个的流水函数
时间: 2024-05-13 16:17:44 浏览: 83
以下是一次亮两个灭一个的流水函数的示例代码:
```
void twoOnOneOff(int delayTime) {
for (int i = 0; i < 8; i++) {
if (i % 3 == 2) { // 亮两个
digitalWrite(i, HIGH);
digitalWrite(i+1, HIGH);
} else { // 灭一个
digitalWrite(i, LOW);
}
delay(delayTime); // 延时
}
}
```
在这个函数中,我们使用了一个 `for` 循环来遍历 8 个 LED 灯的引脚。通过判断当前的循环变量 `i` 是否为 2 的倍数,来控制亮灯的数量。如果是 2 的倍数,则亮两个相邻的灯;否则,只亮一个灯。在每次操作后,我们使用 `delay()` 函数来延时一段时间,使得流水灯的效果更加明显。
相关问题
. 两个按键,第一个按键按下不松开,第二个按键松开,实现第一种流水灯, 八个 LED 依次点亮,每次亮一个;第一个按键松开,第二个按键按下不松开,实 现第二种流水灯,八个 LED 依次灭一个,七个亮,一个灭
好的,这个问题的具体实现可以分为两个部分,硬件部分和软件部分。
硬件部分需要连接两个按键和八个 LED 灯到单片机或者开发板上。其中,第一个按键需要连接到一个 GPIO 引脚,第二个按键需要连接到另一个 GPIO 引脚,八个 LED 灯需要连接到八个不同的 GPIO 引脚上。
软件部分需要编写一个程序,通过检测按键的状态来控制 LED 灯的亮灭。程序的大致流程如下:
1. 初始化 GPIO 引脚,将第一个按键和第二个按键设置为输入模式,将八个 LED 灯设置为输出模式。
2. 进入一个无限循环,不断检测第一个按键和第二个按键的状态。
3. 如果第一个按键按下并且第二个按键松开,那么执行第一种流水灯,即依次点亮八个 LED 灯。
4. 如果第一个按键松开并且第二个按键按下,那么执行第二种流水灯,即依次灭掉八个 LED 灯,七个灯亮,一个灯灭。
5. 在每个 LED 灯点亮或者灭掉后,需要使用一个延时函数来控制 LED 灯的亮灭时间。
下面是一个简单的代码示例,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define BUTTON_PIN1 0
#define BUTTON_PIN2 1
#define LED_PIN1 2
#define LED_PIN2 3
#define LED_PIN3 4
#define LED_PIN4 5
#define LED_PIN5 6
#define LED_PIN6 7
#define LED_PIN7 8
#define LED_PIN8 9
int main(void)
{
wiringPiSetup();
pinMode(BUTTON_PIN1, INPUT);
pinMode(BUTTON_PIN2, INPUT);
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
pinMode(LED_PIN6, OUTPUT);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
while (1)
{
if (digitalRead(BUTTON_PIN1) == LOW && digitalRead(BUTTON_PIN2) == HIGH)
{
digitalWrite(LED_PIN1, HIGH);
delay(100);
digitalWrite(LED_PIN1, LOW);
digitalWrite(LED_PIN2, HIGH);
delay(100);
digitalWrite(LED_PIN2, LOW);
digitalWrite(LED_PIN3, HIGH);
delay(100);
digitalWrite(LED_PIN3, LOW);
digitalWrite(LED_PIN4, HIGH);
delay(100);
digitalWrite(LED_PIN4, LOW);
digitalWrite(LED_PIN5, HIGH);
delay(100);
digitalWrite(LED_PIN5, LOW);
digitalWrite(LED_PIN6, HIGH);
delay(100);
digitalWrite(LED_PIN6, LOW);
digitalWrite(LED_PIN7, HIGH);
delay(100);
digitalWrite(LED_PIN7, LOW);
digitalWrite(LED_PIN8, HIGH);
delay(100);
digitalWrite(LED_PIN8, LOW);
}
else if (digitalRead(BUTTON_PIN1) == HIGH && digitalRead(BUTTON_PIN2) == LOW)
{
digitalWrite(LED_PIN8, LOW);
delay(100);
digitalWrite(LED_PIN7, HIGH);
delay(100);
digitalWrite(LED_PIN7, LOW);
digitalWrite(LED_PIN6, HIGH);
delay(100);
digitalWrite(LED_PIN6, LOW);
digitalWrite(LED_PIN5, HIGH);
delay(100);
digitalWrite(LED_PIN5, LOW);
digitalWrite(LED_PIN4, HIGH);
delay(100);
digitalWrite(LED_PIN4, LOW);
digitalWrite(LED_PIN3, HIGH);
delay(100);
digitalWrite(LED_PIN3, LOW);
digitalWrite(LED_PIN2, HIGH);
delay(100);
digitalWrite(LED_PIN2, LOW);
digitalWrite(LED_PIN1, HIGH);
delay(100);
digitalWrite(LED_PIN1, LOW);
}
}
return 0;
}
```
需要注意的是,这个代码示例仅供参考,具体实现还需要考虑很多细节和特殊情况,比如按键的消抖、LED 灯的亮度控制等。如果你需要更详细的说明或者代码实现,可以告诉我具体的硬件和编程环境,我会尽力帮助你。
用at89c52 . 两个按键,第一个按键按下不松开,第二个按键松开,实现第一种流水灯, 八个 LED 依次点亮,每次亮一个;第一个按键松开,第二个按键按下不松开,实 现第二种流水灯,八个 LED 依次灭一个,七个亮,一个灭电路连接方式
以下是基于AT89C52实现上述功能的电路连接方式:
<img src="https://img-blog.csdnimg.cn/20211210150846401.png" width="600">
按键1接在P3.2引脚,按键2接在P3.3引脚。8个LED灯分别接在P0口的8个引脚。
程序代码如下:
```c
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit key1 = P3^2;
sbit key2 = P3^3;
void delay(uint xms) //延时函数
{
uint i, j;
for(i=xms; i>0; i--)
for(j=110; j>0; j--);
}
void main()
{
uchar i, j;
while(1)
{
if(key1 == 0) //第一个按键按下
{
while(key2 == 1) //等待第二个按键按下
{
for(i=0; i<8; i++)
{
P0 = ~(1<<i); //依次点亮
delay(100);
}
}
}
else if(key2 == 0) //第二个按键按下
{
while(key1 == 1) //等待第一个按键按下
{
for(i=7; i>=0; i--)
{
P0 = ~(1<<i); //依次灭去
delay(100);
}
}
}
else
{
P0 = 0xff; //熄灭所有LED灯
}
}
}
```
程序的逻辑如下:
当第一个按键按下后,程序进入循环,等待第二个按键按下。一旦检测到第二个按键按下,程序开始执行第一种流水灯的逻辑:依次点亮8个LED灯,每次只有一个亮。
当第二个按键按下后,程序进入循环,等待第一个按键按下。一旦检测到第一个按键按下,程序开始执行第二种流水灯的逻辑:依次灭去8个LED灯,每次只有一个灭。
当两个按键都没有按下时,所有LED灯都熄灭。
阅读全文