Как преобразовать данные для столбца в данные для строки для светодиодной матрицы
У меня есть светодиодная матрица 8х8. Я использую библиотеку LedControl.h для управления матрицей, которая имеет 3 способа подсветки светодиодов: setLed, setRow и setColumn. Я обнаружил, что setColumn очень медленный, он использует setLed для печати столбцов. Со всем моим кодом я могу печатать только 3 раза в секунду с помощью setColumn. Функция setRow намного быстрее, я предполагаю, что дизайн матрицы позволяет печатать строки напрямую. Я могу печатать более 10 раз в секунду с помощью setRow, поэтому я должен использовать его, так как скорость имеет решающее значение для моего проекта. В моем коде данные, которые я должен распечатать, хранятся в массиве из 8 байт. Вот как это выглядит, когда я использую setColumn
for(int i = 7; i >= 0; i--)
lc.setColumn(0, i, vector[i]);
i-это строка для печати, а vector[i] - байтовое значение, указывающее, какие светодиоды должны быть включены или выключены. Столбец 0-самый левый, а столбец 7-самый правый, поэтому я перехожу от 7 к 0, чтобы печатать справа налево, потому что это то, что я должен делать. Моя цель-каким-то образом преобразовать данные в vector[i], в данные, которые я могу использовать с помощью setRow. Так вот что я делал до сих пор.
byte mask = 128, x;
for (int j = 0; j < 8; j++){
x = 0;
for(int p = 0; p < 8; p++){
x = x | (valueVector[p] & mask);
if (p != 7)
x = x >> 1;
}
if (j != 7)
mask = mask >> 1;
lc.setRow(0, j, x);
}
Теперь я печатаю строки от строки 0 до строки 7, сверху вниз. Поскольку я печатаю сверху вниз, это означает, что я должен взять последний бит каждого столбца (последний бит каждого элемента в векторе) и поместить его в байтовую переменную. Я думал сделать байтовую маску = 128 (b1000000, сделать a И логику между маской и векторным значением, чтобы взять бит, который я ищу, а затем сделать a ИЛИ поместить бит в x-байт. После каждой операции маски я сдвигаю переменную x вправо, чтобы освободить место для следующего бита. После того как я закончил со строкой, я сдвигаю маску вправо, чтобы взять второй бит из значения в векторе. Результат, который я получаю, довольно странный, я не могу его объяснить, это совсем нехорошо. Что я делаю не так с маской и сменами? Надеюсь, я хорошо объяснил, что пытаюсь сделать. При необходимости я могу предоставить более подробную информацию. Спасибо.
@Oros Tom, 👍3
Обсуждение1 ответ
Вы используете маску 10000000
. С каждой итерацией внешнего цикла 1
в маске сдвигается вправо. 01000000
-> 00100000
-> 00010000
. Допустим, у нас на 2-й итерации маска равна 01000000
. x = x | (valueVector[p] & mask);
берет 2-й бит (отсчитывается слева) и устанавливает его на 2-ю позицию в значении x. Но эта позиция содержит бит с последней итерации (так как вы переместили его в эту позицию).
Возможное решение: (У меня нет компилятора под рукой. Так что, надеюсь, это правильно. ;-)
byte x;
for ( int j=0; j<8; j++ )
{
x = 0;
for ( int p=0; p<8; p++ )
x = x | ((valueVector[p] & (1 << p)) >> p);
lc.setRow(0, j, x);
}
- Проверить переключатель уровня с помощью Arduino и некоторых данных
- Светодиод, управляемый Midi через USB
- Использовать светодиод или подтягивающий резистор для предотвращения «плавания» или «фантомного изображения» матричной клавиатуры?
- Проблема с SPI при использовании трансивера RF24 NRF24L01 со светодиодной матрицей MD_MAX72xx
- Назначение светодиодного индикатора
- FastLED не работает должным образом
- подключение светодиода к DHT и кодовой комбинации
- FastLED-driven strip ведет себя странно при использовании PN532
пожалуйста, опубликуйте весь код, @jsotola
почему вы не можете физически повернуть квадратную матрицу?, @dandavis