Menu
CoddyTech

字节中的数字图案

本课属于 Coddy Arduino 学习旅程的“显示器与传感器”单元。第 2 课,共 24 课。

每个数字都要写 7 行 digitalWrite(),代码会很多。把每个数字存为一个模式:每一位表示一个段,1 表示点亮,0 表示熄灭。

byte 是由 8 位组成的整数,范围是 0 到 255。在前面加上 0b,就可以用二进制写出它。从右向左读取各位:最后一位是段 a,前一位是段 b,依此类推,直到 g。

//           gfedcba
byte one = 0b0000110;  // b 和 c:一个 1

数组可以存放 10 个模式,因此 digits[3] 就是数字 3 的模式。二进制计数器中的 bitRead() 可以读取其中的一位,从右侧开始计数,起始位置为 0:

bitRead(0b0000110, 0)  // 0:段 a 熄灭
bitRead(0b0000110, 1)  // 1:段 b 亮起

函数可以通过 for 循环遍历这 7 位,并设置每个段的引脚,因此只需调用一次,就能绘制任意数字:showDigit(7);

challenge icon

挑战

中等

初始代码包含除 4 和 7 以外的所有图案,而 loop() 会显示 1、4 和 7。

  • 填写 4(段 b、c、f、g)和 7(a、b、c)
  • 编写 showDigit(n):对于从 0 到 6 的每个 i,当 digits[n] 的第 i 位为 1 时,将 segmentPins[i] 设为 LOW;为 0 时设为 HIGH

按“运行”,然后按“检查”。

亲手试试

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// 每个数字对应一种模式,从右往左读:最后一位对应线段 a。
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b0000000,  // 4:请补全
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000000,  // 7:请补全
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  // 点亮 digits[n] 对应的线段,关闭其他线段
}

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
}

void loop() {
  showDigit(1);
  delay(1000);
  showDigit(4);
  delay(1000);
  showDigit(7);
  delay(1000);
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

显示器与传感器中的所有课

自己练习: Arduino 在线编辑器