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?
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