Хитрая выборка из массива

ustas
Offline
Зарегистрирован: 12.03.2012

Осваиваю светодиодную матрицу 8*32 (будет состоять из 4 одинаковых биколорных матриц 8х8). 

Сделал массив (одним битом кодирую строку в матрице, нечетные биты будут "рулить" красными светодиодами, четные - "зелеными", поэтому строка - 8 бит, по 2 бита на каждую физическую матрицу 8х8):

Тот байт, что выделен синей рамочкой выбирается просто: array[7-row][4]

Но вот так оказалось, что матрицу (саму физическую матрицу) мне на плате будет крайне неудобно ставить "согласно начертания массива" и ее придется повернуть на 90 градусов (естественно, это верно для всех 4-х составляющих результирующей большой матрицы).

Собственно, чтобы отображалось верно, нужно делать транспонирование данных для каждой матрицы 8х8, т.е. выбирать данные, которые выделены красной рамочкой.

Как можно этот "красный" байт выбрать?

tsostik
Offline
Зарегистрирован: 28.02.2013

Я думаю, что проще изменить сам массив так, чтобы каждый бат кодировал один столбец (при таких размерах все идеально подходит.)

olegab
Offline
Зарегистрирован: 09.04.2013

 

собрать байт из битов колонки можно примерно так:

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

}

 

 

 

ustas
Offline
Зарегистрирован: 12.03.2012

ну это понятно.. сейчас скетч у меня нормально выводит требуемое (ставлю единички и нолики куда надо в массиве ручками, вывод вот тут описал: http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-svetodiodnoi-matritsy#comment-29404).

Но вот когда начнется реальная работа (после того, как небольшие технические сложности устраню) - нужно будет делать уже программную часть по автоматическому формированию этого массива - вот тут будет круто.. из-за особенностей матрицы придется "городить" шрифт 5*8 (чтобы на 4 матрицах 8х8 получить 6 символов) и этот массив уже будет "весело" заполнять... а с учетом чередования байт (красный-зеленый) - еще веселее.. а если еще и массив "повернуть"... а потом еще и анимацию захочется (сдвигать всю строку по горизонтали или вертикали) - даже  жутковато становится... 

ustas
Offline
Зарегистрирован: 12.03.2012

olegab, спасибо! Сработало! (правда, вывелось зеркально, но тут помогло SPI.setBitOrder(MSBFIRST);)

olegab
Offline
Зарегистрирован: 09.04.2013

 

ustas пишет:

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

}

ustas
Offline
Зарегистрирован: 12.03.2012

ustas пишет:

ну это понятно.. сейчас скетч у меня нормально выводит требуемое (ставлю единички и нолики куда надо в массиве ручками, вывод вот тут описал: 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 за функцию - очень пригодилось.