loading

Step 2: The matrix

I will be building my own LED matrix for this project using 5mm leds and a prototyping board from Radio Shack. It should be noted that you can purchase 8x8 dot matrix led modules from several sources, including ebay. They should work just fine with this instructable.

Construction Considerations

Alignment
The LEDS need to be aligned so they face the same direction at the same angle. I found the easiest option for me was to put the body of the LED flush to the board and hold it there with a small piece of plexiglass and a clamp. I put a few LEDs in place a couple of inches away from the row I was working on to make sure the plexiglass was parallel with the prototyping board.

Rows and Columns
We need to have a common connection for each row as well as each column. Because of our row and column driver choice we need to have the anode (positive lead of the LED) connected by row and the cathode (negative lead of the LED) connected by column.

Control Wires
For this prototype I am using solid core (single conductor) hook-up wire. This will be very easy to interface with a solderless breadboard. Feel free to use a different connector type to suit your project.

Building the Matrix

1. Place the first column of LEDS in the prototyping board.
2. Double check that your polarity for each LED is correct, this will be very difficult to fix if you realize it later.
3. Solder both leads of the LED to the board. Check to make sure they are aligned correctly (not at weird angles) and clip off the cathode leads. Make sure you do not clip the anode lead, we will need that later so just leave it pointing up.
4. Remove the insulation from a piece of solid core wire. Solder this piece of wire to each cathode right at board level.
  • I tacked this at each end then went back and added a bit of solder at each junction.
  • This wire should run past your last LED to make for an easy interface when we add control wires.
5. Repeat parts 1-4 until you have all LEDs in place and all column buses soldered.
6. To create a row bus, bend several of the anode leads at a 90 degree angle so they touch the other anode leads in the same row.
  • There are detailed pictures of this below.
  • Take care not to let these come in contact with the column buses, creating a short circuit.
7. Solder the leads at each junction and clip off the excess anode leads.
  • Leave the last anode sticking past the final LED. This will be used to connect the row driver control wires.
8. Repeat parts 6 & 7 until all rows buses have been soldered.
9. Attach control wires.
  • I used red solid core wire for the rows and black for the columns.
  • Connect one wire for each column and one for each row. This can easily be done at the end of each bus.

Important

