如何将字节数组转换为Arduino LED矩阵的uint64_t?

3
我在这个网站上看到了将字节数组转换为uint64_t的方法,用于绘制字母A
我认为这种字节数组转换为uint64_t的方法可以减少代码大小,节省Arduino IC代码存储空间。

enter image description here

字节数组:

const byte IMAGES[][8] = {
{
  B00011000,
  B00100100,
  B01000010,
  B01111110,
  B01000010,
  B01000010,
  B01000010,
  B00000000
}};

uint64_t数组:

const uint64_t IMAGES[] = {
  0x004242427e422418
};   

如何将上面显示的字节数组转换为uint64_t,通过查看上面的LED矩阵图像而不使用任何工具(如this website)?

为什么不一开始就使用uint64_t,然后让编译器处理剩下的部分呢?一个好的编译器应该会将掩码移位优化为单字节写入。而且不要滥用标签。Arduino明显不是C语言,也不完全是C++。此外,B...不是有效的语法(除非你已经定义了256个符号常量或宏——你没有这样做,对吧?)。 - too honest for this site
2个回答

0
希望这个例子能对你有所帮助,转换的主要函数是void displayImage(uint64_t image)
// ARDUINO NANO
#include "LedControl.h"
LedControl lc = LedControl(4, 3, 2, 1);

const uint64_t IMAGES[] = {
  0x6666667e66663c00, // A
  0x3e66663e66663e00, // B
  0x3c66060606663c00  // C
};
const int IMAGES_LEN = sizeof(IMAGES) / sizeof(uint64_t);

void setup() {
  Serial.begin(9600);
  lc.shutdown(0, false);
  lc.setIntensity(0, 8);
  lc.clearDisplay(0);
}

void loop() {
  for (int i = 0; i < IMAGES_LEN; i++) {
    displayImage(IMAGES[i]);
    delay(1000);
  }
}

void displayImage(uint64_t image) {
  for (int i = 0; i < 8; i++) {
    byte row = (image >> i * 8) & 0xFF;
    Serial.println(row); // <- SHOW    
    for (int j = 0; j < 8; j++) {
      lc.setLed(0, i, j, bitRead(row, j));
    }
  }
  Serial.println("---");
}

0x8040201008040201

等同于

  B10000000, // 1
  B01000000, // 2
  B00100000, // 4
  B00010000, // 8
  B00001000, // 16 
  B00000100, // 32
  B00000010, // 64
  B00000001  // 128

在函数中,i 表示行,j 表示列,bitRead(x,n) 告诉你位置为 (i,j) 的 LED 灯应该是开还是关。
// ex. for the value 128 on a generic row
for (int j = 0; j < 8; j++) {
    Serial.println( bitRead(128, j));    
}

enter image description here


0

如果它是小端字节序

uint64_t IMAGE = 0;
for (int i = 0; i < (sizeof(byte) * 8); i++)
{
   IMAGE += ((uint64_t) byteIMAGE[i] & 0xffL) << (8 * i);
}

如果它是大端序

uint64_t IMAGE = 0;
for (int i = 0; i < (sizeof(byte) * 8); i++)
{
   IMAGE = (IMAGE << 8) + (byteIMAGE[i] & 0xff);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接