字节中的数字图案
本课属于 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);
挑战
中等初始代码包含除 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);
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
显示器与传感器中的所有课
自己练习: Arduino 在线编辑器