流水灯实验

上节课我们已经学习了如何点亮一颗 LED 并且让其闪烁,这节课我们学习如何制作流水灯。

硬件电路设计

物料清单(BOM 表):

材料名称 数量
直插式 LED 5
1kΩ 电阻 5
杜邦线(跳线) 若干
面包板 1

每一个 LED 的正极与开发板一个 GPIO 引脚相连,并串联一个电阻,负极接 GND,如下图:

当然你也可以选择只使用一个电阻:

软件程序设计

设计这个程序时,我们需要使用二维数组。

如果我们想让这个数码管某一引脚亮起来,那么我们需要给对应的引脚设置一个低电平。如果我们想要显示一个数字时,就需要让多个 LED 同时亮,比如数字 1 需要 b、c 引脚给低电平,其余引脚给高电平。程序可以这样写:

// 定义输出引脚并把所有引脚存到数组中
int pin_a = 4;
int pin_b = 5;
int pin_c = 19;
int pin_d = 21;
int pin_e = 22;
int pin_f = 2;
int pin_g = 15;
int pin_dp = 18;

int pin_array[8] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp};

// 定义数字显示逻辑的二维数组
int number_array[][8] = {
    {0, 0, 0, 0, 0, 0, 1, 1}, // 0
    {1, 0, 0, 1, 1, 1, 1, 1}, // 1
    {0, 0, 1, 0, 0, 1, 0, 1}, // 2
    {0, 0, 0, 0, 1, 1, 0, 1}, // 3
    {1, 0, 0, 1, 1, 0, 0, 1}, // 4
    {0, 1, 0, 0, 1, 0, 0, 1}, // 5
    {0, 1, 0, 0, 0, 0, 0, 1}, // 6
    {0, 0, 0, 1, 1, 1, 1, 1}, // 7
    {0, 0, 0, 0, 0, 0, 0, 1}, // 8
    {0, 0, 0, 0, 1, 0, 0, 1}, // 9
};

void setup() {
  // 设置所有引脚为输出模式,初始化所有引脚为高电平
  for (int i=0;i<8;i++){
    pinMode(pin_array[i], OUTPUT);
    digitalWrite(pin_array[i], HIGH);
    }
}

void loop() {
  // 显示数字
  int num = 8;
  for (int i=0;i<8;i++){
      digitalWrite(pin_array[i], number_array[num][i]);
      }
}

我们也可以使用函数来把显示数字的逻辑代码封装起来,方便我们在其他地方使用:

// 定义输出引脚并把所有引脚存到数组中
int pin_a = 4;
int pin_b = 5;
int pin_c = 19;
int pin_d = 21;
int pin_e = 22;
int pin_f = 2;
int pin_g = 15;
int pin_dp = 18;

int pin_array[8] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp};

// 定义数字显示逻辑的二维数组
int number_array[][8] = {
    {0, 0, 0, 0, 0, 0, 1, 1}, // 0
    {1, 0, 0, 1, 1, 1, 1, 1}, // 1
    {0, 0, 1, 0, 0, 1, 0, 1}, // 2
    {0, 0, 0, 0, 1, 1, 0, 1}, // 3
    {1, 0, 0, 1, 1, 0, 0, 1}, // 4
    {0, 1, 0, 0, 1, 0, 0, 1}, // 5
    {0, 1, 0, 0, 0, 0, 0, 1}, // 6
    {0, 0, 0, 1, 1, 1, 1, 1}, // 7
    {0, 0, 0, 0, 0, 0, 0, 1}, // 8
    {0, 0, 0, 0, 1, 0, 0, 1}, // 9
};

void display_number(int num){
  // 清屏
  for (int i=0;i<8;i++){
    digitalWrite(pin_array[i], HIGH);
    }

  // 改变对应引脚的电平;
  for (int i=0;i<8;i++){
      digitalWrite(pin_array[i], number_array[num][i]);
      }
  }

void setup() {
  // 设置所有引脚为输出模式,初始化所有引脚为高电平
  for (int i=0;i<8;i++){
    pinMode(pin_array[i], OUTPUT);
    digitalWrite(pin_array[i], HIGH);
    }
}

void loop() {
  // 显示数字
  for (int i=0;i<10;i++){
    display_number(i);
    delay(500);
    }
}