Hi All
i am experimenting with MAX7219, seven segment decoder driver
using Les example program MAX_CNT.BAS in his book "EXPERIMENTING WITH THE PICBASIC PRO COMPILER"
the program does work a it suppose to counting to 9999 and decrements a 16-bit number
Question is i want to light up just the g on the four displays to indicate no data
does anyone know how i can do this
Regards
Isaac
Code:
' Program: MAX_CNT.BAS
' *************************************************************
' * For use with EXPERIMENTING WITH THE PICBASIC PRO COMPILER *
' * *
' * This source code may be freely used within your own *
' * programs. However, if it is used for profitable reasons, *
' * please give credit where credit is due. *
' * And make a reference to myself or Rosetta Technologies *
' * *
' * Les. Johnson *
' *************************************************************
'
' This Program demonstrates the use of the MAX7219, seven segment decoder driver
' It also incorporates placing of Decimal point.
' ***********************************************************************
Include "Modedefs.bas"
Define LOADER_USED 1
' ** Set Xtal Value in mHz **
Define OSC 20 ' Set Xtal Frequency
' ** Declare Pins Used **
Clk Var PortB.0 ' Data is clocked on rising edge of this pin
Dta Var PortB.1 ' Bits are shifted out of this pin
Load Var PortB.2 ' Transfers data to LEDs when Pulsed
' ** Declare Constants **
Decode_Reg Con 9 ' Decode register, a 1 turns on BCD decoding for each digit.
Lum_Reg Con 10 ' Intensity register.
Scan_Reg Con 11 ' Scan-limit register.
Switch_Reg Con 12 ' On/Off Register.
Test_Reg Con 15 ' Test mode register (all digits on, 100% bright)
' Max_Digit Con 5 ' Amount of LED Displays being used.
' ** Declare Variables **
Counter Var Word ' Variable used for the Demo Counting routine
Max_Disp Var Word ' 16-bit value to be displayed by the MAX7219
Max_Dp Var Byte ' Digit number to place Decimal point (0-4)
Register Var Byte ' Pointer to the Internal Registers of the MAX7219
R_Val Var Byte ' Data placed in Each Register
Digit Var Byte ' Position of individual numbers within MAX_Disp (0-3)
Position Var Byte ' Position of each LED display (1-4)
' ** INITIALIZE 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=0 ' 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=5 ' Display number for Decimal Point
Again: For Counter=1 to 9999 ' Increment Counter
Max_Disp=Counter ' Load Max_Disp with Value of Counter
Gosub Display ' Display the Value of Counter
Pause 150 ' Delay, so we can see whats happening
Next ' Close the Loop
For Counter=9999 to 1 step -1 ' Decrement Counter
Max_Disp=Counter ' Load Max_Disp with Value of Counter
Gosub Display ' Display the Value of Counter
Pause 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=Max_Disp Dig 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 Position ' Close the Loop
Return ' Exit from subroutine
' Send a 16-bit word to the MAX7219
Transfer:
Shiftout Dta,Clk,msbfirst,[Register,R_Val] ' Shift Out the Register first, then the data
High Load ' The data is now acted upon
@ Nop
@ Nop ' A small delay to ensure correct clocking times
Low Load ' Disable the MAX7219
Return ' Exit from Subroutine
Bookmarks