PICMicrocontoller Radix MathMethod

Binary to BCD half-packed 8 bit to 3 digit

From: Scott Dattalo, notes

Comments added by Alex Forencich

```
;********************************
;binary_to_bcd - 8-bits
;
;Input
;  bin  - 8-bit binary number
;   A1*16+A0
;Outputs
; hundreds - the hundreds digit of the BCD conversion
; tens_and_ones - the tens and ones digits of the BCD conversion
binary_to_bcd:

CLRF    hundreds
SWAPF   bin, W      ; swap the nibbles
ADDWF   bin, W      ; so we can add the upper to the lower
ANDLW   B'00001111' ; lose the upper nibble (W is in BCD from now on)
SKPNDC              ; if we carried a one (upper + lower > 16)
ADDLW  0x16        ; add 16 (the place value) (1s + 16 * 10s)
SKPNDC              ; did that cause a carry from the 1's place?
ADDLW  0x06        ; if so, add the missing 6 (carry is only worth 10)
ADDLW   0x06        ; fix max digit value by adding 6
SKPDC               ; if was greater than 9, DC will be set
ADDLW  -0x06       ; if if it wasn't, get rid of that extra 6

BTFSC   bin,4       ; 16's place
ADDLW  0x16 - 1 + 0x6  ; add 16 - 1 and check for digit carry
SKPDC
ADDLW  -0x06       ; if nothing carried, get rid of that 6

BTFSC   bin, 5      ; 32nd's place
ADDLW  0x30        ; add 32 - 2

BTFSC   bin, 6      ; 64th's place
ADDLW  0x60        ; add 64 - 4

BTFSC   bin, 7      ; 128th's place
ADDLW  0x20        ; add 128 - 8 % 100

ADDLW   0x60        ; has the 10's place overflowed?
RLF     hundreds, F ; pop carry in hundreds' LSB
BTFSS   hundreds, 0 ; if it hasn't
ADDLW  -0x60       ; get rid of that extra 60

MOVWF   tens_and_ones   ; save result
BTFSC   bin,7       ; remeber adding 28 - 8 for 128?
INCF   hundreds, F ; add the missing 100 if bit 7 is set

RETURN              ; all done!

```

Note: SKPDC is equivalent to BTFSS STATUS, DC and SKPNDC is equivalent to BTFSC STATUS, DC

Same code optimized for the PIC18F instruction set:

```
binary_to_bcd:
clrf    hundreds
swapf   bin, W, A   ; swap the nibbles
addwf   bin, W, A   ; so we can add the upper to the lower
andlw   B'00001111' ; and lose the upper nibble (W is in BCD from now on)
btfsc   STATUS, DC, A   ; if we carried a one (upper + lower > 16)
addlw  0x16        ; add 16 (the place value) (1s + 16 * 10s)
daw                 ; check for digit overflows

btfsc   bin, 4, A   ; 16's place
addlw  0x16 - 1    ; add 16 - 1

btfsc   bin, 5, A   ; 32nd's place
addlw  0x30        ; add 32 - 2

btfsc   bin, 6, A     ; 64th's place
addlw  0x60        ; add 64 - 4

btfsc   bin, 7, A   ; 128th's place
addlw  0x20        ; add 128 - 8 % 100

daw                 ; check for digit overflows
rlcf    hundreds, F ; pop carry in hundreds' LSB

movwf   tens_and_ones
btfsc   bin,7, A    ; remember adding 28 - 8 for 128?
incf   hundreds, F ; add the missing 100 if bit 7 is set

return

```

Don't need the hundreds? Get rid of everything after the second daw up to the return. The result will end up in W in that case, just add a movwf if the result is needed elsewhere. Want to pass in the byte in W? Just add a movwf bin at the beginning.

Comments:

• -Remove-cm.humayun87TakeThisOuT at KILLspamgmail.com " Wow this is just Remarkable
I don't understand how does it work but this is great" +
• If you are using PIC 18F you should Replace RLF by RLCF after the 2nd DAW
whoever wrote it... Good job+
• Thank you very much for posting the program and the comments on it.
It works pretty well.
Margie Martin+

Says:

I am a Newbie and this is the exact information i was looking for, it works great. The only thing is i don't know how this code actually works, maybe i try to figure it out when i learn more about asm.
+

Questions:

• I looked at the notes about this code, but I still can not understand the code. Can someone give a little more explanation about this. Please reply to hanzhangusa@yahoo.com. Thanks.+

Archive:

 file: /Techref/microchip/math/radix/b2bhp-8b3d.htm, 5KB, , updated: 2015/9/11 09:04, local time: 2024/9/11 04:01, owner: JAF-AE-AA8, TOP NEW HELP FIND:  3.236.100.210:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?Please DO link to this page! Digg it! / MAKE! PIC Microcontoller Radix Math Method Binary to BCD half-packed 8 bit to 3 digit

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.

Link? Put it here:
if you want a response, please enter your email address:
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
 Did you find what you needed? "No. I'm looking for: " "No. Take me to the search page." "No. Take me to the top so I can drill down by catagory" "No. I'm willing to pay for help, please refer me to a qualified consultant"

.