Displays_DL is a brand new, highly optimized library belonging to our display driver ecosystem. It brings full software integration for intelligent vintage alphanumeric LED matrix modules, specifically the Siemens / Osram / Litronix DL1416, DL2416, and DL2416T series. These legendary components from the late 80s and early 90s are famous for their unique built-in magnifying optics, brilliant retro aesthetic, and industrial look.
Architecture: Zero CPU Overhead
Unlike raw LED matrices that require constant high-frequency software multiplexing from the microcontroller, the DL intelligent series incorporates an on-board ASCII decoder, character generator (ROM), and internal static RAM. Once data is written to a digit position, the display logic stores it internally and maintains the segment illumination automatically. Therefore, the library does not utilize any background hardware timers or interrupt service routines (ISR) — leaving your main Arduino loop() completely free to process sensor logic or complex calculations.
Key Features
- Universal Form Factor Support: Tailored to fit full-featured 18/22-pin variants (DL2416/T) as well as the streamlined 14-pin modules (DL1416). Missing hardware control pins can simply be bypassed in the constructor by passing a
255placeholder flag. - Dual Communication Modes: Features the
Displays_DL(Raw) class for high-speed direct parallel bus writing over standard GPIO pins, and the pin-savingDisplays_DL_Shiftclass, which offloads the 7-bit data bus to a single 74HC595 shift register, saving 4 precious MCU pins. - Native Cascading Support: Built from the ground up to chain an arbitrary number of 4-digit modules together (e.g., 8, 12, 16+ characters). Data and address buses are tied in parallel across all devices, while a precise dynamic array of
wrPinstriggers the target chip strobe lines. String character indexing is mathematically leveled so that text streams seamlessly from left to right. - Built-in UTF-8 Character Parser: Features an optimized, zero-skip text parser that intercepts multi-byte UTF-8 international accents (such as Czech diacritics) and strips them down on the fly to clean, visible ASCII equivalents.
- Hardwired Memory Safety for ATmega168: Numeric printing via the
print(int)method uses isolated static allocation wrappers. This prevents heap fragmentation and memory stack collisions, guaranteeing 100% long-term system stability on microcontrollers with tiny RAM footprints.
API Reference (Core Library Methods)
The library inherits from the unified Universal_Display abstract class interface, exposing the following public API commands:
begin()– Configures all declared pins as OUTPUT, sets default safe initialization levels (pulling WR strobe lines HIGH), and fires a soft blank character clear.clear()– Soft-wipes the complete character grid buffer of all connected modules instantly by overwriting all registers with blank space characters (' ').print(const char* text)– Processes and prints a text string from left to right. Automatically triggers UTF-8 sanitization and cleanly truncates characters if the text length overflows the display bounds.print(int number)– Converts an integer variable into an ASCII array string and publishes it onto the display grid utilizing memory-safe static boundary checks.writeDigit(uint8_t position, char character)– Low-level cell method. Directly pushes an ASCII char onto a specific slot index (0 = far left). Automatically routes the multiplex bit address lines, handles individual module array indexing, and pulses the correct active-LOWWRstrobe line.turnOff()– Electronically blanks out the entire multi-module screen row by bringing the Display Blanking (BL) pin LOW. The internal memory layout and zapped RAM data are fully preserved.turnOn()– Re-illuminates the active text grid back to 100% brightness by driving theBLline HIGH.
Example Hookup: 2 Modules (8 Characters) via 74HC595
When daisy-chaining modules together, all address and digital control lines (A0, A1, CU, CUE, CLR, BL) as well as the 74HC595 output lines (Q0–Q6) are linked in parallel (shared) across both devices. The only isolated lines must be the individual WR strobes.
Hardware Connection Table (DL2416T 18-Pin Module ➡️ Arduino Nano)
To successfully run the cascaded shift register example, wire all shared parallel pins between both modules together. Connect only the WR (Write Enable) lines separately to differentiate between the left and right display blocks.
| DL2416T Pin | Pin Name | Hardware Function | Connection Target (Arduino / Source) |
|---|---|---|---|
| 1 | CE1 | Chip Enable 1 (Active LOW) | ➡️ GND (Shared) |
| 2 | CE2 | Chip Enable 2 (Active LOW) | ➡️ GND (Shared) |
| 3 | CLR | Hardware Clear (Bypassed via software) | ➡️ Arduino Pin A0 (Shared) |
| 4 | CUE | Cursor Enable (Active LOW) | ➡️ Arduino Pin D7 (Shared) |
| 5 | CU | Cursor Select | ➡️ Arduino Pin D6 (Shared) |
| 6 | WR | Write Enable Strobe (Active LOW) | ⚠️ Module 1 ➡️ Pin D13 ⚠️ Module 2 ➡️ Pin A2 |
| 7 | A1 | Digit Address bit 1 | ➡️ Arduino Pin D10 (Shared) |
| 8 | A0 | Digit Address bit 0 | ➡️ Arduino Pin D8 (Shared) |
| 9 | Vdd | Logic Power Supply (+5V) | ➡️ 5V Pin (Shared) |
| 10 | GND | Common Ground | ➡️ GND Pin (Shared) |
| 11..14 | D0..D3 | Data Bus Bits 0 to 3 | ➡️ 74HC595 Output Pins Q0 to Q3 (Shared) |
| 15..17 | D6..D4 | Data Bus Bits 6 to 4 (Note pin sequence reversal!) | ➡️ 74HC595 Output Pins Q6 to Q4 (Shared) |
| 18 | BL | Display Blanking (Active LOW) | ➡️ Arduino Pin D9 (Shared) |
The demo sketch below prints a warning text once and loops a sharp flashing alarm indicator using the electronic blanking flag:
include "Displays_DL.h"
// 74HC595 Shift Register Pins (Shared D0-D6 parallel data bus)
const uint8_t pinDS = 2; // Data Input
const uint8_t pinSHCP = 3; // Shift Clock
const uint8_t pinSTCP = 4; // Latch Storage Clock
// Shared parallel control and address lines across both devices
const uint8_t pinA0 = 8;
const uint8_t pinA1 = 10;
const uint8_t pinCU = 6;
const uint8_t pinCUE = 7;
const uint8_t pinCLR = A0;
const uint8_t pinBL = 9;
// ISOLATED WRITE LINES ARRAY: Element 0 manages left module (Pin 13), Element 1 manages right module (Pin A2)
const uint8_t dualShiftWrPins[] = {13, A2};
// Initialize the driver class for an 8-digit row layout utilizing a shift register bus
Displays_DL_Shift display(pinDS, pinSHCP, pinSTCP, pinA0, pinA1,
dualShiftWrPins, pinCU, pinCUE, pinCLR, pinBL, 8);
void setup() {
display.begin();
display.clear();
display.turnOn();
// String is pushed exactly ONCE in setup. The display RAM retains it automatically!
display.print("POZOR!!");
}
void loop() {
// Sharp electronic ON/OFF flashing sequence without overriding text memory registers
display.turnOff();
delay(400);
display.turnOn();
delay(400);
}