# need help pic877 to max7219

Status
Not open for further replies.

#### pasicr

Hi all,
please I need some examples code in asm or picbasic for using pic16f877 and max7219 for driven 64 individual led in matrix.
Regards

#### sush

##### Member level 4
check your personnal inbox i've sent a message there.

#### dani

##### Full Member level 4
sush said:
check your personnal inbox i've sent a message there.

Hi
i need it too dear please send it to mee too..

regards

##### Newbie level 6
how to combine 2 pic16f877 in series

#### fontas

##### Newbie level 4
May I have some samples please ?

thank you

TO SUSH

regards

#### fontas

##### Newbie level 4
I want a simpe program which the 7segment , which is conected to max7219 , counts from 0 to 7 .
Or something similar , is it possible ?

regards

#### raafia

##### Junior Member level 1
hey i need it too
thanks

#### erio

##### Full Member level 3
@ fontas: this is program to count from 0 to 9999 and 9999 to 0 using Proton DS

Code:
' This Program demonstrates the use of the MAX7219, seven segment decoder driver
' It also incorporates placing of Decimal point.

Device 16F84
' ** Set Xtal Value in MHz **
Declare Xtal = 4                    ' Set Xtal Frequency

' ** Declare Pins Used **
Symbol Clk    = PORTB.0             ' Data is clocked on rising edge of this pin
Symbol Dta  = PORTB.1               ' Bits are shifted out of this pin
Symbol Load = PORTB.2               ' Transfers data to LEDs when Pulsed

' ** Declare Constants **
Symbol Decode_Reg = 9               ' Decode register, a 1 turns on BCD decoding for each digit.
Symbol Lum_Reg = 10                 ' Intensity register.
Symbol Scan_Reg = 11                ' Scan-limit register.
Symbol Switch_Reg = 12              ' On/Off Register.
Symbol Test_Reg = 15                ' Test mode register (all digits on, 100% bright)

' Symbol Max_Digit = 5                  ' Amount of LED Displays being used.

' ** Declare Variables **
Dim Counts   As Word                ' Variable used for the Demo Counting routine
Dim Max_Disp As Word                ' 16-bit value to be displayed by the MAX7219
Dim Max_Dp   As Byte                ' Digit number to place Decimal point (0-4)
Dim Register As Byte                ' Pointer to the Internal Registers of the MAX7219
Dim R_Val    As Byte                ' Data placed in Each Register
Dim Digit    As Byte                ' Position of individual numbers within MAX_Disp (0-3)
Dim Position As Byte                ' Position of each LED display (1-4)

' ** Initialise The MAX7219 **
' Each register address is sent along with its setting data.
' Because the MAX7219 expects to see a packet of 16 bits, then the LOAD pin is pulsed
' Set the scan limit to 3 (4 digits, numbered 0-3)
' Set the Brightness to 5
' BCD decoding to the lower 4 digits
' Switch the display on.
' Turn Off test mode

Register = Scan_Reg                 ' Point to the Scan Register
R_Val = 3                           ' Send 3, (Four LED Displays 0-3)
GoSub Transfer                      ' Transfer this 16-bit Word to the MAX7219

Register = Lum_Reg                  ' Point to the Luminance Register
R_Val = 5                           ' Send 5, (Value for Brightness)
GoSub Transfer                      ' Transfer this 16-bit Word to the MAX7219

Register = Decode_Reg               ' Point to BCD Decode Register
R_Val = %00011111                   ' Decode the first 5 digits
GoSub Transfer                      ' Transfer this 16-bit Word to the MAX7219

Register = Switch_Reg               ' Point to the Switch Register
R_Val = 1                           ' Set to One, (switches the display ON)
GoSub Transfer                      ' Transfer this 16-bit Word to the MAX7219

Register = Test_Reg                 ' Point to the Test Register
R_Val = 0                           ' Reset to Zero, (turns off Test mode)
GoSub Transfer                      ' Transfer this 16-bit Word to the MAX7219

' ***** Main Program *****
' This loop increments and then decrements a 16-bit number
' And displays it on Four LED Displays
' The value to be displayed is held in the variable "Max_Disp"
' The Position of the decimal point is held in Max_DP (0-4)

Max_Dp = 3                          ' Display number for Decimal Point

Again:
For Counts = 1 To 9999              ' Increment Counter
Max_Disp = Counts               ' Load Max_Disp with Value of Counter
GoSub Display                   ' Display the Value of Counter
DelayMS 150                     ' Delay, so we can see whats happening
Next                                ' Close the Loop

For Counts = 9999 To 1 Step -1      ' Decrement Counter
Max_Disp = Counts               ' Load Max_Disp with Value of Counter
GoSub Display                   ' Display the Value of Counter
DelayMS 150                     ' Delay, so we can see whats happening
Next                                ' Close the Loop
GoTo Again                          ' Do it Indefinately

' ** Subroutines **
' Display the Value held in the Variable "MAX_DISP" on the four LED's
' The value held in "MAX_DP" places the decimal point on that LED (0-3)
' Sending the value 15 blanks the display, this allows Zero suppression
' By setting bit-7 of the value sent to the individual LED displays, the decimal point
' Is illuminated

Display:
Digit = 0                                               ' Start at Digit 0 of Max_Disp Variable
For Position = 4 To 1 Step -1                           ' Start at Farthest Right of Display
Register = Position                                     ' Place Position into Register
R_Val = Dig Max_Disp,Digit                              ' Extract the individual numbers from Max_Disp
If Max_Disp < 10 And Position = 3 Then R_Val = 15       ' Zero Suppression for the second digit
If Max_Disp < 100 And Position = 2 Then R_Val = 15      ' Zero Suppression for the Third digit
If Max_Disp < 1000 And Position = 1 Then R_Val = 15     ' Zero Suppression for the Forth digit
If Max_Disp < 10000 And Position = 0 Then R_Val = 15    ' Zero Suppression for the Fifth digit
If Digit = Max_Dp Then R_Val.7 = 1                      ' Place the decimal point, held in Max_DP
GoSub Transfer                                          ' Transfer the 16-bit Word to the MAX7219
If Digit >= 3 Then Digit = 0                            ' We only need the first four digits
Digit = Digit + 1                                       ' Point to next Digit within Max_Disp
Next                                                    ' Close the Loop
Return                                                  ' Exit from subroutine

' Send a 16-bit word to the MAX7219
Transfer:
SHOut Dta,Clk,msbfirst,[Register,R_Val]         ' Shift Out the Register first, then the data
High Load                                       ' The data is now acted upon
DelayUS 2                                       ' A small delay to ensure correct clocking times
Low Load                                        ' Disable the MAX7219
Return                                          ' Exit from Subroutine

Status
Not open for further replies.