Как отобразить текст в матрицу 8x8 с 64-разрядными целыми числами?

arduino-mega c++ display led-matrix

У меня есть массив 64-разрядных целых чисел для отображения на светодиодной матрице 8x8

const int LEN1 = sizeof(Hours);
const uint64_t Hours[] = {
  0x00043c3c3c3c3c00,
  0x000c3c3c3c3c3c00,
  0x001c3c3c3c3c3c00,
  0x0000001818000000,
  0x0000001818100000,
  0x0000001818180000,
  0x00000018181c0000,
  0x000000181c1c0000,
  0x0000001c1c1c0000,
  0x0000041c1c1c0000,
  0x00000c1c1c1c0000
};

и вот у меня есть цикл для его отображения:

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

но я не могу использовать цикл таким образом, и я тоже не разбираюсь в принципах переключения байтов.

не могли бы вы, пожалуйста, объяснить, как работает описанный выше цикл, или помочь мне написать этот цикл следующим образом

const int LEN1 = sizeof(Hours);

void displayImage(Hours[]) {
  for (int i = 0; i < LEN1; i++) {
    //display Hours
    }
}

, 👍1

Обсуждение

речь идет о отображении текста на светодиодной матрице 8x8 с помощью arduino/, @gio xanchkava

на самом деле речь идет не о циклах в c++, было бы полезно более подробно рассказать об оборудовании, платформе и используемых библиотеках. Типы данных и библиотеки, по-видимому, являются основными проблемами здесь., @j0h

@jsotola, это вопрос для Arduino. речь идет об использовании функции Arduino " Print.print(num, HEX)", которая не имеет версии для типа uint64_t, поэтому ее необходимо заменить как минимум двумя печатями, а начальный 0 должен быть обработан, @Juraj

@Juraj тогда я, наверное, что-то упускаю ... я не вижу серийного кода.print в списке OP ... удалил мои комментарии, @jsotola

@jsotola, извините, некоторые библиотеки отображения реализуют печать базового класса, и ответ j0h смутил меня, заставив подумать, что это так в этом вопросе, @Juraj


1 ответ


Лучший ответ:

0

хорошо, но есть некоторые вещи, которых я не знаю о вашем коде и оборудовании, например, может ли библиотека LCD обрабатывать типы данных uint64_t. Я знаю, что функция Serial.print() может обрабатывать только до unit32_t, поэтому я использую ее.

Я думаю, что ваша переменная длины может быть неправильной длины, возможно, вы захотите добавить проверку на это в свой код. Большая часть кода Arduino составляет 8 бит.

void setup() {
Serial.begin(9600);
uint32_t b = 0x0;

const uint64_t Hours[] = {
  0x00043c3c3c3c3c00,
  0x000c3c3c3c3c3c00,
  0x001c3c3c3c3c3c00,
  0x0000001818000000,
  0x0000001818100000,
  0x0000001818180000,
  0x00000018181c0000,
  0x000000181c1c0000,
  0x0000001c1c1c0000,
  0x0000041c1c1c0000,
  0x00000c1c1c1c0000
};

//const int LEN1 = sizeof(Hours[0]);
const int LEN1 = sizeof(Hours)/sizeof(uint64_t);
       Serial.print("Length: ");
       Serial.println(LEN1);
 
   for (int i = 0; i < LEN1; i++) {
       b=Hours[i]>>16;
       Serial.println(b,HEX);
       }
}

void loop() {
}

Я думаю, что этот код будет делать то, что вы хотите, по крайней мере, так, как я его понимаю. остерегайтесь типов данных, с которыми может работать ваша библиотека ЖК-дисплеев.

,

ладно, я вижу, где я набрал этот код, но я устал и нервничаю, и мне пора домой. Но я все равно думаю, что это приблизит вас к тому, где вы хотите быть, @j0h