Quantcast
Channel: MEL PICBASIC Forum
Viewing all articles
Browse latest Browse all 4746

How to send number greater than 65535 to MAX7219 BCD decoder?

$
0
0
I'm using 16F chip, so no support for long variables. But I have 8 digit led display connected to MAX7219 and I want to display on it say something like this

variable 1 (2 digits) "-" sign, variable 2 (2 digits) and again "-" sign, variable 3 (again 2 digits). The code I'm using is this, but it can't display more than 65535 due to compiler limitations. Any ways to solve this?

Code:

'DEFINES:
 Clk    Var PORTC.6  ' Data is clocked on rising edge of this pin            mcvane
 Dta  Var PORTC.5  ' Bits are shifted out of this pin          KVITELI
 Load    Var PORTC.4  ' Transfers data to LEDs when Pulsed  lurji
 
 
 'MAX7219 STUFF
    ' ** 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 4 ' 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)
 
 ' Turn Off test mode
 Register=Scan_Reg  ' Point to the Scan Register
 R_Val=6    ' 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=1    ' 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=%11111111  ' Decode the first 8 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

TTK:

for tvla=50000 to 65535
pause 10
max_disp=tvla
GOSUB DISPLAY
next
GOTO TTK
 
Display:
 Digit=0      ' Start at Digit 0 of Max_Disp Variable
 For Position=1 to 5 '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>=4 then Digit=0  ' We only need the first five 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
 PAUSEUS 100
@ Nop
@ Nop    ' A small delay to ensure correct clocking times
 Low Load    ' Disable the MAX7219
 Return    ' Exit from Subroutine


Viewing all articles
Browse latest Browse all 4746

Trending Articles