Код скетча
// Выводы к микросхеме: данные, такт, выбор.
const int DIN = 23, CLK = 18, CS = 5;
// Регистры MAX7219. Разряды 1…8 — строки матрицы, остальное настройка.
const byte DECODE = 0x09, INTENSITY = 0x0A;
const byte SCANLIMIT = 0x0B, SHUTDOWN = 0x0C;
// Что горит: по байту на строку. Микросхема свои разряды прочитать не
// даёт, поэтому картинку скетч помнит сам.
byte rows[8];
// Слово в микросхему: адрес регистра и значение, старшим разрядом
// вперёд. Защёлкивается по возврату CS вверх — пока CS внизу, разряды
// просто едут дальше по цепочке.
void send(byte reg, byte value) {
digitalWrite(CS, LOW);
shiftOut(DIN, CLK, MSBFIRST, reg);
shiftOut(DIN, CLK, MSBFIRST, value);
digitalWrite(CS, HIGH);
}
void setup() {
pinMode(DIN, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);
send(SCANLIMIT, 7); // работают все восемь строк
send(DECODE, 0x00); // знакогенератор не нужен: здесь точки, а не цифры
send(INTENSITY, 8);
// После подачи питания микросхема выключена: скетч без этой строки
// работает правильно и не светит ничем.
send(SHUTDOWN, 1);
for (int row = 0; row < 8; row++) send(row + 1, 0);
}
void setLed(int row, int col, bool on) {
// Старший разряд байта — левый столбец: так разведены модули.
if (on) rows[row] |= 0x80 >> col;
else rows[row] &= ~(0x80 >> col);
send(row + 1, rows[row]);
}
void loop() {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
setLed(row, col, true);
delay(40);
}
}
// Строкой целиком — восемь точек за одну посылку вместо восьми.
for (int row = 0; row < 8; row++) {
rows[row] = 0;
send(row + 1, 0);
delay(60);
}
}