Arduino Mikrocontroller Tutorials - Module

LED Matrix mit MAX7419 Ansteuerung

Funktion Matrix LED Bild Matrix LED

Eine Matrix LED besteht aus 64 Leuchtdioden die in einem Raster angeordnet sind. Die Leds sind so verdrahtet, dass immer 8 LEDs in einer Reihe und 8 LEDs in einer Spalte miteinander verbunden sind. Möchte man eine bestimmte LED zum Leuchten bringen, muss man die entsprechende Reihe und die entsprechende Spalte in deren Kreuzungspunkt die LED liegt bestromen. Der Vorteil dieser Anordnung ist, dass die Matrix LED nur 16 Anschlüsse benötigt anstatt 64+GND wenn man die LEDs einzeln ansteuern wollte. Der Nachteil ist, dass man die LEDs gleichzeitig nicht unterschiedlich ansteuern kann. Zumindest nicht in den unterschiedlichen Reihen.

Ähnlich wie bei der 4x7-Segmentanzeige greifen wir daher auf das Multiplexen zurück. Diesmal wird das Multiplexen aber von einem IC außerhalb des Mikrocontrollers durchgeführt. Über eine Datenleitung wir die Anzeigeninformation vom µC an den MAX7219 übertragen und dann solange angezeigt, bis andere Anzeigendaten übertragen werden.

Der MAX7219 gibt über die Segment-Pins A-G und DP eine positive Spannung aus und an den Digit-Pins 0-7 wird GND geschaltet. Die Pinbezeichnungen kommen übrigens von 7-Segmentanzeigen, für deren Ansteuerung der MAX7219 ebenfalls verwendet werden kann. Über DIN, CLK und CS werden die Daten vom Arduino über die SPI Schnittstelle oder den shiftOut() Befehl an den MAX übertragen. An ISET wird ein Widerstand zum Einstellen der LED Helligkeit angeschlossen und an DOUT können weitere MAX7219 für zusätzliche Anzeigen kaskadiert angeschlossen werden.

Den MAX 7219 gibt es mit der Matrix LED als vorgefertigtes Bauteil. So sind nur die Eingänge CS, CLK und DIN für die SPI Übertragung und VCC und GND nach außen geführt. Zum Anschluss weiterer Anzeigen sind die Eingänge auf der Rückseite nochmal vorhanden (DIN natürlich dann durchgeschleift als DOUT).

Programmcode mit der Bibliothek LedControl.h

LedControl meineAnzeige = LedControl(DIN, CLK, CS, Anzahl Anzeigen)

Initialisieren eines LedControl Objektes mit Übergabe der Anschlusspins und der Anzahl der einzelnen 64'er Matrix LEDs.

shutdown(Anzeigen, true/fasle)

Mit 'true' geht das Display in den Schlafmodus, mit 'false' wird es aufgeweckt.

setIntensity(Anzeige, Helligkeit)

Die Helligkeit kann zwischen 0 und 15 vorgewählt werden

clearDisplay(Anzeige)

Befehl zum löschen aller LEDs der Anzeige

setLed(Anzeige, Reihe, Spalte, true/false)

Schalte die LED im Schnittpunkt der angegebenen Reihe und Spalte an oder aus.

setRow(Anzeige, Reihe, Byte)

Alle LEDs der gewählten Reihe werden anhand des Bytes an- oder ausgeschalten. Bsp. B00001111 = die ersten 4 LEDs werden aus- und die folgenden 4 eingeschalten. setRow() ist schneller als setColumn()

setColumn(Anzeige, Spalte, Byte)

Alle LEDs der gewählten Spalte werden anhand des Bytes an- oder ausgeschalten. Bsp. B00001111 = die ersten 4 LEDs werden aus- und die folgenden 4 eingeschalten.

#include "LedControl.h" // Objekt Anzeige initialisieren (DIN=7, CLK=6, CS=5, Anzeigen = eine) LedControl anzeige = LedControl(7, 6, 5, 1); void setup() { anzeige.shutdown(0, false); // (Anzeige, true/false) anzeige.setIntensity(0, 5); // (Anzeige, Wert 0-15) anzeige.clearDisplay(0); // (Anzeige) } void loop() { anzeige.setLed(0, 2, 2, true); // (Anzeige, Reihe, Spalte, true/false) anzeige.setRow(0, 6, B11111101); // (Anzeige, Reihe, Byte) anzeige.setColumn(0, 6, B11111101); // (Anzeige, Spalte, Byte) delay(500); }

Programmcode ohne Verwendung einer Bibliothek

Zur Clock-Frequenz findet sich im Datenblatt des MAX7219 nur Minimalwerte. Wir verwenden daher die shiftOut() Funktion zur Datenübertragung. Im Gegensatz zu SPI sind so die Anschlusspins flexibel wählbar. Bevor die Daten in den Max7219 geschoben werden muss CS (Latch) auf LOW gelegt werden. Nach der Übertragung wieder auf HIGH.

Zum Verändern der Matrix LED wird ein 16 Bit Code übertragen (2 Byte). Mit dem ersten Byte wird die Registeradresse ausgewählt die geändert werden soll. Mit dem zweiten Byte werde die Daten in das ausgewählte Register geschrieben. Beim MAX7219 lassen sich so 14 Register adressieren und verändern:

B00000000 (0) No Operation Wenn mehrere Anzeigen hintereinander angeordnet sind kann mit diesem Befehl eine Anzeige ohne Änderungen übersprungen werden.
B00000001 (1) Digit0 (Reihe 0) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000010 (2) Digit1 (Reihe 1) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000011 (3) Digit2 (Reihe 2) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000100 (4) Digit3 (Reihe 3) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000101 (5) Digit4 (Reihe 4) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000110 (6) Digit5 (Reihe 5) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00000111 (7) Digit6 (Reihe 6) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00001000 (8) Digit7 (Reihe 7) Die 8 LEDs einer Reihe werden in einem Byte angegeben (1= Led an, 0= Led aus)
B00001001 (9) Decode Mode Segmente (LEDs) der Digits 0-7 werden als Byte übertragen (0) oder als Nibble mit nur 4Bit
B00001010 (10) Intensity Register dient zum einstellen der LED Helligkeit (0-15)
B00001011 (11) Scan Limit Angabe wie viel Digits bzw. Reihen die Anzeige ansteuern muss (0-7)
B00001100 (12) Shutdown Versetzt die Anzeige in den Stromsparmodus (0) oder weckt diese auf (1)
B00001111 (14) Display Test Register zum Anzeigen aller LEDs (1). Ausschalten mit (0)
#define CS 5 #define CLK 6 #define DIN 7 void setup() { pinMode(CS, OUTPUT); digitalWrite(CS, HIGH); pinMode(CLK, OUTPUT); pinMode(DIN, OUTPUT); anweisungSenden(12, B00000001); // Anzeige aufwecken anweisungSenden(10, B00000001); // Helligkeit einstellen (0-15) anweisungSenden(11, B00000111); // Scan Limit Regster auf 8 Digits (Reihen) stellen for (int i = 1; i <= 8; i++) anweisungSenden(i, B00000000); // alle Reihen löschen } void loop() { anweisungSenden(1, B10011001); } void anweisungSenden(byte adresse, byte daten) { // ChipSelect auf LOW setzten digitalWrite(CS, LOW); // entsprechende Registeradresse senden shiftOut(DIN, CLK, MSBFIRST, adresse); // Daten übertragen shiftOut(DIN, CLK, MSBFIRST, daten); // Chip select wieder auf HIGH setzen digitalWrite(CS, HIGH); }