LED Dot Matrix Display




About: I am the Technology lover always doing intersting and innovative stuff. Subscribing to me = fun + excitement !!!!!!!!!. Please check my Website if you want to learn Android Development.
In this project, you shall again use two sets of shift registers. These will be connected to the rows and
columns of the dot matrix display. You will then show a simple object, or sprite, on the display and
animate it. The main aim of this project is to show you how a dot matrix display works and introduce the
concept of multiplexing because this is an invaluable skill to have.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Things Required

for this project you will require -:

1. 1  LED matrix
2. 8  resistors 1k ohm
3. 8 557 transistors
4. 1 ULN2803 IC
5  Arduino
6. 2 74HC595 shift register
7. 2 Bread board
8. Connecting Wires

Step 2: Working

Dot matrix units typically come in either a 5x7 or 8x8 matrix of LEDs. The LEDs are wired in the
matrix such that either the anode or cathode of each LED is common in each row. In other words, in a
common anode LED dot matrix unit, each row of LEDs would have all of their anodes in that row wired
together. The cathodes of the LEDs would all be wired together in each column. The reason for this will
become apparent soon.
A typical single color 8x8 dot matrix unit will have 16 pins, 8 for each row and 8 for each column.
The reason the rows and columns are all wired together is to minimize the number of pins required.
If this were not the case, a single color 8x8 dot matrix unit would need 65 pins, one for each LED and a
common anode or cathode connector. By wiring the rows and columns together, only 16 pins are

However, this now poses a problem if you want a particular LED to light in a certain position. If, for
example, you had a common anode unit and wanted to light the LED at X, Y position 5, 3 (5th column,
3rd row), then you would apply a current to the 3rd Row and ground the 5th column pin.
The LED in the 5th column and 3rd row would now light.

Now let’s imagine that you want to also light the LED at column 3, row 6. So you apply a current to
the 6th row and ground the 3rd column pin. The LED at column 3, row 6 now illuminates. But wait…the
LEDs at column 3, row 6 and column 5, row 6 have also lit up.

This is because you are applying power to row 3 and 6 and grounding columns 3 and 5. You can’t
turn off the unwanted LEDs without turning off the ones you want on. It would appear that there is no
way you can light just the two required LEDs with the rows and columns wired together as they are. The
only way this would work would be to have a separate pinout for each LED, meaning the number of pins
would jump from 16 to 65. A 65-pin dot matrix unit would be very hard to wire up and control because
you’d need a microcontroller with at least 64 digital outputs.
Is there a way to get around this problem? Yes there is, and it is called multiplexing (or muxing).

Multiplexing is the technique of switching one row of the display on at a time. By selecting the column
that contains the row that contains the LED that you want to be lit, and then turning the power to that
row on (or the other way round for common cathode displays), the chosen LEDs in that row will
illuminate. That row is then turned off and the next row is turned on, again with the appropriate
columns chosen and the LEDs in the second row will now illuminate. Repeat with each row till you get to
the bottom and then start again at the top.
If this is done fast enough (at more than 100Hz, or 100 times per second) then the phenomenon of
persistence of vision (where an afterimage remains on the retina for approx 1/25th of a second) will mean
that the display will appear to be steady, even though each row is turned on and off in sequence.
By using this technique, you get around the problem of displaying individual LEDs without the
other LEDs in the same column or row also being lit.

By scanning down the rows and illuminating the respective LEDs in each column of that row and
doing this very fast (more than 100Hz) the human eye will perceive the image as steady and the image of
the heart will be recognizable in the LED pattern.
You are using this multiplexing technique in the Project's code. That’s how you’re to display the
heart animation without also displaying extraneous LEDs.

Step 3:

you have to calculate the value of the resistors you can use 
You should first get some specs on your LEDs, you should know their forward voltage and forward current, you can get this info from the datasheet. The circuit operates on 5V so your Source voltage is 5V which can be obtained from a 5v adapter

