Светодиодная матрица неправильно отображает данные со структурC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Светодиодная матрица неправильно отображает данные со структур

Сообщение Anonymous »

Я только начал работать со светодиодной матрицей (16*16) и attiny85.
Текущая цель — включить светодиод в каждой строке, где номер светодиода — это количество ряд (я знаю, что светодиодная лента похожа на змею, пока это не имеет значения).
Итак, я написал байтовую матрицу[16][16] и вручную поместите цифру в целевые ячейки. Это сработало хорошо. После этого я заменяю байтовую матрицу[16][16] на матрицу RGB[16][16], где struct rgb {byte r, byte g, byte b, и это не `работает неправильно (см. фотографии ниже).
Функции светодиода:

Код: Выделить всё

#define LED PB0
#define byte unsigned char

struct rgb {
byte r;
byte g;
byte b;
};

void setBitHigh(byte pin) {
PORTB |= _BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");

PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
}

void setBitLow(byte pin) {
PORTB |= _BV(pin); // 1 tactDuration
asm("nop");
asm("nop");

PORTB &= ~_BV(pin); // 1 tactDuration
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}

void trueByte(byte pin, byte intensity) {
for (int i = 7; i >= 0; i--) {
intensity & _BV(i) ? setBitHigh(pin) : setBitLow(pin);
}
}
void falseByte(byte pin) {
for (int i = 0; i < 8; i++) {
setBitLow(pin);
}
}

void setPixel(byte pin, rgb color) {
DDRB |= _BV(pin);

color.g > 0 ? trueByte(pin, color.g) : falseByte(pin);
color.r > 0 ? trueByte(pin, color.r) : falseByte(pin);
color.b > 0 ? trueByte(pin, color.b) : falseByte(pin);
}
хорошо работающий код:

Код: Выделить всё

void display(byte matrix[WIDTH][HEIGHT]) {
for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) {
for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) {
setPixel(LED, {matrix[rowIdx][cellIdx], 0, 0});
}
}
}

byte m[WIDTH][HEIGHT] = {
{ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
...
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15}
};

int main() {
display(m);
}
результат:
Изображение

Код НЕ работает хорошо:

Код: Выделить всё

void display(rgb matrix[WIDTH][HEIGHT]) {
for (byte rowIdx = 0; rowIdx < WIDTH; rowIdx++) {
for (byte cellIdx = 0; cellIdx < HEIGHT; cellIdx++) {
setPixel(LED, matrix[rowIdx][cellIdx]);
}
}
}

rgb m[WIDTH][HEIGHT] = {
{
{15, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0}
},
...
};

int main() {
display(m);
}
результат:
Изображение

Буду рад любому совету...

Подробнее здесь: https://stackoverflow.com/questions/782 ... structures
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»