Hi all,

I was recently in need of a program to convert binary to BCD to display the result of a binary counter on a MAX7219 7 segment LED display module. Couldn't find anything suitable on the forum so had a go at it myself.


include "modedefs.bas"
ADCON0=7 'MESSES UP SERIAL COMMS IF OMITTED
ADCON1=7
CNTR VAR BYTE'COUNTS THROUGH 32 SHIFT OPERATIONS

DBYTE1 VAR BYTE'LOW 8 BITS OF SCRATCH SPACE BITS 7-0
DBYTE2 VAR BYTE'NEXT BYTE BITS 15-8
DBYTE3 VAR BYTE'NEXT BYTE BITS 23-16
DBYTE4 VAR BYTE'NEXT BYTE BITS 31-24
DBYTE5 var BYTE'HIGH 8 BITS OF SCRATCH SPACE BITS 39-32

BBIN4 VAR BYTE'HIGH BYTE OF INPUT VARIABLE
BBIN3 VAR BYTE
BBIN2 VAR BYTE
BBIN1 VAR BYTE'LOW BYTE OF INPUT VARIABLE
'MAX7219 DISPLAY SETUP
DataPin var PORTA.0
ClockPin var PORTA.1
Load var PORTA.2

pause 500
high load
pause 1000

LOW Load
SHIFTOUT datapin,clockpin,MSBFIRST,[$0C, $01] 'shutdown mode off
high load:low load
SHIFTOUT datapin,clockpin,MSBFIRST,[$0A, $0F] 'set intensity to maximum
high load:low load
SHIFTOUT datapin,clockpin,MSBFIRST,[$09, $FF] 'BCD decode mode on
high load:low load
SHIFTOUT datapin,clockpin,MSBFIRST,[$0B, $07] 'scan limit 8 digits
high load:low load
SHIFTOUT datapin,clockpin,MSBFIRST,[$0f, $00] 'display test off
high Load


MAIN:
PAUSE 2000
DBYTE1=0:DBYTE2=0:DBYTE3=0:DBYTE4=0:DBYTE5=0

CNTR=32'NUMBER OF BITS OF BINARY INPUT VARIABLE
BBIN4=$00'MSB
BBIN3=$FF
BBIN2=$FF
BBIN1=$FF'LSB

CYCLE:
GOSUB CHECK

DBYTE5=DBYTE5<<1
DBYTE5=DBYTE5+DBYTE4.7
DBYTE4=DBYTE4<<1
DBYTE4=DBYTE4+DBYTE3.7
DBYTE3=DBYTE3<<1
DBYTE3=DBYTE3+DBYTE2.7
DBYTE2=DBYTE2<<1
DBYTE2=DBYTE2+DBYTE1.7
DBYTE1=DBYTE1<<1
DBYTE1=DBYTE1+BBIN4.7
BBIN4=BBIN4<<1
BBIN4=BBIN4+BBIN3.7
BBIN3=BBIN3<<1
BBIN3=BBIN3+BBIN2.7
BBIN2=BBIN2<<1
BBIN2=BBIN2+BBIN1.7
BBIN1=BBIN1<<1

CNTR=CNTR-1
IF CNTR>0 THEN GOTO CYCLE

SEROUT2 PORTC.0,84,[BIN4 DBYTE5>>4,":",BIN4 DBYTE5&$0F,":",BIN4 DBYTE4>>4,":",BIN4 DBYTE4&$0F,":",BIN4 DBYTE3>>4,":",BIN4 DBYTE3&$0F,":",BIN4 DBYTE2>>4,":",BIN4 DBYTE2&$0F,":",BIN4 DBYTE1>>4,":",BIN4 DBYTE1&$0F,10,13]

'DISPLAY RESULT ON MAX7219 DISPLAY MODULE


low load
shiftout datapin,clockpin,MSBFIRST,[$08, DBYTE4>>4] ' MSB DIGIT 7
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$07, DBYTE4&$0F] ' DIGIT 6
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$06, DBYTE3>>4] ' DIGIT 5
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$05, DBYTE3&$0F] ' DIGIT 4
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$04, DBYTE2>>4] ' DIGIT 3
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$03, DBYTE2&$0F] ' DIGIT 2
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$02, DBYTE1>>4] ' DIGIT 1
high load:low load
shiftout datapin,clockpin,MSBFIRST,[$01, DBYTE1&$0F] ' DIGIT 0
high load
pause 1000
goto main
END

CHECK:
IF (DBYTE1&$0F)>=5 THEN DBYTE1=DBYTE1+$03'+3 TO LOWER NIBBLE IF >= TO 5
if (DBYTE1>>4)>=5 then DBYTE1=DBYTE1+$30'+3 TO UPPER NIBBLE IF >= TO 5
IF (DBYTE2&$0F)>=5 THEN DBYTE2=DBYTE2+$03'+3 TO LOWER NIBBLE IF >= TO 5
if (DBYTE2>>4)>=5 then DBYTE2=DBYTE2+$30'+3 TO UPPER NIBBLE IF >= TO 5
IF (DBYTE3&$0F)>=5 THEN DBYTE3=DBYTE3+$03'+3 TO LOWER NIBBLE IF >= TO 5
if (DBYTE3>>4)>=5 then DBYTE3=DBYTE3+$30'+3 TO UPPER NIBBLE IF >= TO 5
IF (DBYTE4&$0F)>=5 THEN DBYTE4=DBYTE4+$03'+3 TO LOWER NIBBLE IF >= TO 5
if (DBYTE4>>4)>=5 then DBYTE4=DBYTE4+$30'+3 TO UPPER NIBBLE IF >= TO 5
IF (DBYTE5&$0F)>=5 THEN DBYTE5=DBYTE5+$03'+3 TO LOWER NIBBLE IF >= TO 5
if (DBYTE5>>4)>=5 then DBYTE5=DBYTE5+$30'+3 TO UPPER NIBBLE IF >= TO 5
RETURN