Download the original file to see the schematics better.(press the "i" icon in the top left corner of the picture)

Step 4: Making It Work

I have a made the program that displays sentence from the arduino serial monitor on the matrix, my code is very basic .I have made an android application to make the font for the display. Please visit the following page to install the app https://play.google.com/store/apps/details?id=com.androidtutorialpoint.leddotmatrix

Step 5: All Done !!!!!!!!!

Congratulations your 8x8 led matrix is ready . You can display anything you would like .Now U can play with it and make  8x8 led matrix by manually soldering the Led`s or 16x8 matrix and so on !!!!!!

Be the First to Share


    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    19 Discussions


    Question 8 months ago on Step 4

    Hi. Why do you use transistors on both the anode and cathod side? If we multiplex by row, on the cathod side we have up to 8 leds on simultaneously, for a total of 8x20mA, which is too much for one pin of the 74HC595, hence I understand the need for the transistor. On the anode side, each pin of the 74HC595 feeds maximum 1 led simultaneously, hence the output is of only 20mA, which the 74HC595 can supply, and the transistor seems redundant.


    2 years ago

    Somebody explain to me what shall I supposed to do if I have a 40h*80w LED matrix


    3 years ago

    how stop scrolling text!!

    i want show character in center and fix


    3 years ago

    I made it, but how to add more column??


    3 years ago

    sir i did this but instead of letter all leds lighting up


    5 years ago on Step 4

    Good Job :D.

    I did this but instead of the letters lighting up the entire matrix lights up and the letters don't.

    2 replies

    5 years ago on Introduction

    Oh man, your article is sooo nice but in my opinion your Sourcecode could have had some more comments or plausible variable names :P Specially if you try to port this to an other language / platform... Im trying to find some solution for my special Industrial Dot Matrix Display (TIP: There they added the seperate Column Transistors to the last shift register so you can control everything over the serial shift) ... But thanks anyway !

    Thanks for the schematic and code. In that code only 2 time text message display. but i want to display text message for a long time until another serial moniter send next text message. So please help me. my id is dinfrnpal@gmail.com

    Am I able to use s8050 d331 transistors from Texas Instruments? I got them from a kit and I'm wondering if they will substitute nicely or not?


    5 years ago on Introduction

    The picture shows TO-92 NPN transistor but the parts list says 557 wich is PNP
    looking at the schematics it should be PNP transistor
    right ?

    1 reply

    6 years ago on Introduction

    How much time do the LED lamps need to turn ON? What is the refresh rate?
    How much time is it needed to scan a column/row and also to switch from one column/row to another?

    Thanks in advance

    1 reply

    Reply 5 years ago on Introduction

    I haven't read the authors' Arduino code by the way, but I would recommend performing the refresh of each row in a timer interrupt (have a look on the Arduino playground for help on using timer interrupts).

    You want to choose a refresh rate that looks smooth to the human eye so something over 50 updates (of the entire display) per second – i.e. 50Hz. Let's say we chose to refresh one row per millisecond. That equates to 1000 row updates per second or 1000/8 full display updates per second on this 8 row display. That is a 125Hz refresh rate.

    We could easily halve this rate to a nice smooth 62.5Hz by updating a row every 2 milliseconds (for a 16 pixel high display at 62.5Hz the 1ms is ideal). The duration for which the LEDs are left on during that 2ms row-scan time will dictate how bright the display is!

    The Arduino will take a little time to clock the data for each row into the shift register(s). For longer pixel displays the shift registers are chained together and more bits need to be shifted in. Thankfully the 74HC595 has a latch so the data can be clocked in for the next row while the previous row is being displayed on the LEDs!

    Smartly coded timer interrupts will allow the Arduino to do other jobs whilst maintaining a solid refresh rate. I will post up some code when I've had a chance to try this out on an Arduino. BTW: on of my jobs is to write firmware for scrolling LED matrix displays :D