Arduino 74HC595 Siebensegment Anzeige

Eine Siebensegmentanzeige besteht aus 7 einzelnen LED-Balken die einzeln angesteuert werden. Um hier eine Anzeige mit dem Arduino ansteuern zu können, werden in der Regel deshalb sieben Datenleitungen pro Einheit benötigt. Die I/O-Pins würden daher gerade mal für zwei Anzeigen ausreichen und alle 14 digitalen Pins wären belegt. In diesem Artikel zeigen wir, wie eine Siebensegmentanzeige effizient über ein Schieberegister mit nur drei Datenleitungen angesteuert wird.

Welche Anzeigen sind kompatibel?

In der Regel sind alle Siebensegmentanzeigen kompatibel, jedoch erspart man sich zusätzliche Bauteile, wenn Anzeigen verwendet werden, die eine gemeinsame Kathode (Minus-Pol) haben. Je nach Farbe und Versorgungspannung muss der Vorwiderstand entsprechend gewählt werden. Es reicht vollkommen aus, wenn ein Widerstand an der Kathode pro Anzeigeeinheit verwendet wird.

Das 74HC595 Schieberegister

Der 74HC595 Chip ist ein bekanntes Schieberegister mit acht digitalen Ausgängen. Es wird auch oft als Serial-to-Parallel Converter verwendet. Vom Arduino aus gehen zu diesem IC drei Datenleitungen (DS, ST_CP, SH_CP) und die Stromversorgung (5V, GND). Neben der "Multiplexer-Funktion" hat der IC aber auch ein weiteres tolles Feature, nämlich einen Überlauf-Pin. Damit können mehrere Schieberegister hintereinander angesteuert werden, was bedeutet, das z. B. mehrere Siebensegmentanzeigen über dieselben drei vorhandenen Datenleitungen angesteuert werden können.

Arduino 74HC595 Wiring

Die Verdrahtung

Neben der Stromversorgung von fünf Volt werden für das Schieberegister noch drei Datenleitungen benötigt. Auf der anderen Seite werden sieben Leitungen (+5V) an die Anoden der einzelnen Segmente angeschlossen. Hat die Anzeige auch einen Dezimalpunkt, so kann auch dieser über einen weiteren Ausgang vom Schieberegister angeschlossen werden. Die Kathoden sind in der Anzeige alle auf einem Pin zusammengeführt. An diesem Pin wird ein einfacher Vorwiderstand wie bei üblichen LEDs angeschlossen. Dieser Widerstand beträgt je nach gewünschter Helligkeit, Farbe und Betriebsspannung einen Wert zwischen 200 und 500 Ohm. In diesem Beispiel hat der Widerstand 470 Ohm. Die Pins für den Datenaustausch haben folgende Funktionen:
DS: Serieller Dateneingang
SH_CP: Wechselt dieser Pin auf ein HIGH, so rückt das zuvor übergebene Bit im Register um einen Speicherplatz weiter.
ST_CP: Wenn an diesem Pin ein HIGH anliegt, werden die zuvor in das Register geladene Bits an die Ausgänge übergeben.

Beispielcode

Der Beispielcode steuert eine einzelne Anzeige über das Schieberegister an. Dabei läuft ein einfacher Counter, der sekündlich von 9 auf 0 herunter zählt. Für jede Nummer muss ein Array erzeugt werden (int num_X[7]), was den binären Output am Schieberegister enthält. Je nach Zustand der Bits werden die einzelnen Segmente entsprechend geschaltet. Die Funktion [write_led()] arbeitet anschließend das gewünschte Array Bit für Bit ab und übergibt dieses an das Schieberegister. Neben den Zahlen kann man auch Arrays für Buchstaben definieren.

//More information at: https://www.aeq-web.com/

int sh_pin = 5; //SH_CP_PIN
int st_pin = 6; //ST_CP_PIN
int ds_pin = 7; //DS_PIN

//Define outputs for each number on 74HC959
int num_1[7] = {0, 0, 0, 1, 1, 0, 0};
int num_2[7] = {1, 0, 1, 1, 0, 1, 1};
int num_3[7] = {1, 0, 1, 1, 1, 1, 0};
int num_4[7] = {1, 1, 0, 1, 1, 0, 0};
int num_5[7] = {1, 1, 1, 0, 1, 1, 0};
int num_6[7] = {1, 1, 1, 0, 1, 1, 1};
int num_7[7] = {0, 0, 1, 1, 1, 0, 0};
int num_8[7] = {1, 1, 1, 1, 1, 1, 1};
int num_9[7] = {1, 1, 1, 1, 1, 0, 0};
int num_0[7] = {0, 1, 1, 1, 1, 1, 1};

void setup() {
  pinMode(st_pin, OUTPUT);
  pinMode(sh_pin, OUTPUT);
  pinMode(ds_pin, OUTPUT);
}

void loop () {
  write_led(num_9);
  delay(1000);
  write_led(num_8);
  delay(1000);
  write_led(num_7);
  delay(1000);
  write_led(num_6);
  delay(1000);
  write_led(num_5);
  delay(1000);
  write_led(num_4);
  delay(1000);
  write_led(num_3);
  delay(1000);
  write_led(num_2);
  delay(1000);
  write_led(num_1);
  delay(1000);
  write_led(num_0);
  delay(5000);


}

void write_led(int num[7]) {
  digitalWrite(st_pin, LOW);
  for (int i = 0; i < 8; i++) {
    digitalWrite(sh_pin, LOW);
    digitalWrite(ds_pin, num[i]);
    digitalWrite(sh_pin, HIGH);
  }
  digitalWrite(st_pin, HIGH);
}

Oft gelesen

Anzeige:

Social Media

Newsletter