From Mike McLaren, K8LH, (Westland, MI, USA)
While collaborating on a little 10F200 project recently (256 words of program memory and 16 bytes RAM) I came up with the following little Bin2Bcd routine. The additional code (PrintIt, PutDigit, etc.) simply prints the "0".."255" number as right justified with leading zero suppression;
;******************************************************************
; *
; 8 bit to 3 digit half-packed BCD, Mike McLaren, K8LH (Jan-09) *
; *
; input: WREG, 0x00..0xFF, 0..255 *
; output: tens, 0x00..0x25, packed bcd *
; ones, 0x00..0x09 *
; *
; 12 words, 2 variables
;
tens equ 0x1A ; packed BCD 'hundreds' & 'tens'
ones equ 0x1B ; single BCD 'ones'
mask equ 0x1C ;
Bin2Bcd
clrf tens ;
decf tens,F ; preset 'tens' to -1
div10 movwf ones ;
incf tens,F ; bump 'tens', 0x00..0x25
movlw 6 ; using "packed bcd" format
addwf tens,W ; bcd "digit carry"?
skpndc ; no, skip, else
movwf tens ; fix 'tens'
movlw 10 ; ones = ones - 10
subwf ones,W ; borrow?
bc div10 ; no, branch, else
PrintIt
movlw " " ; prep leading zero suppression
movwf mask ; mask = 0x20 = " " (space char)
swapf tens,W ; get hundreds, 0..2
call PutDigit ; print " " or "1".."2"
movf tens,W ; get tens, 0..9
call PutDigit ; print " " or "0".."9"
movf ones,W ; get ones, 0..9
goto PutNumber ; always print "0".."9"
PutDigit
andlw 0x0F ;
skpz ;
PutNumber
bsf mask,4 ; mask = 0x30 = "0"
iorwf mask,W ; wreg = " " or "0".."9"
goto Put232 ; Put232 or PutLCD
Comments:
Questions:
Code: