LED-Display DL-2416 / HDLO-2416

The Siemens DL-2416T, which was also manufactured by HP as HPDL-2416, is a four-digit LED display with an integrated driver for displaying numbers or text. The display is made with 16-segment LED displays with one decimal point each. Although the technology dates from the 1980s, these modules are still available from some dealers as new old stock with a production date from the late 1990s. The pin-compatible module HDLO-2416 by Broadcom can be used as a direct replacement and uses a 5×7 matrix and offers an extended character set in which the codes 0-31 are also assigned to national special characters and symbols.

My copies are some Siemens DL-2416Ts that I received as “new old stock” (NOS). According to the date code on the modules, they were produced in 1987 and are therefore around 34 years old.

Siemens DL-2416T

The following information is based on the information from the manufacturer’s data sheets.

Technical data

The operating voltage is +5 volts and the module works with TTL levels. Input voltages below 0.8 volts are interpreted as “low” or “0”, levels above 2 volts as “high” or “1”. Controlling them with the GPIO outputs of a Raspberry Pi or Arduino or Atmel AVR is no problem.

Depending on the number of LEDs lit at the same time, the power requirement is a maximum of 145 mA, which corresponds to 0.722 watts at 5 volts. If you combine four modules into a display with 16 characters, you have to reckon with almost 2.9 watts of maximum power consumption.

Case and pinout

The format of the pins corresponds to a wide DIL socket with a 2.54 mm pitch, but there are only 18 pins. Suitable sockets for this are usually not available. Therefore, you have to use single line socket headers for plug-in assembly.

On the models from HP, the position of pin 1 is indicated by a sloping corner in the lower longitudinal bar along the display. Siemens added the number “1” raised on the case opposite pin 1 on the right-hand side. But pin 1 is also on the bottom left when looking at the display from the front. The numbering of the character positions is exactly the opposite of what one would expect, position 3 is the first character, position 0 the last character on the display.


Pin Function Pin Function
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

Description of the pins

In the following description, 0 and 1 are used instead of “low” and “high”.

Pin Function Description
1 CE1 Chip Enable 1, needs to be set to 0 together with CE2 to activate the inputs
2 CE2 Chip Enable 2
3 CLR Clear – clears the content of the display
4 CUE Cursor Enable – activates the cursor
5 CU Cursor Select – activates writing the cursor positions
6 WR Write – write data
18 BL Blank – turn off the display
7-8 A0-A1 Address bus
11-17 D0-D6 Data bus

Controlling the display

The basic procedure for writing text in the display is as follows:

  1. Set WR, CLR, BL and CU to 1.
  2. Set CUE to 0.
  3. Set CE1 and CE2 to 0 to activate the module (if you only use one module you can connect these inputs to GND permanently).
  4. Set CLR to 1.
  5. Set A0-A1 and D0-D6 as needed.
  6. Set WR to 0 to get the data being used and the set WR to 1 again. According to the datasheet the shortest possible write cycle is, depending on the temperatur, between 60 ns (at -40°C) and 90 ns (at +85°C).

Clear the display content

When CLR is set to 0 for at least 1 μS, the current content of the display will be cleared.

Cursor control

The writing of the cursor positions can be activated via the CU input. In this case you specify the character position with A0 and A1 and with D0 whether the cursor (1) or the character (0) stored there should appear at the specified position. The information is stored with WR.

With CUE you can control whether the cursor symbol generally appears at the saved cursor positions (1) or not (0). A blinking cursor can be achieved by regularly changing CUE between 0 and 1.

Brightness control

In contrast to the HDSP-211x, the brightness cannot be adjusted via control parameters, but the display must be switched off and on at a sufficiently high frequency with a PWM signal at the BL input. The manufacturer specifies a frequency of at least 2.5 kHz so as not to disturb the internal signal processing. The duty cycle then determines the brightness. It is also possible to have the display blink at significantly lower frequencies (below 200 Hz).


The character set is limited to 64 characters from the ASCII character set. The table from the data sheet shows how it is shown on the display:

DL-2416 Zeichen

Extended character set of the HDLO-2416

The HDLO-2416 provides 32 additional characters with the code 0-31 as well as lower case letters and symbols in the range of 96-127. Below is the table from the Avago data sheet:

HLDO-2416 Zeichen

Controlling with an Arduino micro

For a test setup I connected two displays to an Arduino micro.

DL2416T connected to an Arduino micro

In the following sketch, the connections of the Arduino Micro are defined at the beginning, according to the numbers as they are indicated on the board of the Arduino. The wiring is not very complicated – you connect the lines A0, A1 as well as D0-D6 and WR from both modules in parallel to the corresponding outputs of the Arduino. CE1 of each module is connected to GND, CE2 to a separate output of the Arduino, so that the modules can be addressed individually when writing. The send_byte() function activates either the first or the second module as required, depending on which character position is specified. This allows two modules to be used together like one 8-character display.

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);
  digitalWrite(dlt_wr, LOW);
  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("        ");
  for(int i=0; i<output.length()-7; i++) {
    const char *outputBuf = output.c_str();

void loop()