LED-Display DL-2416 / HDLO-2416

Das Siemens DL-2416T was auch von HP als HPDL-2416 hergestellt wurde, ist ein vierstelliges LED-Display mit integriertem Treiber zur Darstellung von Zahlen oder Text. Die Darstellung erfolgt mit 16-Segment-LED-Anzeigen mit je einem Dezimalpunkt. Obwohl die Technik aus den 1980er Jahren stammt, bekommt man diese Module auch heute noch als als Restbestand mit Produktionsdatum aus den späten 1990er Jahren noch bei manchen Händlern. Das pinkompatible Modul HDLO-2416 von Broadcom kann als direkter Ersatz verwendet werden und nutzt eine 5×7-Matrix und bietet einen erweiterten Zeichensatz, bei dem auch die Codes 0-31 mit nationalen Sonderzeichen und Symbolen belegt sind.

Bei meinen Exemplaren handelt es sich um einige Siemens DL-2416T, die ich als „new old stock“ (NOS) – also lange gelagerte Neuware – in sehr gutem Zustand bekommen habe. Laut Aufdruck wurden die Module im Jahr 1987 produziert und sind damit rund 34 Jahre alt.

Siemens DL-2416T

Die nachfolgenden Informationen basieren auf den Angaben aus den Datenblättern der Hersteller.

Technische Daten

Die Betriebsspannung beträgt +5 Volt und das Modul arbeitet mit TTL-Pegeln. Eingangsspannungen unter 0,8 Volt werden als „Low“ oder „0“ interpretiert, Pegel über 2 Volt als „High“ bzw. „1“. Damit ist auch die Ansteuerung mit den GPIO-Ausgängen eines Raspberry Pi oder Arduino bzw. Atmel AVR kein Problem.

Abhängig von der Anzahl der gleichzeitig leuchtenden LEDs liegt der Strombedarf bei maximal 145 mA was bei 5 Volt rechnerisch 0,722 Watt entspricht. Kombiniert man vier Module zu einer Anzeige mit 16 Zeichen, muss man mit knapp 2,9 Watt maximalem Strombedarf rechnen.

Gehäuse und Anschlussbelegung

Das Format der Pins entspricht einem breiten DIL-Sockel mit 2,54 mm Rastermaß, es sind aber nur 18 Pins vorhanden. Passende Sockel dafür sind in der Regel nicht zu bekommen. Daher muss man bei Steckmontage auf Buchsenleisten zurückgreifen.

Die Position von Pin 1 ist bei HP durch eine schräge Ecke im Längsbalken unterhalb des Displays gekennzeichnet. Bei Siemens ist die Ziffer „1“ gegenüber von Pin 1 auf der rechten Seite  erhaben auf dem Gehäuse. Pin 1 ist aber auch hier links unten, wenn man von vorne auf das Display sieht. Die Numerierung der Zeichenpositionen ist genau umgekehrt, wie man es erwarten würde, Position 3 ist das erste Zeichen, Position 0 das letzte Zeichen auf dem Display.

DL-2416

Pin Funktion Pin Funktion
1 CE1 18 BL
2 CE2 17 D4
3 CLR 16 D5
4 CUE 15 D6
5 CU 14 D3
6 WR 13 D2
7 A1 12 D1
8 A0 11 D0
9 VCC 10 GND

Beschreibung der Pins

In der nachfolgenden Beschreibung wird statt „Low“ und „High“ jeweils 0 und 1 verwendet.

Pin Funktion Beschreibung
1 CE1 Chip Enable 1, muss zusammen mit CE2 auf 0 sein, um die Eingänge zu aktivieren
2 CE2 Chip Enable 2
3 CLR Clear – löscht den Inhalt des Displays
4 CUE Cursor Enable – Aktiviert den Cursor
5 CU Cursor Select – Aktiviert das Schreiben der Cursorpositionen
6 WR Write – Daten schreiben
18 BL Blank – schaltet die Display-Anzeige aus
7-8 A0-A1 Adressbus
11-17 D0-D6 Datenbus

Ansteuerung

Die grundsätzliche Vorgehensweise für das Schreiben von Text in das Display ist wie folgt:

  1. WR, CLR, BL und CU auf 1 setzen.
  2. CUE auf 0 setzen.
  3. CE1 und CE2 uf 0 setzen um das Modul zu aktivieren (wenn man nur ein Modul betreibt, kann man diese Eingänge auch dauerhaft mit GND verbinden).
  4. CLR auf 1 setzen
  5. A0-A1 und D0-D6 nach Bedarf setzen.
  6. WR kurz auf 0 setzen, damit die Daten übernommen werden, dann WR wieder auf 1 setzen. Laut Datenblatt ist der kürzest mögliche Schreibzyklus temperaturabhängig zwischen 60 ns (bei -40°C) und 90 ns (bei +85°C).

Displayinhalt löschen

Wenn CLR für mindestens 1 μS auf 0 gesetzt wird, wird der aktuelle Inhalt des Displays  und die gespeicherten Cursorpositionen gelöscht.

Cursorsteuerung

Über den Eingang CU kann man das Schreiben der Cursorpositionen aktivieren.  In diesem Fall gibt man mit A0 und A1 die Zeichenposition an und mit D0, ob an der angegebenen Position der Cursor (1) oder das dort gespeicherte Zeichen (0) erscheinen soll. Mit WR wird die Information übernommen.

Mit CUE steuert man, ob an den gespeicherten Cursor-Positionen generell das Cursor-Symbol erscheint (1) oder nicht (0). Einen blinkenden Cursor erreicht man dadurch, dass CUE regelmäßig zwischen 0 und 1 gewechselt wird.

Helligkeitssteuerung

