Мы предприняли попытку разобраться как устроены 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,