[color=Green]' Program to demonstrate 32-bit binary to BCD convertion
' PUSHRAM / POPRAM not supported on all chips[/color]
[color=Navy]#picaxe [/color][color=Black]40X2[/color]
[color=Navy]#no_table
#freq [/color][color=Blue]m32[/color]
[color=Navy]#terminal 38400[/color]
[color=Blue]setfreq em32[/color]
[color=Green]'pushram clear
;w1 = $0135
;w0 = $f119
;
;gosub BIN2BCD
;gosub ShowBcdDigits
;
;' Save b6 - b15 into other variables if needed.
;'popram ; Note that converted number will go away with this command.
;
;pushram clear
;
;w1 = $0000
;w0 = $0015
;
;gosub BIN2BCD
;gosub ShowBcdDigits[/color]
[color=Blue]pause [/color][color=Navy]1[/color]
[color=Blue]sertxd(cr[/color][color=Black],[/color][color=Blue]lf[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)[/color]
[color=Green]'sertxd("ShowBcdDigits",cr,lf)[/color]
[color=Blue]sertxd([/color][color=Red]"ShowBcdDigits Rev.2"[/color][color=Black],[/color][color=Blue]cr[/color][color=Black],[/color][color=Blue]lf)
for [/color][color=Purple]w11 [/color][color=DarkCyan]= [/color][color=Navy]$0b50 [/color][color=Blue]to [/color][color=Navy]$0c1f
[/color][color=Blue]for [/color][color=Purple]w10 [/color][color=DarkCyan]= [/color][color=Navy]$0000 [/color][color=Blue]to [/color][color=Navy]$0001
[/color][color=Green]'pushram clear
[/color][color=Purple]w0 [/color][color=DarkCyan]= [/color][color=Purple]w10 [/color][color=Black]: [/color][color=Purple]w1 [/color][color=DarkCyan]= [/color][color=Purple]w11
[/color][color=Blue]gosub [/color][color=Black]BIN2BCD
[/color][color=Blue]gosub [/color][color=Black]ShowBcdDigits2
[/color][color=Green]'popram ; Note that converted number will go away with this command.
[/color][color=Blue]next
next[/color]
[color=Green]' Save b6 - b15 into other variables if needed.
'popram ; Note that converted number will go away with this command.[/color]
[color=Blue]end[/color]
[color=Black]BIN2BCD: [/color][color=Green]' ACKNOWLEDGEMENT: PICAXE forum's BillBWann's routine for binary to BCD.
' Texasclodhopper's fitting it into using only b0 - b15.
' Binary to BCD Conversion
' All calculations contained within first 16 bytes; b0 - b15
' Pass double-word value in w0 and w1
' Calling program should do "PUSHRAM clear" before calling
' RETURNS: BCD number returned starting at b6 up to b15.
' w0 ; LSW b1, b0
' b0 ; LSWL
' b1 ; LSWH
' w1 ; MSW b3, b2
' b2 ; MSWL
' b3 ; MSWH
[/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]6 [/color][color=Green]'push remainders onto stack starting b6
[/color][color=Blue]do
[/color][color=Purple]b5 [/color][color=DarkCyan]= [/color][color=Purple]w1 [/color][color=DarkCyan]// [/color][color=Navy]10 [/color][color=Green]; MSW b3, b2
[/color][color=Purple]b4 [/color][color=DarkCyan]= [/color][color=Purple]b1 [/color][color=Green]; LSWH b1
[/color][color=Purple]w1 [/color][color=DarkCyan]= [/color][color=Purple]w1 [/color][color=DarkCyan]/ [/color][color=Navy]10 [/color][color=Green]; MSW b3, b2
[/color][color=Purple]b1 [/color][color=DarkCyan]= [/color][color=Purple]w2 [/color][color=DarkCyan]/ [/color][color=Navy]10 [/color][color=Green]; temp w2 b5, b4
[/color][color=Purple]b5 [/color][color=DarkCyan]= [/color][color=Purple]w2 [/color][color=DarkCyan]// [/color][color=Navy]10 [/color][color=Green]; temp w2 b5, b4
[/color][color=Purple]b4 [/color][color=DarkCyan]= [/color][color=Purple]b0 [/color][color=Green]; LSWL b0
[/color][color=Purple]b0 [/color][color=DarkCyan]= [/color][color=Purple]w2 [/color][color=DarkCyan]/ [/color][color=Navy]10 [/color][color=Green]; temp w2 b5, b4
[/color][color=Purple]@bptrinc [/color][color=DarkCyan]= [/color][color=Purple]w2 [/color][color=DarkCyan]// [/color][color=Navy]10 [/color][color=Green]; temp w2 b5, b4
[/color][color=Blue]loop until [/color][color=Purple]w0 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=DarkCyan]AND [/color][color=Purple]w1 [/color][color=DarkCyan]= [/color][color=Navy]0
[/color][color=Blue]dec [/color][color=Purple]bptr [/color][color=Green]; added per BillBWann July 5, 2015
[/color][color=Blue]return[/color]
[color=Black]ShowBcdDigits:[/color]
[color=Green]' Sends BCD digits to serial one digit at a time
[/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]15 [/color][color=Green]' for b15 starting point
[/color][color=Blue]do
if [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]15 [/color][color=DarkCyan]AND [/color][color=Purple]@bptr [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then
sertxd([/color][color=Red]" "[/color][color=Blue])
dec [/color][color=Purple]bptr
[/color][color=Blue]elseif [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]14 [/color][color=DarkCyan]AND [/color][color=Purple]@bptr [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then
sertxd([/color][color=Red]" "[/color][color=Blue])
dec [/color][color=Purple]bptr
[/color][color=Blue]elseif [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]13 [/color][color=DarkCyan]AND [/color][color=Purple]@bptr [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then
sertxd([/color][color=Red]" "[/color][color=Blue])
dec [/color][color=Purple]bptr
[/color][color=Blue]else
sertxd([/color][color=Black]#[/color][color=Purple]@bptrdec[/color][color=Blue])
endif
if [/color][color=Purple]bptr [/color][color=DarkCyan]= [/color][color=Navy]11 [/color][color=Blue]then [/color][color=Black]: [/color][color=Blue]sertxd([/color][color=Red]"."[/color][color=Blue]) [/color][color=Black]: [/color][color=Blue]endif
loop until [/color][color=Purple]bptr [/color][color=DarkCyan]< [/color][color=Navy]6
[/color][color=Blue]sertxd(cr[/color][color=Black],[/color][color=Blue]lf)
return[/color]
[color=Black]ShowBcdDigits2: [/color][color=Green]; added per BillBWann July 5, 2015
' Sends BCD digits to serial one digit at a time
[/color][color=Blue]for [/color][color=Purple]b0 [/color][color=DarkCyan]= [/color][color=Navy]15 [/color][color=Blue]to [/color][color=Navy]6 [/color][color=Blue]step [/color][color=DarkCyan]-[/color][color=Navy]1
[/color][color=Blue]if [/color][color=Purple]b0 [/color][color=DarkCyan]= [/color][color=Navy]11 [/color][color=Blue]then [/color][color=Black]: [/color][color=Blue]sertxd([/color][color=Red]"."[/color][color=Blue]) [/color][color=Black]: [/color][color=Blue]endif
if [/color][color=Purple]b0 [/color][color=DarkCyan]> [/color][color=Purple]bptr [/color][color=Blue]then
if [/color][color=Purple]b0 [/color][color=DarkCyan]> [/color][color=Navy]12 [/color][color=Blue]then
sertxd([/color][color=Red]" "[/color][color=Blue])
else
sertxd([/color][color=Red]"0"[/color][color=Blue])
endif
else
sertxd([/color][color=Black]#[/color][color=Purple]@bptrdec[/color][color=Blue])
endif
next [/color][color=Purple]b0
[/color][color=Blue]sertxd(cr[/color][color=Black],[/color][color=Blue]lf)
return[/color]