It is currently Sat May 25, 2013 1:05 am

All times are UTC + 10 hours




Post new topic Reply to topic  [ 6 posts ] 
Author Message
 Post subject: How to draw a smiley face on an 8x8 LED matrix
PostPosted: Thu Jul 15, 2010 9:35 am 
Offline
Site Admin
Site Admin
User avatar

Joined: Fri Mar 26, 2010 10:30 pm
Posts: 1863
Here's a simple little tutorial on how you can draw a simple graphic on an 8x8 LED matrix display.

What you will need:

:arrow: PIC18f4685 microcontroller
:arrow: 8x8 LED matrix
:arrow: 8 x 150 ohm resistors
:arrow: 1 x 10k ohm resistor

This is a very simple circuit to make. You just need to connect all the common anodes of the matrix to PORTB of the microcontroller and then all of the common cathodes (through the 150 ohm resistors) to PORTD of the microcontroller. Then the 10k ohm resistor connects between mclr and vcc (to make sure that we are not resetting the microcontroller.

Now here's the code:

Code:
Device = 18F4685          // Tell the compiler what chip we are using
Clock = 8                 // Tell the compiler what we will be setting the clock to (Mhz)           
Config OSC = IRCIO67      // This tells the microcontroller to use the internal clock


Include "Utils.bas"       // Include this file when we compile so that we can use keywords like 'setalldigital'

// Arrays                                                                                   
Const face_data(8) As Byte = (%00111100,%01000010,%10101001,%10000101,%10000101,%10101001,%01000010,%00111100)                                         
Const cathodes(8) As Byte = (%11111110,%11111101,%11111011,%11110111,%11101111,%11011111,%10111111,%01111111)

// variable declaration
Dim x As Byte

// Sub Routines
Sub draw_face()
        For x = 0 To 7
            PORTD = cathodes(x)
            PORTB = face_data(x)
            DelayMS(1)
            PORTB = %00000000           // I put this here to make sure that we don't get ghosting when moving to the next column
        Next
End Sub

// Start Of Program
OSCCON = %01111111                  // Sets the internal oscillator for 8Mhz
SetAllDigital                       // Make all Pins digital I/O's
TRISD = %00000000                   // Make PORTD all outputs
TRISB = %00000000                   // Make PORTB all outputs

// Main Loop
While True()                        // This creates an infinite loop
    draw_face
Wend                                // Loop back to the while loop as long as we havent finished.


The code is quite straight forward. The interesting thing is that the sub routines MUST be above your main code.

In this case my main code starts where it says:
Code:
// start of program


Whenever you see two forward slashes // it means the compiler will ignore the code coming after it. Great for making comments in your code.

If you look up the top of the code, I declare two arrays, each containing eight bytes. An array is great for when dealing with graphics because all of your graphic data can be defined (and even manipulated) quite easily. In this case my two arrays contain my face graphic data and also the data to activate one column of cathodes at a time.

After that, I have just one variable 'x' which I use to cycle through the data in the arrays and also to remain in a loop for a certain amount of time (in this case it will run the loop eight times I.E. from 0 to 7

The next part of the code is a sub routine, here it is again:
Code:
Sub draw_face()
        For x = 0 To 7
            PORTD = cathodes(x)
            PORTB = face_data(x)
            DelayMS(1)
            PORTB = %00000000           // I put this here to make sure that we don't get ghosting when moving to the next column
        Next
End Sub


This sub routine takes care of drawing the graphics (from the arrays) on the 8x8 matrix.

We run whats called a FOR NEXT loop. the for next loop will remain in the loop while until x = 7. when x does equal 7, it will run the loop statements one last time and will then exit the loop.

So, when we say for x = 0 to 7, it means that we first load the variable x with 0, we then run the code underneath it. We want to send the first byte of data to the LED cathodes (which is PORTD) This is also where the variable x comes in handy because we use this variable to point to the first byte in the array (x = 0 so therefor we grab byte 0 from the array.

We then grab the first byte of data from the face_data variable and send it to PORTB. we then delay for 1mS. Then to prevent ghosting on the screen, we clear PORTB before incrementing to the next cathodes.

We then get to the next statement. This means if x has not reached 7 yet, then go to the next number (from 0 to 7) and run the loop again.

So we go back to the start of the loop and now x = 1. This means we will be grabbing the next byte in the arrays. it keeps doing this until all eight bytes (in each array) have been sent to the LED's. Then thats it. The FOR NEXT loop is done (for now).

The next piece of code is actually where the main program starts.

here we set the oscillator speed (8Mhz) we make sure all ports are set to digital and then we set PORTB and PORTD to outputs. Then comes the main loop.

Here we have a WHILE WEND loop. This is just another type of loop. In this case it will stay in the loop while ever the statement is true.

E.G. we could have a while wend loop that has:

Code:
while PORTA.0 = 1()
      run this code....
wend


this simple loop will run this piece of code over and over again until PORTA pin 0 no longer equals 1.

So in the case of drawing the face, I create an infinite loop where i say "does true equal true?" of course it does! so it will stay in the loop forever.

as you can see, the loop just calls the sub routine to draw the graphics.

and thats it for now!

feel free to ask any questions that you might have.


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 7:33 pm 
Offline
Moderator
Moderator
User avatar

Joined: Sun Mar 28, 2010 9:03 pm
Posts: 699
Location: United Kingdom
Brad got a question for you, so you are using "Const face_data( 8 ) As Byte" as your data to draw the face, what if you used "DIM face_data( 8 )" and saved it to RAM instead?, could you then update each byte of data within your program?

because what I am aware of is that if you use "Const" then this data is stored to your program memory and it is unchangable.


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:45 pm 
Offline
Site Admin
Site Admin
User avatar

Joined: Fri Mar 26, 2010 10:30 pm
Posts: 1863
bitfogav wrote:
Brad got a question for you, so you are using "Const face_data( 8 ) As Byte" as your data to draw the face, what if you used "DIM face_data( 8 )" and saved it to RAM instead?, could you then update each byte of data within your program?

because what I am aware of is that if you use "Const" then this data is stored to your program memory and it is unchangable.


Yep, you are exactly right. variables stored in program ram via const are not able to be changed. But storing it in ram via dim can be changed.

In what way did you want to update the data?


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:49 pm 
Offline
Moderator
Moderator
User avatar

Joined: Sun Mar 28, 2010 9:03 pm
Posts: 699
Location: United Kingdom
Well what if you wanted to change the face to a LETTER? instead of calling another "const" just use a Array (DIM) and then just update each byte of data? if that makes sense? :)


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:50 pm 
Offline
Moderator
Moderator
User avatar

Joined: Sun Mar 28, 2010 9:03 pm
Posts: 699
Location: United Kingdom
I think you just answered that question in my 24x24 project post :)

http://www.bradsprojects.com/phpBB2/viewtopic.php?p=1083#1083


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 15, 2010 9:54 pm 
Offline
Site Admin
Site Admin
User avatar

Joined: Fri Mar 26, 2010 10:30 pm
Posts: 1863
bitfogav wrote:
I think you just answered that question in my 24x24 project post :)

http://www.bradsprojects.com/phpBB2/viewtopic.php?p=1083#1083


But wouldn't that data have to be somewhere in the first place in order to update it? :wink:


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 6 posts ] 

All times are UTC + 10 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Theme made by Keenen Wheeler