This LED matrix does not have any current limiting resistors. If you test this without resistors you will probably burn out your LEDs and all this work will be for nothing.
<p>Nice! Definitely gonna make it!</p>
Why is the output of the 3.3k ohm resistors from MIC2981 connected to the empty ports of ATmega8 (denoted by blue lines in the circuit diagram)?<br>Could it not be connected to ground?
<p>Awesome. Thanks very much.<br>Just one question. You are updating the matrix using an interrupt at get 125 Hz. How fast do you think I can update it, if I try it as fast as possible?</p>
<p>Thanks a lot </p>
instead of mic2981 would a decade counter work, or could we just out the pins directly on the arduino?
<p>You wouldnt want to use a ttl IC to power the LED's. The matrix would pull to much current for the IC to handle.</p>
<p>Thumbs up, great explanation, great instructables :D</p>
<p>The column driver is drive only ONE column at any one time, so the current load should not be more than 8 X 15 mA or 120 mA. It seems that one driver should suffice to drive any number of columns. Is this correct?</p>
I recently saw this written up in EDN. It begs two questions. Is the latch really needed? What is the cost of this HEF4794? Given the POV of the human eye versus the speed of a microcontroller, I have never seen this as a problem using a old trusty 74HC164, which, BTW, drives LEDS very nicely. The cost of the HC164 is considerably cheaper over the cost of the 4794 by $2.00. How do I know this? I've used the HC164 in this mode for numerous successful designs that have gone to production, from toys to medical devices. This a great article to demonstrate to the HEF4794 but is it truly practical?
Is the 10k resistor nescessary?
I've been working on a very large LED matrix myself. If anyone wants to see a matrix that allows for direct drive (each LED individually controlled), check this out: <br> <br> http://blog.kamilon.com/?page_id=114 <br> <br>Well done on this tutorial. You can create a small matrix for much cheaper than buying one by following your instructions.
i m doing this project....but addition in this, i m use a gsm module which receives the message send by any cell phone, and it display the message on the led display...so i need CIRCUIT DIAGRAM and CODE for this project....plz help me soon...<br>
Basically you want someone else to do your project for you then don't you? You'll learn a lot more by doing the research and the graft yourself.
Should be &quot;clamp&quot; Just saying.
I want to build something like this but I've noticed that most of the examples of code that I've found for LED- driving programs are written in an assembly language. Is there a reason for that? would like to avoid it if possible...
how do u upload code in C++ to the arduino???
Hi sir i need to make board for matrix 8&times;32 .<br>
Atmega16 ?code Help PLZ <br>
I'm using cad-soft eagle software. I could not find hef4794 shift register . can you help me to find in eagle?
or, if they dont match up, you can make your own part with this tutorial: <br>http://www.sparkfun.com/tutorials/110
if you check the datasheets for the hef4794 and the 74hc595, you can see if they have the same pinout and just use the eagle part for the 595
hi, im really interested in this project, specially in the 16x16 array, but I want to use it with an arduino, and also, that each LED is individually addressable (meaning that the code shuld have a place with lines with the text &quot;B00000000, x32&quot; and that each line has a total of 256 0 (Which can be changed to 1 to make tle LED light up) so each line would be a new frame with every LED individually addressable.<br>The problem is that Im kinda new with microcontrollers and can't write the code, Where can I get it?? can you help me write it?? <br>plz help,<br> really interested in ur project.<br>Thanks.
thanks its good
<br> I have a simple ASM program with a matrix display light just columns. <strong>An example:</strong><br> <br> ;-----------------------<br> LIST P=16F876<br> #include &lt;p16F876.inc&gt;<br> <br> __CONFIG _CP_OFF &amp; _WDT_OFF &amp; _PWRTE_ON &amp; _XT_OSC<br> ORG 0x2100<br> DE 0x00<br> ORG 0<br> <br> <br> cblock 0x20<br> d1<br> d2<br> d3<br> endc<br> <br> goto start<br> <br> Delay<br> ;999990 cycles<br> movlw 0x07<br> movwf d1<br> movlw 0x2F<br> movwf d2<br> movlw 0x03<br> movwf d3<br> Delay_0<br> decfsz d1, f<br> goto $+2<br> decfsz d2, f<br> goto $+2<br> decfsz d3, f<br> goto Delay_0<br> <br> ;6 cycles<br> goto $+1<br> goto $+1<br> goto $+1<br> <br> ;4 cycles (including call)<br> return<br> <br> loop:<br> movlw b'00000111'<br> movwf PORTA<br> movlw b'11110010'<br> movwf PORTB<br> movlw b'11111111'<br> movwf PORTC<br> call Delay<br> call Delay<br> call Delay<br> <br> goto loop<br> start:<br> bsf STATUS,RP0 ; select register page 1<br> movlw 0 ; put 0 into W<br> movwf TRISC ; set portC all output<br> clrf TRISA<br> clrf TRISB<br> <br> bsf STATUS,RP1 ; select Page 2,<br> bcf STATUS,RP0 ; by setting RP1 in Status register and clearing RP0<br> <br> clrf PORTC ; select Digital I/O on port C<br> <br> <br> bcf STATUS,RP1 ; back to Register Page 0<br> goto loop<br> <br> end<br> ;-----------------------<br> <br> <strong>This program code is OK</strong>. But I want the program to which I could display the words fleeing across the screen. Started, I tried to ignite a pair of columns on different sites but with the burning LEDs. But received some strange flashing, do not light longer ... Anybody know what's wrong ...<br> <strong>Programme code:</strong><br> <br> ;-----------------------<br> LIST P=16F876<br> #include &lt;p16F876.inc&gt;<br> <br> __CONFIG _CP_OFF &amp; _WDT_OFF &amp; _PWRTE_ON &amp; _XT_OSC<br> ORG 0x2100<br> DE 0x00<br> ORG 0<br> <br> <br> cblock 0x20<br> Delay1 ; delay loop 1<br> Delay2 ; delay loop 2<br> Delay3 ; delay loop 3<br> TimeDelay ; time delay x 0.001 s<br> EndCount ; used to tell PIC the end of the table is reached<br> Counter ; used as table counter<br> Line1 ; Line 1<br> Line2 ; Line 2<br> Line3 ; Line 3<br> Line4 ; Line 4<br> Line5 ; Line 5<br> sad<br> Line6 ; Line 6<br> Line7 ; Line 7<br> Line8 ; Line 8<br> Layer4 ; brightness, and time<br> Brightness ; LED brightness<br> Time ; time for each pattern to stay<br> Temp ; temp register<br> d1<br> d2<br> d3<br> endc<br> <br> <br> goto start<br> <br> Delay<br> ;999990 cycles<br> movlw 0x17<br> movwf d1<br> movlw 0x2F<br> movwf d2<br> movlw 0x03<br> movwf d3<br> Delay_0<br> decfsz d1, f<br> goto $+2<br> decfsz d2, f<br> goto $+2<br> decfsz d3, f<br> goto Delay_0<br> <br> ;6 cycles<br> goto $+1<br> goto $+1<br> goto $+1<br> <br> ;4 cycles (including call)<br> return<br> <br> loop:<br> movlw b'00000001'<br> movwf Line1<br> movlw b'11110010'<br> movwf Line2<br> call output<br> <br> <br> <br> call Delay<br> movlw b'11100000'<br> movwf Line1<br> movlw b'10101010'<br> movwf Line2<br> call output<br> call Delay<br> <br> goto loop<br> <br> <br> start:<br> bsf STATUS,RP0 ; select register page 1<br> movlw 0 ; put 0 into W<br> movwf TRISC ; set portC all output<br> clrf TRISA<br> clrf TRISB<br> <br> bsf STATUS,RP1 ; select Page 2,<br> bcf STATUS,RP0 ; by setting RP1 in Status register and clearing RP0<br> <br> clrf PORTC ; select Digital I/O on port C<br> bcf STATUS,RP1 ; back to Register Page 0<br> goto loop<br> <br> <br> <br> output:<br> movfw Layer4<br> andlw b'00000001'<br> movwf Time<br> incf Time,1<br> bcf STATUS,C<br> rlf Time,1<br> bcf STATUS,C<br> rlf Time,1<br> bcf STATUS,C<br> rlf Time,1<br> bcf STATUS,C<br> rlf Time,1<br> bcf STATUS,C<br> rlf Time,1<br> <br> <br> <br> clrf PORTB ; clear port B<br> movfw Line1 ; move layer1 to W<br> movwf PORTC ; put W onto PortC<br> <br> bsf PORTB,4 ; turn on layer 1 buy outputing bit 5 of PortB<br> <br> movfw Brightness ; put brightness into W<br> call Delayy ; call the delay<br> <br> bcf PORTB,4 ; turn off layer 1<br> <br> movfw Brightness ; put Brightness into W<br> sublw 4 ; sub W from 4<br> btfss STATUS,Z ; skip if the zero flag is set<br> call Delayy ; call the delay<br> decfsz Time<br> <br> clrf PORTB ; clear port B<br> movfw Line2 ; move Line2 to W<br> movwf PORTC ; put W onto PortC<br> <br> bsf PORTB,5 ; turn on layer 2 buy outputing bit 6 of PortB<br> <br> movfw Brightness ; put brightness into W<br> call Delayy ; call the delay<br> <br> bcf PORTB,5 ; turn off layer 2<br> <br> movfw Brightness ; put Brightness into W<br> sublw 4 ; sub W from 4<br> btfss STATUS,Z ; skip if the zero flag is set<br> call Delayy ; call the delay<br> decfsz Time<br> <br> decfsz Time ; decrement the Time regiester<br> return<br> <br> <br> Delayy:<br> movwf Delay3 ; put W into Delay 3<br> <br> Loop1:<br> ; After Delay2 decreses to 0, it is reset to..<br> movlw 0x1 ; put 1 into W<br> movwf Delay2 ; put W into Delay2<br> <br> Loop2:<br> ; After Delay1 decreses to 0, it is reset to E9h<br> movlw 0x1D ; put 80 into W<br> movwf Delay1 ; put W into Delay1<br> <br> Loop3:<br> decfsz Delay1 ; decrement Delay1<br> goto Loop3 ; jump back to Loop3<br> decfsz Delay2 ; decrement Delay2<br> goto Loop2 ; jump back to Loop2<br> decfsz Delay3 ; decrement Delay3<br> goto Loop1 ; jump back to Loop1<br> return<br> <br> end<br> ;----------------------------------------------------------<br> <br> Thanks for help. :)<br>
Does anyone know if the matrix would work with an Arduino board????
good article!!
what is the additional connection that should be made to make the LEDs glow individual letters???
how can we make the 8*8 led display the letters???? I'm stuck at this point...
can we add shift registers to the column and shift the bit
Where is the Font Set at http://en.radzio.dxp.pl/ks0108/ ?? Anthony
Hey there..nice project,easy to acomplish and lot of stuff to learn.Now that i am learning C,i enlarged the project to be 8x32 columns,but i cant get the code to work.Any hints where are the parts that needs to be worked?There are some parts in the code commented that need to be altered,but i cant figure out how.If you can jelp pls send me an PM,or ust reply here.<br />Thank's and keep up the good work!!<br />
Hi;<br /> I too tried with expanding 8x32 , it doesn't works as expected., Any one can help me, <br />
Could you use a whole load of transistors? For switching something else? Maybe an array of motors or switching relays?<br />
does the leds have good brighness? there is not problem with duty cycle? becouse i have that problem in my project, (i use 4017 decade counter)
&nbsp;can this be done using parallel load shift registers or does it have to be done with serial load.<br /> <br /> if it is to be doable with parallel load registers then the board doesnt have to display only one column at a time, right? that would be so much cooler and you could build modules and connect them with parallel in serial out to serial in parallel out.<br /> <br /> leme know what you think...<br />
Both are 20 pF.<br />
a very informative and interesting site
what are values for c2 and c3 ????? im relying entirely on this!! please? i got everything but this part and the programing part. please help!!!
Just to clarify, could I program in a bunch of phrases (like, 30-40) and call up any one of them based on certain inputs? What is the limit on phrase length without any external memory?
i just bought a butt load of registers. im trying to make a 32 x 32 any pointers? on how to connect 8x8 in rows and columns? any help would be apprecieated. :)
I am looking into your setup and I noticed this: Why do you use such a driver on the high-side when you are lighting one column at the time during multiplexing? Now you could source rows of 8 LED's at one time, but that isn't the case while multiplexing, right?
bro barney, can u help me to get HEF4794? i need the HEF4794?? 9 of them to controll my Solar Display. In my country there's no store sell that shift register :( :( Can I get it from u?? I'll pay it later. I'm in Jakarta, Indonesia. Please help me master, this is for my graduation project. thank you very much :)
I need help programming the micro controller could you please help i would like my display to scroll the following NBI..............VOI.............MBS over and over and can also be made to stop at one of the letters shown.
Could you use a MAX232 to connect it to a computer?
Im trying to get mine working from the COM port, so I am using a MAX232 to convert the data from -3V - 3V to 0V - 5V, then feeding it into a UART (ST16C1450) to get my 8 outputs. I havent had much any luck yet with it yet, as I'm still learning as I go. Right now I'm waiting on new caps for the uart.
Hi nice idea i was hoping to use this idea but enlarge the font characters where i could use four LEDs in place one LED is that possible
I have read and re-read the parts list, but I cannot find the spoon. Where is the spoon?
There is no spoon.

About This Instructable

367,577views

605favorites

License:

More by barney_1:How to Make and Can Concord Grape Jam LED Hanukkah Menorah LED matrix using shift registers 
Add instructable to: