Хитрая выборка из массива
- Войдите на сайт для отправки комментариев
Осваиваю светодиодную матрицу 8*32 (будет состоять из 4 одинаковых биколорных матриц 8х8).
Сделал массив (одним битом кодирую строку в матрице, нечетные биты будут "рулить" красными светодиодами, четные - "зелеными", поэтому строка - 8 бит, по 2 бита на каждую физическую матрицу 8х8):
Тот байт, что выделен синей рамочкой выбирается просто: array[7-row][4]
Но вот так оказалось, что матрицу (саму физическую матрицу) мне на плате будет крайне неудобно ставить "согласно начертания массива" и ее придется повернуть на 90 градусов (естественно, это верно для всех 4-х составляющих результирующей большой матрицы).
Собственно, чтобы отображалось верно, нужно делать транспонирование данных для каждой матрицы 8х8, т.е. выбирать данные, которые выделены красной рамочкой.
Как можно этот "красный" байт выбрать?
Я думаю, что проще изменить сам массив так, чтобы каждый бат кодировал один столбец (при таких размерах все идеально подходит.)
собрать байт из битов колонки можно примерно так:
byte getByte(byte bitNum, byte col){
byte mask=1;
if (bitNum>0) mask<<=bitNum;
return
(array[0][col]&mask?B10000000:0)|
(array[1][col]&mask?B1000000:0)|
(array[2][col]&mask?B100000:0)|
(array[3][col]&mask?B10000:0)|
(array[4][col]&mask?B1000:0)|
(array[5][col]&mask?B100:0)|
(array[6][col]&mask?B10:0)|
(array[7][col]&mask?1:0);
}
ну это понятно.. сейчас скетч у меня нормально выводит требуемое (ставлю единички и нолики куда надо в массиве ручками, вывод вот тут описал: http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-svetodiodnoi-matritsy#comment-29404).
Но вот когда начнется реальная работа (после того, как небольшие технические сложности устраню) - нужно будет делать уже программную часть по автоматическому формированию этого массива - вот тут будет круто.. из-за особенностей матрицы придется "городить" шрифт 5*8 (чтобы на 4 матрицах 8х8 получить 6 символов) и этот массив уже будет "весело" заполнять... а с учетом чередования байт (красный-зеленый) - еще веселее.. а если еще и массив "повернуть"... а потом еще и анимацию захочется (сдвигать всю строку по горизонтали или вертикали) - даже жутковато становится...
olegab, спасибо! Сработало! (правда, вывелось зеркально, но тут помогло SPI.setBitOrder(MSBFIRST);)
olegab, спасибо! Сработало! (правда, вывелось зеркально, но тут помогло SPI.setBitOrder(MSBFIRST);)
пожалуйста.
чтобы изменить порядок битов, нужно изменить очередность обработки строк массива:
byte getByte(byte bitNum, byte col){
byte mask=1;
if (bitNum>0) mask<<=bitNum;
return
(array[7][col]&mask?B10000000:0)|
(array[6][col]&mask?B1000000:0)|
(array[5][col]&mask?B100000:0)|
(array[4][col]&mask?B10000:0)|
(array[3][col]&mask?B1000:0)|
(array[2][col]&mask?B100:0)|
(array[1][col]&mask?B10:0)|
(array[0][col]&mask?1:0);
}
ну это понятно.. сейчас скетч у меня нормально выводит требуемое (ставлю единички и нолики куда надо в массиве ручками, вывод вот тут описал: http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-svetodiodnoi-matritsy#comment-29404).
Но вот когда начнется реальная работа (после того, как небольшие технические сложности устраню) - нужно будет делать уже программную часть по автоматическому формированию этого массива - вот тут будет круто.. из-за особенностей матрицы придется "городить" шрифт 5*8 (чтобы на 4 матрицах 8х8 получить 6 символов) и этот массив уже будет "весело" заполнять... а с учетом чередования байт (красный-зеленый) - еще веселее.. а если еще и массив "повернуть"... а потом еще и анимацию захочется (сдвигать всю строку по горизонтали или вертикали) - даже жутковато становится...
Глаза боятся, руки делают: http://www.youtube.com/watch?v=YcYIvSukPWQ
тут пока еще одна матрица (остальные просто лень подключать - уже работает полная адресация на 4 такие матрицы). Пока завел шрифт 5х8 и с помощью масок вывожу туда, куда надо (на видео это символ 2 (третий слева), поэтому справа и слева есть места.. уже работает, даже когда символ начинается на одной, а заканчивается на другой физической матрице.
Еще раз спасибо olegab за функцию - очень пригодилось.