Im Gegensatz zum HDSP-211x ist die Helligkeit nicht über Steuerparameter einstellbar, sondern man muss an den Eingang BL mit einem PWM-Signal das Display in ausreichend hoher Frequenz aus- und einschalten. Der Hersteller gibt dazu eine Frequenz von mindestens 2,5 kHz an, um die interne Signalverarbeitung nicht zu stören. Das Tastverhältnis bestimmt dann die Helligkeit. Das Display mit deutlich niedrigeren Frequenzen (unter 200 Hz) blinken zu lassen, ist auch möglich.

Zeichensatz

Der Zeichensatz ist auf 64 Zeichen aus dem ASCII-Zeichensatz beschränkt. Die Tabelle aus dem Datenblatt zeigt die Darstellung, wie sie auf dem Display erfolgt:

DL-2416 Zeichen

Erweiterter Zeichensatz des HDLO-2416

Beim HDLO-2416 werden 32 zusätzliche Zeichen mit den Codes 0-31 sowie Kleinbuchstaben und Symbole im Bereich 96-127 bereitgestellt. Nachfolgend die Tabelle aus dem Datenblatt von Avago:

HLDO-2416 Zeichen

Ansteuerung mit dem Arduino micro

Für einen Testaufbau habe ich zwei Displays an einen Arduino micro angeschlossen.

DL2416T an einem Arduino Micro

Im folgenden Sketch dafür sind am Anfang sind die Anschlüsse des Arduino Micro definiert, entsprechend der Nummern, wie sie auf der Platine des Arduino angegeben sind. Die Verkabelung ist nicht sehr kompliziert – man verbindet die Leitungen A0, A1 sowie D0-D6 und WR von beiden Modulen parallel an die entsprechenden Ausgänge des Arduino. CE1 jedes Moduls ist mit GND verbunden, CE2 jeweils an einem separaten Ausgang des Arduino, so dass beim Schreiben die Module einzeln adressiert werden können. Die Funktion send_byte() aktiviert je nach Bedarf entweder das erste oder das zweite Modul, abhängig davon, welche Zeichenposition angegeben ist. Dadurch können zwei Module zusammen wie ein Display mit 8 Zeichen benutzt werden.

int dlt_a0 = 3;
int dlt_a1 = 4;
int dlt_d0 = 6;
int dlt_d1 = 7;
int dlt_d2 = 8;
int dlt_d3 = 9;
int dlt_d4 = 12;
int dlt_d5 = 11;
int dlt_d6 = 10;
int dlt_wr = 5;
int dlt_ce1 = A4;
int dlt_ce2 = A3;

int e_pulse = 1;

void setup()
{
  pinMode(dlt_a0, OUTPUT);
  pinMode(dlt_a1, OUTPUT);
  pinMode(dlt_d0, OUTPUT);
  pinMode(dlt_d1, OUTPUT);
  pinMode(dlt_d2, OUTPUT);
  pinMode(dlt_d3, OUTPUT);
  pinMode(dlt_d4, OUTPUT);
  pinMode(dlt_d5, OUTPUT);
  pinMode(dlt_d6, OUTPUT);
  pinMode(dlt_wr, OUTPUT);
  pinMode(dlt_ce1, OUTPUT);
  pinMode(dlt_ce2, OUTPUT);
  
  digitalWrite(dlt_wr, HIGH);
  digitalWrite(dlt_ce1, HIGH);
  digitalWrite(dlt_ce2, HIGH);
}

void send_byte(int chip, int data, int adr)
{
  if(data & 0x01) digitalWrite(dlt_d0, HIGH);else digitalWrite(dlt_d0, LOW);
  if(data & 0x02) digitalWrite(dlt_d1, HIGH);else digitalWrite(dlt_d1, LOW);
  if(data & 0x04) digitalWrite(dlt_d2, HIGH);else digitalWrite(dlt_d2, LOW);
  if(data & 0x08) digitalWrite(dlt_d3, HIGH);else digitalWrite(dlt_d3, LOW);
  if(data & 0x10) digitalWrite(dlt_d4, HIGH);else digitalWrite(dlt_d4, LOW);
  if(data & 0x20) digitalWrite(dlt_d5, HIGH);else digitalWrite(dlt_d5, LOW);
  if(data & 0x40) digitalWrite(dlt_d6, HIGH);else digitalWrite(dlt_d6, LOW);

  if(adr & 0x01) digitalWrite(dlt_a0, HIGH);else digitalWrite(dlt_a0, LOW);
  if(adr & 0x02) digitalWrite(dlt_a1, HIGH);else digitalWrite(dlt_a1, LOW);
  if(adr < 4) {
     digitalWrite(dlt_ce1, HIGH);
     digitalWrite(dlt_ce2, LOW);
  } else {
    digitalWrite(dlt_ce1, LOW);
    digitalWrite(dlt_ce2, HIGH);
  }
  delay(e_pulse);
  digitalWrite(dlt_wr, LOW);
  delay(e_pulse);
  digitalWrite(dlt_wr, HIGH);
}

void send_text(const char* text)
{
  int n=strlen(text);
  if(n>8) n=8;
  char buf[]="        ";
  strncpy(buf, text, n);
  for(int i=0; i<8; i++) send_byte(0, buf[i], 7-i);
}

void scroll_text(const char* text)
{
  String output;
  output.concat("        ");
  output.concat(text);
  output.concat("        ");
  for(int i=0; i<output.length()-7; i++) {
    const char *outputBuf = output.c_str();
    send_text(&outputBuf[i]);
    delay(250);
  }
}

void loop()
{
  send_text("HELLO!");
  delay(4000);
  scroll_text("THESE ARE TWO DL2416T CONTROLLED BY AN ARDUINO MICRO");
  delay(1000);
  scroll_text("!\"#$%&'<>*+,-/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
  delay(1000);
}