Here you can find out how to drive a dot matrix LED display with 64 LEDs (8 rows by 8 columns - 8x8 display) or less e.g. 35 LEDs (7 rows by 5 columns - 5x7 dot matrix). The same principle is used for larger displays but you may need more processing power as this method requires the microcontroller to actively update the display every 20ms. Other more complex (expensive) chips do this refresh for you (see the MAX7219).
Driving an led dot matrix is quite simple and this page shows you how to do
it without a complex "helper" chip i.e. driven by the microcontroller a few
transistors and a the 4017 Johnson counter.
It uses persistence of vision to let
you drive the 64 LED matrix with only 10 microcontroller outputs!
Normally you would need 64 outputs for 64 LEDs but by using multiplexing and a helper chip you can get away with 10 microcontroller pins. In this design two pins are use to communicate with the helper chip and 8 pins directly drive the row elements of the 8x8 display. The helper chip is used to activate each column in turn while the row pins generate the column pattern at the active column..
LED Display multiplexing simply means turning on one led for a short period of time and doing this repeatedly for each LED.
If you do this fast enough then your eye will not notice any flicker.
The 64 leds, arranged as 8 rows by 8 columns, are housed in a plastic casing. The LEDs are no different to any other LEDs but the LED block saves a huge amount of soldering as all the wiring has been done for you within the unit itself.
It is already wired up for multiplexing having only 16 connections (8 rows are connected to 8 anodes of the LEDs and 8 columns are connected to 8 cathodes of the LEDs). So you can drive a row of LEDs by pulling the column connection to ground.
LED display matrix 8x8 LEDs
A dot matrix led display is simply a grid of LEDs arranged for use by multiplexing.
|dot matrix led display driver||Red 8x8 LEDs|
|Compiler||Mikroelectronika MikroC Compiler Free!|
|Target||16F88/16F84 (retargetable to other PICs that have an enough pins).|
|Software notes||Multiplexing the display.|
|Hardware notes||No special notes|
|Project files||Enter your details to get
the Download Link
and get the microcontroller newsletter:
(Your email is safe it will
never be sold or rented).
If you tried to drive 64 individual LEDs you would need 64 individual output pins (each led connected to a output pin on one side and ground on the other).
Obviously that is a tall order so the way round it is to use persistence of vision which is a way of describing how your eye works.
Your eye reacts slowly to changes in light intensity so that if a light is turned on and off quickly enough then it does not notice that the light is off. Basically your eye remembers a light pulse for a short time.
The approximate time is 20ms so if the light is turned on at a frequency >50Hz (1/20ms) then your eye will not notice any flicker at all.
Multiplexing uses this fact to reduce the number of pins needed to drive an LED display. You can do this by splitting the 64 led display into 8 rows and 8 columns which lets you drive it using 8 row outputs and 8 column outputs. In fact the 8x8 led matrix block used here has all the leds arranged in this way already.
Note: The orientation of the led block should be pin 1 at the top left to view characters the right way up. However I found I wanted to move the board around and look from the other side so there are two definitions that allow flipping and rotating the display. To view from a different position re-compile the code with these definitions active (See the code).
Each row is driven in turn and as long as all of the rows are driven within a time period of 20ms it will appear as though the LEDs are on continuously.
To turn a specific led 'ON', data is output to the column drivers when a row is driven.
To save more pins it is common to use a helper chip and in this project it is a Johnson counter (a 4017). This generates a walking one every time that it's clocked. Since you only want one row on at a time it is the ideal chip for this application.
Note: In this project when the 4017 has been reset it outputs a logic high at Q0 - which is not connected - so during reset the 4017 does nothing. This allows you to use the column driver port for something else if you want to when you are not driving the LEDs.
To drive the 4017 all you need is two pins one for reset and one for clock.
So to fully drive the 64 led display you only need 10 microcontroller output pins.
You don't have to use a 4017. If you have enough pins you could drive the led display directly e.g. using a 16F877A. It all depends on your circuit and what resources you need to use.
To get more current through the LEDs you need to use a transistor at each row driver as the maximum current you can sink or source is low.
The row driver sinks all the current from each active row LED. To let the current flow you need to use a transistor at each row as the maximum current you can sink or source is very low for an HC4017 (1ma).
I used a ULN2803 (an array of 8 grounded NPN transistors) - which is massive over design in terms of its collector current capability (500mA) but provides a convenient (and cheap) package which is useful for prototyping.
Note you can use individual NPN transistors if you want to - normal standard transistors are OK as the maximum current is about 60mA through a column.
The most difficult thing about using the dot matrix LED display is defining the characters. Basically for ASCII characters you need an array of 128 blocks each having 8 column data numbers.
The usual way is to get out a piece of graph paper and define your characters by drawing blocks where a pixel is on. You then translate each line into hex (binary to hex is very easy) and then transfer this information to your program source code.
I have defined characters 0-9 which are cycled continuously.
This contains all the code except :
The code is simple and easy to follow - all the action happens in main().
It enters a continuous a continuous loop blinking an led on port A and driving the columns of the 8x8 led display and driving the 4017 (for rows). At each blink the next character is selected from the character set.
The code repeatedly executes the for loop and it must go faster than 20ms for 8 columns - so the code has to go faster than 20ms/8 = 2.5ms - which it does. So there is no visible flicker.
At each row (selected at each iteration of the for loop) the next column data is output so that the entire character is displayed.
You can program the PIC in circuit through the ICSP connector.
Note: There are two controls for adjusting the display:
FLIPLR which swaps all the bits in each output row.
ROT180 which turns the display upside down.
You will probably get the display orientation wrong and these fix that problem in software!
Jump from dot matrix LED display to
Best-microcontroller-projects home page
How to make an Arduino Capacitive Sensor with no external hardare and using only one pin!
Find out how digitalWrite() works...Now use 17x Faster macros!
learn how to use Arduino pulseIn and pulseInLong to get the most accurate pulse measurement on an Arduino.
Switch debounce: Three different ways to debounce input push switches with one amazing method that you can't miss.
How to Easily Use the DS18B20 Maxim One-Wire thermometer with Arduino example code showing external or parasitic power modes.
How to use the BMP280 for weather pressure measurement or altitude change detection.