Atmel AVR Mikrocontroller

Multiplexverfahren

LED Punktmatrix Display ansteuern

Ein LED Punktmatrix Display besteht aus einer Matrix von LEDs, welche in rechteckiger Form in Zeilen und Spalten angeordnet sind.

LED DisplayLED PinbelegungPunktmatrix Display

Abb: Pinbelegung 7x5 Punktmatrix Display KINGBRIGHT - TA12-11GWA

Über die Ansteuerung der entsprechenden Zeilen und Spalten kann somit jede beliebige Grafik dargestellt werden. Punktmatrix Displays gibt es in verschiedenen Ausführungen wie z.B. 7x5, 8x8, 7x15 etc. Die Abbildung zeigt ein 7x5 Display mit der entsprechenden Pinbelegung und LED-Anordnung.

Um nun alle LEDs dieses Displays ansteuern zu können werden die LEDs im Multiplexverfahren angesteuert. Möchte man alle LEDs des Displays über je eine Portleitung ansteuern, würden bei einem 7x5-Display insgesamt 35 Portpins dafür benötigt werden. Im Multiplexbetrieb wird in einer zeitlichen Abfolge eine LED (besser gesagt eine Spalte) nur für sehr kurze Zeit angesteuert. Da das menschliche Auge sehr träge auf eine Lichtänderung reagiert werden die Ein- und Ausschaltzeiten einer LED im Multiplexbetrieb nicht wahrgenommen.

Die zeitliche Abfolge von Ein- und Ausschaltzeit sollte hierbei mindestens 50Hz (20ms) besser 100Hz (10ms) betragen. Mit diesem Verfahren lassen sich sehr viele Portpins einsparen. Für jede Zeile und jede Spalte wird im Multiplexbetrieb nur je ein Portpin benötigt. D.h. für ein 7x5-Punktmatrix Display werden insgesamt 13 Portpins benötigt.

Wie in der Pinbelegung des Displays zu erkennen ist, sind die Kathoden aller LEDs mit den Zeilen R1 bis R7 und die Anoden mit den Spalten C1 bis C5 verbunden. Um beispielsweise die LED in der 1. Zeile und 1. Spalte anzusprechen, muss R1 mit einem Low- und C1 mit einem High-Signal angesteuert werden. Sollen z.B. alle LEDs der 2.Zeile leuchten, muss die Zeile R2 mit einem Low-Signal und alle Spalten (C1…C5) mit einem High-Signal angesteuert werden.

Da auch bei einem Punktmatrix Display einzelne LEDs angesteuert werden, muss der Strom über Vorwiderstände begrenzt werden. Werden hierbei größere Ströme benötigt als der Mikrocontroller liefern kann, müssen z.B. die Spalten über einen Treiber oder über Transistoren geschalten werden. Wird für eine LED beispielsweise ein Strom von 10mA benötigt, dann wird für das Zeichen C im 1. Schritt ein Strom von insgesamt 50mA in Spalte C1 benötigt, da in diesem Fall 5 LEDs gleichzeitig versorgt werden.

 

LED Punktmatrix

R = Zeile (engl. row)
C = Spalte (engl. column)

Schritt 1: R=1000001, C=01111

Schritt 2: R=0111110, C=10111

Schritt 3: R=0111110, C=11011

Schritt 4: R=0111110, C=01101

Schritt 5: R=1011101, C=11110

Die rasche Abfolge der Schritte 1 bis 5 ergibt letztendlich Schritt Nummer 6 und damit die Darstellung des Buchstaben C.

Punktmatrix Tabelle

Die folgende Schaltung zeigt die Beschaltung eines 7x5 Punktmatrix Displays. Die einzelnen Spalten werden über PNP-Transistoren (z.B. BC557) mit einem High-Signal über den Kollektor angesteuert während die Zeilen über 470Ω Widerstände über das PortD auf Masse gezogen werden. Die Basiswiderstände der Transistoren haben einen Wert von 1kΩ. Ein Low-Signal an der Basis des PNP-Transistors schalten die Kollektor-Emitter-Strecke des Transistors durch und versorgt damit die Spalten des Displays mit einem High-Signal.

Beschaltung eines 7x5 Punktmatrix Displays

Abb: Ansteuerung eines 7x5 Punktmatrix Displays

 

Im folgenden Programmbeispiel wird der Buchstabe C auf einem 5x7 Punktmatrix Display im Multiplexbetrieb dargestellt:

5x7 Punktmatrix Display

/* 
 * dotmatrix_1.c
 * ATmega88, F_CPU = 8MHz
 * Dotmatrix Display 5x7
 * Zeilen =  Kathode
 * Spalten = Anode
 *
 * D0 -|--|--|--|--|-
 * D1 -|--|--|--|--|-
 * D2 -|--|--|--|--|-
 * D3 -|--|--|--|--|-
 * D4 -|--|--|--|--|-
 * D5 -|--|--|--|--|-
 * D6 -|--|--|--|--|-  
 * D7 -|--|--|--|--|-
 *    C0 C1 C2 C3 C4
 */ 

#include <avr/io.h>
#include <util/delay.h>

#define Spalte_1 (PORTC = ~(1<<PC0))
#define Spalte_2 (PORTC = ~(1<<PC1))
#define Spalte_3 (PORTC = ~(1<<PC2))
#define Spalte_4 (PORTC = ~(1<<PC3))
#define Spalte_5 (PORTC = ~(1<<PC4))

int main(void)
{
 DDRC = 0xFF; // Spalten auf Ausgang
 DDRD = 0xFF; // Zeilen auf Ausgang
 
    while(1)
    {
	Spalte_1;
	PORTC = 0xC1; // 1100 0001
	_delay_ms(1);
	Spalte_2;
	PORTC = 0xBE; // 1011 1110
	_delay_ms(1);
	Spalte_3;
	PORTC = 0xBE; // 1011 1110
	_delay_ms(1);
	Spalte_4;
	PORTC = 0xBE; // 1011 1110
	_delay_ms(1);
	Spalte_5;
	PORTC = 0xDD; // 1101 1101
	_delay_ms(1);
	}
}

 

Suche