Introduction: Using a Dot Matrix LED With an Arduino and Shift Register

The Siemens DLO7135 Dot matrix LED is one amazing piece of optoelectronics. It's billed as a 5x7 Dot Matrix Intelligent Display (r) with Memory/Decoder/Driver. Along with that memory, it's got a 96-character ASCII display set with upper and lower case characters, a built-in character generator and multiplexer, four levels of light intensity, and it all runs on 5V.

That's a lot to live up to, and at $16 a pop, it definitely should. While spending half the day at my favorite local electronics shop I found a bin full of these for $1.50 a piece. I left the store with several.

This instructable will show you how to connect to these dot matrix LED's and display characters using an AVR-based Arduino. If you've read any of my previous guides, you may get the idea that I'm often in favor of the most parsimonious solution, and you wouldn't be wrong, even if I do fall short of the goal from time to time. Therefore, I'll also go another step in this instructable and show you how you can reduce the number of I/O ports needed to drive these big, honkin' dot matrix LED's.

Step 1: Get the Goods...

For this short little project, you will need:

  • an AVR-based microcontroller like an Arduino or any of it's ilk. These instructions could probably be adapted to your MCU of choice.
  • a DLO7135 dot matrix LED or other in the same family
  • an 8-bit shift register like the 74LS164, 74C299, or 74HC594
  • a breadboard
  • hookup wire, wire cutters, etc.

A soldering iron isn't needed, although I use one later; you can get by without it.

Step 2: Directly Connect to the LED Display

Lay out your small list of parts and grab the LED. Place it on the breadboard centered somewhat, straddling the midline groove. The first part of connecting takes place all on the left side of the LED. Pin #1 is located at the top left as indicated by the triangle/arrow. I put the pin functions on a picture for your reference as you're reading or connecting up your LED.

The Left Side

Positive and Negative
Starting at the top left, connect Vcc to 5V. It's maybe a good idea to not have your board powered until you get the entire left side completed; the LED can be bright if you're trying to see small holes to poke in wires. Connect the bottom left GND to ground.

Lamp Test, Chip Enable and Write
The 2nd and 3rd from the top on the left are Lamp Test and Chip Enable. These are both negative logic, meaning they are enabled when they are at a logical 0 instead of 1. My picture below should have bars over them, but I didn't annotate that for any of them. The LT pin when enabled lights up every dot in the dot matrix at 1/7th brightness. It's more of a pixel test, but the interesting thing about the LT pin is that it doesn't overwrite any character that's in the memory, so you if you have several of these strung together (they have a 20ft viewing distance), strobing LT can make it look like a cursor. To ensure it's disabled, connect it to 5V.

The CE and WR pins are also negative logic and are required to be enabled for this smart device to be written to. You could micromanage these pins with spare I/O ports on your microcontroller, but we won't bother here. Just connect them to ground to keep them enabled.

Brightness Levels
There are four programmable brightness levels on the DLO family of LEDs:

  • Blank
  • 1/7 Brightness
  • 1/2 Brightness
  • Full Brightness

BL1 HIGH and BL0 LOW is 1/2 brightness. Both HIGH is full brightness. Set it to whatever you like. Again, if you have I/O ports to spare and it's important enough to you, this can also be controlled by your Arduino.

That wraps up the left side. If you bring power to your board you should see the LED light up. Play with the brightness controls and the lamp test to get familiar with it, if you're curious.

The Right Side

The right side consists of entirely data ports. The bottom right, pin 8 or D0 to be precise, represents the Least Significant Bit in the 7-bit character. The top right, pin 14 or D6 represents the Most Significant Bit. This lets you know what order to shuffle your bits when writing to the LED.

When you have the data input ports wired up, find seven empty digital I/O ports on your Arduino or AVR and connect them. You'll probably want to remember what data output port on your AVR goes to which data input port on the LED.

Now you're ready to push some data onto that smart LED. Are you trembling with excitement yet? I know I am...

Step 3: Specifying a Character to Be Displayed

The character set that's used on this CMOS LED is your run-of-the-mill ASCII starting at 0x20 (decimal 32; a space) and ending at 0x7F (decimal 127; a delete, although represented on the LED as a cursor graphic). So, having the LED display a character entails nothing more than pushing the a logic 1 or 0 on your data output pins, usually followed by a WR pulse, but I'm foregoing that for this exercise.

So, you've written down or remembered what pins go to what ports, right? I chose PD[2..7] and PB0 (digital pins 2 through 8 in Arduino-speak). I don't normally suggest using PD[0..1] because I dedicate it to my serial communication back to a FreeBSD box, and Arduino's et al. map those pins to their FTDI USB communication channel, and although "they" SAY pins 0 and 1 will work if you don't initialize serial communication, I have never been able to use those pins as normal digital I/O. In fact, I spent two days trying to debug a problem when I tried to use PD0 and PD1 and found that they were always HIGH. *shrug*

