Alphanumeric Display DLR2416

At work, one of our HPU pump control cards died, the control card looks like this and hosts an interesting four-digit alphanumeric display:

Rexroth control card

So, out comes the Arduino and breadboard, and downloaded the datasheet for the display (readily available if you google “DLR2416 datasheet”).

This display has 7 data pins to receive ASCII code as per the table below, with two address pins to select the ‘segment’.

DLR2416 ASCII table

After a bit trial and error, and thanks to this website by a guy who successfully interfaced with a similar display, I managed to get some characters displayed. I used a 74HC595 shift register to push out the data to the DLR2416, plenty of example code on the Arduino site for help with that.

DLR2416 on breadboard DLR2416 Schematic

The above schematic doesn’t show the 1microfarad decoupling capacitor from data to ground, which was required to prevent the display sometimes showing erroneous characters.

I played about a bit more, added a temperature sensor and had it display the current temperature, and managed to have the display scroll text.

Soldered to a protoshield, with space for an additional display if I can find one:

Arduino prototyping shield Shield plugged into Arduino

See below for code. Need to get my hands on an additional display to play with!

– Wayne

2019: I obtained another display and used this project in my first Eagle Cad design. See below code for images. I have a few of these unpopulated PCBs available if anyone wants one, just send me a mail.

// DLR2416 Display Driver for Arduino UNO
// Code for using a 74HC595 Shift Register to
// drive Siemens DLR2416 intelligentdisplay 

int latchPin = 8;  //Pin connected to ST_CP of 74HC595
int clockPin = 12; //Pin connected to SH_CP of 74HC595
int dataPin = 11;  //Pin connected to DS of 74HC595

int digitSel0Pin = 5; // Pin connected to "A0 digital select" on display
int digitSel1Pin = 6; // Pin connected to "A1 digital select" on display 
int displayWritePin = 7;  // Pin connected to "WR Write" on display
int displaySelectPin = 3; // Pin connected to CS1 on display 0
                          // (we only have one display atm)

int tempSensPin = 0; // AI for temp sensor

// Functions
void displayChar(char, int);
void displayWord(String);
void scrollWord(String);

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(digitSel0Pin, OUTPUT);
  pinMode(digitSel1Pin, OUTPUT);
  pinMode(displayWritePin, OUTPUT); 
  pinMode(displaySelectPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
  //Select display 0 as we have no other display yet
  digitalWrite(displaySelectPin, LOW);
  
  scrollWord("   www.WarmCat.uk    ");
  delay(500);
  
  // **** Temp Sensor bit ****
  int tempReading = analogRead(tempSensPin);
  float voltage = tempReading*5.0;
  voltage /= 1024.0;
  float tempC = (voltage - 0.5)*100;
  // converting from 10 mv per degree with 500 mV offset to degrees
  // ((voltage - 500mV) times 100)
  
  int tempCint = tempC+0.5; // round to nearest whole number; convert to int
  // and then output to serial for test purposes
  Serial.print(tempCint); Serial.println(" degrees C"); 
  
  //put int into a string
  char tempChar[4];
  sprintf(tempChar, "%d .",tempCint);
  
  displayWord(tempChar); // display temp
  displayChar(0x1B,2);   //display degrees symbol 
  
  // display whirly thing for fun
  for (int spin=0; spin<10; spin++)
  {
    displayChar(0x5C,3); delay(50); 
    displayChar(0x7C,3); delay(50); 
    displayChar(0x2F,3); delay(50); 
    displayChar(0x2D,3); delay(50);
  }
}

void displayChar(char myChar, int myPos)
{
  switch (myPos)
  {
    case 3:
    digitalWrite(digitSel0Pin, LOW);
    digitalWrite(digitSel1Pin, LOW);
    break;
    case 2:
    digitalWrite(digitSel0Pin, HIGH);
    digitalWrite(digitSel1Pin, LOW);
    break;    
    case 1:
    digitalWrite(digitSel0Pin, LOW);
    digitalWrite(digitSel1Pin, HIGH);
    break;
    case 0:
    digitalWrite(digitSel0Pin, HIGH);
    digitalWrite(digitSel1Pin, HIGH);
    break;
  }
  // set shift register
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, myChar);
  digitalWrite(displayWritePin, LOW); delay(2);
  digitalWrite(latchPin, HIGH);
  digitalWrite(displayWritePin, HIGH);
}

void displayWord(String myString)
{
  for (int x = 0; x < 4; x++) {
    displayChar(myString.charAt(x),x);
  }
}

void scrollWord(String myString)
{
  int stringLength = myString.length(); // length of string?
  for (int x = 0; x<(stringLength -3); x++)
  {
    displayChar(myString.charAt(x),0); 
    displayChar(myString.charAt(x+1),1);
    displayChar(myString.charAt(x+2),2);
    displayChar(myString.charAt(x+3),3);
    delay(150);
  }
}
DLR2416 Display on Arduino
Old protoboard, new board, and pcb from rexroth valve.
Dual Display

9 thoughts on “Alphanumeric Display DLR2416

      1. Hi, oh that would be awesome. I think I figured out what to do with the schematics but either way it would be a big help for me and maybe for others. Thanks for documenting that display

        1. Uploaded to GitHub, I don’t have an Arduino and the project with me at the moment, and it’s been 8 years since I wrote this, so my memory isn’t great!
          Looks like I didn’t get round to writing any functions for scrolling over two displays, however the basic function for two displays is right at the bottom of the code.
          At the top of the code you can see I’ve connected each display’s CS1 pin to the Arduino:
          // Pin connected to CS1 on left display
          int displayLeftPin = 4;
          // Pin connected to CS1 on right display
          int displayRightPin = 3;

          Hope this helps!
          https://github.com/WarmCatUK/DLR2416/blob/main/DLR2416_dual_testing.ino

Leave a Reply to Tom Cancel reply

Your email address will not be published. Required fields are marked *