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.
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.
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:
- WR, CLR, BL und CU auf 1 setzen.
- CUE auf 0 setzen.
- CE1 und CE2 auf 0 setzen um das Modul zu aktivieren (wenn man nur ein Modul betreibt, kann man diese Eingänge auch dauerhaft mit GND verbinden).
- A0-A1 und D0-D6 nach Bedarf setzen.
- 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:
D0-D3 → D4-D6 ↓ |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | ! | “ | # | $ | % | & | ‚ | ( | ) | * | + | , | – | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
Nachfolgend die Tabelle aus dem Datenblatt des Herstellers:
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.
D0-D3 → D4-D6 ↓ |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | ì | ↑ | → | ↓ | ← | ¿ | à | Ø | ∅ | ò | ù | ñ | ç | ê | É | é |
1 | è | Æ | æ | Å | å | Ä | ä | Ö | ö | Ü | ü | °C | °F | ß | £ | ¥ |
2 | ! | “ | # | $ | % | & | ‚ | ( | ) | * | + | , | – | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ‚ | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | ▒ |
Nachfolgend die Tabelle aus dem Datenblatt von Avago:
Ansteuerung mit dem Arduino micro
Für einen Testaufbau habe ich zwei Displays an einen Arduino micro angeschlossen.
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); }