It would probably be good to have some sort of external input, like maybe a keypad, a pushwheel or thumbwheel switch, or maybe even input from a terminal (my ArduinoTerm isn't ready for prime time just yet...). The choice is yours. For now, I'm just going to illustrate how to get the code to get the character you want onto the LED. There is a zipfile for download including the source code and Makefile and there's also a short movie showing the LED printing out its character set. Sorry for the crappy quality of the video.

The code below prints the string "Welcome to my Instructable!" then cycles through the entire character set that the LED supports.
DDRD = 0xFF;	// OutputDDRB = (1<<DDB0);	char 	msg[] = "Welcome to my Instructable!";uint8_t	i;for (;;){    for(i=0;i<27; i++)    {        Print2LED(msg[i]);			        _delay_ms(150);    }	    for(i=0x20; i<0x80; i++)    {        Print2LED(i);        _delay_ms(150);    }    Print2LED(&apos;*&apos;);}

The port output is taken care of in the Print2Led() function.
voidPrint2LED(uint8_t i){	PORTD = (i << 2);	if (i & 0b01000000)	    PORTB = (1<<PINB0);	else	    PORTB = (0<<PINB0);}

The code and Makefile is included in a zip file below.

Step 4: Conserve I/O Ports With a Shift Register

So now our microcontroller can send data to the dot matrix LED but it's using eight I/O ports. That excludes using an ATtiny in an 8-pin DIP package, and even with a newer Arduino sporting an ATmega328p that's a lot of I/O ports for one LED. We can get around this, however, by using an IC called a shift register.

A moment to "shift" gears...
A shift register can be understood best by thinking about the two words that make up its name: "shift" and "register." The word shift refers to how the data is moving through the register. Here (as in our Arduino and microcontrollers, in general) a register is a location that holds data. It does this by implementsing a linear chain of digital logic circuits called "flip flops" that has two stable states that can be represented by either a 1 or 0. So, by putting eight flip flops together you have a device that is capable of holding and representing an 8-bit byte.

Just as there are several types of flip flops, and several variations on a theme of shift registers (think up/down counters and Johnson counters), there are also several types of shift registers based on how data is latched into the register and how that data is output. Based on this, consider the following types of shift registers:

  • Serial In / Parallel Out (SIPO)
  • Serial In / Serial Out (SISO)
  • Parallel In/ Serial Out (PISO)
  • Parallel In / Parallel Out (PIPO)

Two of note are SIPO and PISO. SIPO registers take data serially, that is, one bit after another, shifting the previously input bit over to the next flip flop and sending the data out on all inputs at once. This makes a nice serial to parallel converter. PISO shift registers, conversely, have parallel inputs, so all bits are entered at once, but are output one at a time. And you guessed it, this makes for a nice parallel to serial converter. The shift register we want to use to reduce the number of I/O pins would allow us to take those 8 IO pins we used earlier and reduce them down to one, or maybe just a couple, considering we may need to control how we input the bits. Therefore, the shift register we'll use is a Serial In / Parallel Out.

Wire up the shift register between the LED and Arduino
Using a shift register is easy. The hardest part is just visualizing the data output pins and how the binary digits will end up in the IC, and how they will eventually show up on the LED. Take a moment to plan this out.

1. Attach 5V to pin 14 (top right) and take pin 7 (bottom left) down to ground.
2. The shift register has two serial inputs but we'll only be using one, so connect pin two to 5V
3. We won't be using the clear pin (used to zero out all outputs) so leave it floating or attack it to 5V
4. Connect one digital IO port to pin one of the shift register. This is the serial input pin.
5. Connect one digital IO port to pin 8 (bottom right). This is the clock pin.
6. Connect your data lines from Q0 to Q6. We're only using 7 bits because the ASCII character set only uses seven bits.

I used PD2 for outputting my serial data and PD3 for the clock signal. For the data pins, I connected Q0 to D6 on the LED and continuing that way (Q1 to D5, Q2 to D4, etc). Since we're sending out data serially we will have to examine the binary representation of each character we want to send, looking at 1's and 0's, and outputting each bit on the serial line. I've included a second version of the dotmatrixled.c source along with a Makefile below. It cycles through the character set and displays all even characters (if it's weird thinking that a letter could be odd or even, think about the binary representation for a moment). Try to figure out how to make it cycle through displaying all odd characters. You can further experiment with the connections between the shift register, the dot matrix LED, and your Arduino. There are several control features between the LED and the register that can allow you to fine-tune your control about when data is displayed.

So....we've gone from having to use eight I/O ports to only using two!

Step 5: Summary

In this instructable, I have presented the DLO7135 dot matrix LED and how to make it work. I've further, discussed how to reduce the number of required I/O ports from eight to only two using a shift register. The DLO7135 dot matrix LED can be strung together to make very eye catching and interesting marquees.

I hope you had fun reading this instructable! If there's any improvements you think I could make or suggestions you'd like to give on this or any of my 'ibles, I'm happy to hear them!

Happy AVR'ing!

Comments

author
Srikanthkumar (author)2016-03-31

Please send aurdino interfacing with dotmatrix display and gsm module

author
taifur (author)2015-10-18

good instructables

author
nevdull (author)taifur2015-11-05

Thank you sir!

author
jonesjalapat (author)2012-12-30

can you give some details on how to display letters in led matrix..so that i can write a program .Atleast give some sources from which i can refer.

author
nevdull (author)jonesjalapat2012-12-30

I'm not sure I understand. I excerpt parts from my AVR/Arduino code on sending characters directly to the DLO, as well, I include the complete source files on the page for download.

author
mr.future11 (author)2012-10-16

nevdull- i want to make the display of my own 8*8 matrix can u help me on dat.

author
nevdull (author)mr.future112012-10-20

You can build your own with a charlieplex circuit (do a search on here or google for charlieplex) or, alternatively, you can buy an led matrix that could save you lots of soldering and let you get on to the core of your project. I've found good LED maxtrices on ebay, just do a search for something like "led matrix."

good luck!

author
OZeP_99 (author)2010-08-12

can you please give me a family of the DL07135?...tnx^_^

author
nevdull (author)OZeP_992010-08-12

How about here at avnet.com?

Good luck!

author
OZeP_99 (author)nevdull2010-08-13

just a follow up question...TOM-1057BH or TOM1057AH...wud that thing can work out replacing DLO7135?...having a prob about the shipment bcoz of time...needed badly asap

author
nevdull (author)OZeP_992010-08-13

they look similar but i dont know if the TOM* parts are "smart" in that they have a built-in character generator, etc. otherwise, you'll have to manage all the rows and columns and generate characters in your code. check first before you buy those TOM parts; my guess is they're not a direct replacement for the DLO but I don't know. Good luck!

author
OZeP_99 (author)nevdull2010-08-15

do you have any alternative parts for that LED?...maybe they do(electronic shop here) has an avilable LED like the alternative...thank you so much

author
nevdull (author)OZeP_992010-08-19

The only parts #'s I know for sure are the Seimens' DLO# numbers, but if you do a search for "dot matrix LED" you will get a good list that you can look through. Just make sure they are "smart," that is, have their own character set, otherwise you'll be stuck doing that on your own. Good luck!

author
jeff-o (author)2009-07-29

Wow, I've got to get myself some of those displays! Thanks for the instructable on how to drive them. :)

author
nevdull (author)jeff-o2009-07-30

They are really neat displays. If you ever run across any in a local shop priced cheaply, they are worth picking up if just for their versatility and ease of use. Thanks for stopping by!

author
jeff-o (author)nevdull2009-07-30

I'll keep my eyes peeled - they're hard to tell apart from regular dot matrix displays, though...

author
nevdull (author)jeff-o2009-07-30

Yeah, I stumbled on mine by total accident...serendipity in motion. They're available online from the major distributors, but they're pretty spendy...

author
jeff-o (author)nevdull2009-07-30

I know, I checked. ;) I've got a project I'm working on that could have used one, though the display itself is too small. I need a taller display - do those exist?

author
nevdull (author)jeff-o2009-07-30

This DLO series is only 5x7 although they make a taller one, the DLO4135/4137. But only the package is taller. The display is still 5x7. I attached the datasheet to this page if you want to get an idea of how the taller one looks, but I'm not sure that's what you're looking for.

author
jeff-o (author)nevdull2009-07-30

Yeah, by taller I meant bigger in general - 2" high is what I'm after...

author
nevdull (author)jeff-o2009-07-30

Maybe something like this could work? They're 2.3" . I have no experience with it though. Just ran across it.

author
richms (author)nevdull2010-08-04

Matrixed displays need to be refreshed, and when I last looked at it, setting up a timer in arduino was hard and made other things break which is why they didnt support doing it. I did get it working with normal AVR code, driving some shift registers to make 3 row 14 column LED clock that was a rip off of the aluminum cased one you see from think geek all over the place. As I have no proper time source and the AVR and ardiuno is hopeless at keeping time I have not taken it to completion, but it is displaying random blinking patterns which lets face it is all that is needed. I might get it close enough to complete to write something up before the weekend.

author
nevdull (author)richms2010-08-05

I'm not familiar with the Arduino way of doing timers, per se, but straight C/C++ or assembler with timers is pretty straight forward. There is an excellent tutorial over at avrfreaks.net if you search for a timer tutorial. Also, you only need to refresh at 30kHz or a little more to remove flicker. good luck!

author
jeff-o (author)nevdull2009-07-30

Those are the right size (and pretty common) though they aren't intelligent like the module you have. Bah, maybe I'm just being lazy! I'm sure there's a nice library out there that makes it easy to interface a 5x7 module to an AVR with a minimum of fuss.

About This Instructable

85,436views

71favorites

License:

Bio: Gian is a computational biologist and is the Managing Director at Open Design Strategies, LLC. He holds a BA in Molecular/Cellular Biology and an ... More »
More by nevdull:Create A Custom Medieval-/Fantasy-Style Calligraphy QuillPractical DACsUsing Enumerated Types as Bitflags
Add instructable to: