Arduino Mikrocontroller Tutorials - Module

7-Segment-Anzeige

7 Segmentanzeige 7 Segmentanzeige

Eine 7-Segmentanzeige besteht aus sieben Segmenten (a bis g). Je nach Beleuchtung der einzelnen Segmente können Zahlen und einige Buchstaben dargestellt werden. Oft ist noch ein Dezimalpunkt (DP) als achtes Segment vorhanden. Hinter jedem Segment steckt eine kleine Leuchtdiode die über einen Widerstand bestromt werden kann.

7-Segmentanzeigen gibt es mit gemeinsamer Kathode (common cathode) oder gemeinsamer Anode (common anode). Häufiger ist die Common Cathode Variante mit gemeinsamer Masse. Im Datenblatt ist die Spannung für die volle Leuchtstärke mit 2V und einer resultierenden Stromstärke von 20mA angegeben (pro Segment!).

Schaltung und Programmcode

Mit einem 300Ω Vorwiderstand vor jedem Segment ergibt sich eine Segmentspannung von 1,8V und einer Stromstärke von 10mA für jedes leuchtende Segment.

7 Segmentanzeige

Ansteuerung über Funktionen

Die Ansteuerung der 8 Segment-LEDs kann über Funktionen realisiert werden. Mit anzeige_6() wird beispielsweise folgende Funktion aufgerufen:

void anzeige_6() { digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); }
Vollständiger Programmcode mit Funktionen

Den Funktionen wird noch ein Argument mitgegeben. '0' bedeutet Anzeige ohne Dezimalpunkt, '1' mit DP

// Pinbelegung der Segmente #define segA 2 #define segB 3 #define segC 4 #define segD 5 #define segE 6 #define segF 7 #define segG 8 #define segDP 9 void setup() { for (int i = 2; i <= 9; i++) pinMode(i, OUTPUT); } void loop() { anzeige_0(1); delay(1000); anzeige_1(0); delay(1000); anzeige_2(1); delay(1000); anzeige_3(0); delay(1000); anzeige_4(1); delay(1000); anzeige_5(0); delay(1000); anzeige_6(1); delay(1000); anzeige_7(0); delay(1000); anzeige_8(1); delay(1000); anzeige_9(0); delay(1000); } // FUNKTIONEN ZUM ANZEIGEN DER ZAHLEN void anzeige_AUS() { digitalWrite(segA, LOW); digitalWrite(segB, LOW); digitalWrite(segC, LOW); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); digitalWrite(segDP, LOW); } void anzeige_0(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, LOW); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_1(bool dp) { digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_2(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, LOW); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, LOW); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_3(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_4(bool dp) { digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_5(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_6(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_7(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_8(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); } void anzeige_9(bool dp) { digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); digitalWrite(segDP, LOW); if (dp == 1) digitalWrite(segDP, HIGH); }

Ansteuerung über ein Byte-Array

Die Ansteuerung der 8 Segmente kann auch über ein Byte erfolgen. Das MSB Bit kann man als Segment A definieren. Das zweite Bit von links ist dann das B-Segment, usw. Das Bit ganz rechts, das LSB kennzeichnet den Zustand des Dezimalpunktes. Steht das jeweilige Bit auf 1 soll die LED leuchten, bei 0 soll das Segment aus sein. Bei B11111110 würde dann eine 8 ohne DP angezeigt.

// Pinbelegung: A=2|B=3|C=4|D=5|E=6|F=7|G=8|DP=9 int segmentPins[] = {2,3,4,5,6,7,8,9}; // Definition der Zahlen (A B C D E F G DP) const byte zahlen[] = { B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B10111110, // 6 B11100000, // 7 B11111110, // 8 B11110110}; // 9 void setup () { for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT); } void loop() { Anzeigen(5); } // Funktion zum Anzeigen void Anzeigen (byte z) { byte zahl = zahlen[z]; for (int i = 0; i < 8; i++) { digitalWrite(segmentPins[i], bitRead(zahl, 7 - i)); } } // Funktion zum Löschen void Clear () { for (int i = 0; i < 8; i++) digitalWrite(segmentPins[i], LOW); }