Как преобразовать данные для столбца в данные для строки для светодиодной матрицы

У меня есть светодиодная матрица 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 вправо, чтобы освободить место для следующего бита. После того как я закончил со строкой, я сдвигаю маску вправо, чтобы взять второй бит из значения в векторе. Результат, который я получаю, довольно странный, я не могу его объяснить, это совсем нехорошо. Что я делаю не так с маской и сменами? Надеюсь, я хорошо объяснил, что пытаюсь сделать. При необходимости я могу предоставить более подробную информацию. Спасибо.

, 👍3

Обсуждение

пожалуйста, опубликуйте весь код, @jsotola

почему вы не можете физически повернуть квадратную матрицу?, @dandavis


1 ответ


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);
}  
,