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