Текущая цель — включить светодиод в каждой строке, где номер светодиода — это количество ряд (я знаю, что светодиодная лента похожа на змею, пока это не имеет значения).
Итак, я написал байтовую матрицу[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