我正在 Arduino R4 Wifi 上进行编码,并尝试使用板载 8x12 LED 矩阵。 根据官方文档,可以将帧存储为字节数组:
uint8_t frame[8][12] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
或作为三个 32 位整数的数组:
unsigned long frame[] = {
0,
0,
0
};
后者显然具有更高的内存效率,但我无法弄清楚如何有效地操作其中的特定位。例如,如果我想使用字节数组打开最右边的列,我可以这样做:
for(int i = 0; i < 8; i++){
frame[i][12] = 1;
}
但是,我似乎无法找到一种有效的方法将相同的 for 循环映射到 long 数组。这是所需的映射:
i =
0 -> frame[0], position 20
1 -> frame[0], position 8
2 -> frame[1], position 28
3 -> frame[1], position 16
4 -> frame[1], position 4
5 -> frame[2], position 24
6 -> frame[2], position 12
7 -> frame[2], position 0
我能够想出这个循环:
for(int i = 0; i < 8; i++){
bitWrite(frame[(i+1)/3)], ((7-i) / 3) * 4) + (((7 - i) % 3) * 12), 1);
}
这显然很难看,而且计算效率似乎很低。它有效,但不太漂亮。
存储 12x8 位数组的最有效方法是 12 字节数组。
如:
uint8_t frame[12] = {};
您所需要的只是访问各个位的简单函数,例如:
// 假设 x 和 y 在范围内。 内联无效 led_on(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) frame[x] |= (1 << y); }
内联 void led_off(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) frame[x] &= ~(1 << y); }
内联 bool get_led(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) return (frame[x] & (1 << y)) != 0; }