Мы предприняли попытку разобраться как устроены Arduino библиотеки для светодиодных индикаторов размером 8х8 с драйвером светодиодов MAX7219, и написали программу, следуя datasheet MAX7219, с использованием только функции shiftOut() из стандартной Arduino библиотеки.

Данные загружаются в микросхему MAX7219 по 16 бит. Первый байт загружаемого двухбайтового слова содержит адрес регистра, в который загружаются данные, а второй байт - это собственно данные. В MAX7219 имеется 14 8-ми битных регистров. Восемь из них управляют сегментами подключённого к микросхеме индикатора (светодиодами в матрице), а остальные регистры имеют служебный характер.

Данные загружаются в 16-ти битный сдвиговый регистр микросхемы MAX7219 через ножку DIN синхронно с сигналом CLK. Защёлкиваются эти данные и принимаются к дальнейшей обработке по переднему фронту сигнала на ножке LOAD (CS).

int dataPin = 12;                                    // DIN 
int clockPin = 11;                                   // CLK
int csPin = 10;                                      // LOAD (CS)

void setup() {
  pinMode(csPin , OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

// Регистр No-op не принимать данные
// shiftOut(dataPin, clockPin, MSBFIRST, 0);         // адрес

// Данные 0 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 1);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00111000); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 1 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 2);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b01000100); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 2 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 3);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10011000); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 3 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 4);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10100101); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 4 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 5);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10100101); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 5 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 6);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b10011001); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 6 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 7);          // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b01000010); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Данные 7 строка
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 8); // адрес
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00111100); // Данные (8 бит)
  digitalWrite(csPin, HIGH);
// Decode Mode
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 9);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000); // No decode (8 бит)
  digitalWrite(csPin, HIGH);
// Intensity
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 10);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000111); // 15/32 (4 бита)
  digitalWrite(csPin, HIGH);
// Scan Limit
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 11);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000111); // 8 строк (3 бита)
  digitalWrite(csPin, HIGH);
// Shutdown
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 12);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001); // (1 бит)
  digitalWrite(csPin, HIGH);
// Display Test
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 15); //
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001); // Тест (1 бит)
  digitalWrite(csPin, HIGH);
  delay(3000);
// Display Test
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 15); //
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000); // No Test
  digitalWrite(csPin, HIGH);
}

void loop() {
// Shutdown
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 12);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000); // (1 бит)
  digitalWrite(csPin, HIGH);
  delay(1000);
  // Shutdown
  digitalWrite(csPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, 12);
  shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001); // (1 бит)
  digitalWrite(csPin, HIGH);
  delay(3000);
}

Скетч 1. Программа отображает на матричном LED дисплее мигающий символ @.

Программа скетч 1 загружает битовый образ символа @ в регистры микросхемы MAX7219, загружает настройки в служебные регистры, тестирует светодиоды дисплея 3 сек. и мигает символом @.

Рис. 1. Плата с микроконтроллером ATtiny88 и модуль с микросхемой MAX7219 и LCD матрицей 1088AS.

Ссылки: 
Как работать с драйверами индикаторов MAX7219 и MAX7221,