| 
 All about PIC microcontrollers
 
 Within these pages, you can find many useful pieces of code mostly in assembly for the Microchip PIC micro controller family. A lot of people have spend many hours trying to put the bits and bytes together. If the code is NOT written by a member of the PCB Heaven community, then a link will be added above the code with the original website that this code was found.
 Because the code is copied to our servers, you should know that:
 
 
 
The responsible web master of the website that the code is taken, has been informed and he has agreed to copy the codeAll emails from the above contact have been kept as records but due to personal privacy cannot be shown in public. The author of the code is always clearly indicated above the code. In some cases the author is unknown. If you happen to be the author of the code or you know the person who wrote it, please inform us by email and it will be added ASAP. We would personally like to send the credits to all the people that managed to write some very interesting code and publish it, and special thanx to the people that originally hosted those code snippets and gave us the permission to copy them.
 
 
 View code
 Binary to BCD unpacked 16 bit to 5 digit
 Author: John Payson
 This code was originally located @ http://www.piclist.com
 
 
 Follow this link to go back
 
 
 | ;Takes hex number in NumH:NumL  Returns decimal in ;TenK:Thou:Hund:Tens:Ones ;written by John Payson
 
 ;input
 ;=A3*163 + A2*162 + A1*161 + A0*160
 ;=A3*4096 + A2*256 + A1*16 + A0
 NumH            EQU AD3M        ;A3*16+A2
 NumL            EQU AD3L	;A1*16+A0
 ;share variables
 ;=B4*104 + B3*103 + B2*102 + B1*101 + B0*100
 ;=B4*10000 + B3*1000 + B2*100 + B1*10 + B0
 TenK            EQU LOOPER      ;B4
 Thou            EQU D2		;B3
 Hund            EQU D1		;B2
 Tens            EQU R2		;B1
 Ones            EQU R1		;B0
 
 swapf	NumH,w	;w  = A2*16+A3
 andlw   0x0F     ;w  = A3		*** PERSONALLY, I'D REPLACE THESE 2
 addlw   0xF0	;w  = A3-16	*** LINES WITH "IORLW b'11110000B' " -AW
 movwf   Thou	;B3 = A3-16
 addwf   Thou,f	;B3 = 2*(A3-16) = 2A3 - 32
 addlw   .226	;w  = A3-16 - 30 = A3-46
 movwf   Hund	;B2 = A3-46
 addlw   .50	;w  = A3-46 + 50 = A3+4
 movwf   Ones	;B0 = A3+4
 
 movf    NumH,w	;w  = A3*16+A2
 andlw   0x0F	;w  = A2
 addwf   Hund,f	;B2 = A3-46 + A2 = A3+A2-46
 addwf   Hund,f	;B2 = A3+A2-46  + A2 = A3+2A2-46
 addwf   Ones,f	;B0 = A3+4 + A2 = A3+A2+4
 addlw   .233	;w  = A2 - 23
 movwf   Tens	;B1 = A2-23
 addwf   Tens,f	;B1 = 2*(A2-23)
 addwf   Tens,f	;B1 = 3*(A2-23) = 3A2-69 (Doh! thanks NG)
 
 swapf   NumL,w	;w  = A0*16+A1
 andlw   0x0F	;w  = A1
 addwf   Tens,f	;B1 = 3A2-69 + A1 = 3A2+A1-69 range -69...-9
 addwf   Ones,f	;B0 = A3+A2+4 + A1 = A3+A2+A1+4 and Carry = 0 (thanks NG)
 
 rlf     Tens,f	;B1 = 2*(3A2+A1-69) + C = 6A2+2A1-138 and Carry is now 1 as tens register had to be negitive
 rlf     Ones,f	;B0 = 2*(A3+A2+A1+4) + C = 2A3+2A2+2A1+9 (+9 not +8 due to the carry from prev line, Thanks NG)
 comf    Ones,f	;B0 = ~(2A3+2A2+2A1+9) = -2A3-2A2-2A1-10 (ones complement plus 1 is twos complement. Thanks SD)
 ;;Nikolai Golovchenko [golovchenko at MAIL.RU] says: comf can be regarded like:
 ;;      comf Ones, f
 ;;      incf Ones, f
 ;;      decf Ones, f
 ;;First two instructions make up negation. So,
 ;;Ones  = -1 * Ones - 1
 ;;      = - 2 * (A3 + A2 + A1) - 9 - 1
 ;;      = - 2 * (A3 + A2 + A1) - 10
 rlf     Ones,f	;B0 = 2*(-2A3-2A2-2A1-10) = -4A3-4A2-4A1-20
 
 movf    NumL,w	;w  = A1*16+A0
 andlw   0x0F	;w  = A0
 addwf   Ones,f	;B0 = -4A3-4A2-4A1-20 + A0 = A0-4(A3+A2+A1)-20 range -215...-5 Carry=0
 rlf     Thou,f	;B3 = 2*(2A3 - 32) = 4A3 - 64
 
 movlw   0x07	;w  = 7
 movwf   TenK	;B4 = 7
 
 ;B0 = A0-4(A3+A2+A1)-20	;-5...-200
 ;B1 = 6A2+2A1-138	;-18...-138
 ;B2 = A3+2A2-46		;-1...-46
 ;B3 = 4A3-64		;-4...-64
 ;B4 = 7			;7
 ; At this point, the original number is
 ; equal to TenK*10000+Thou*1000+Hund*100+Tens*10+Ones
 ; if those entities are regarded as two's compliment
 ; binary.  To be precise, all of them are negative
 ; except TenK.  Now the number needs to be normal-
 ; ized, but this can all be done with simple byte
 ; arithmetic.
 
 movlw   .10	;w  = 10
 Lb1:			;do
 addwf   Ones,f	; B0 += 10
 decf    Tens,f	; B1 -= 1
 btfss   3,0
 ;skip no carry
 goto   Lb1	; while B0 < 0
 ;jmp carry
 Lb2:			;do
 addwf   Tens,f	; B1 += 10
 decf    Hund,f	; B2 -= 1
 btfss   3,0
 goto   Lb2	; while B1 < 0
 Lb3:			;do
 addwf   Hund,f	; B2 += 10
 decf    Thou,f	; B3 -= 1
 btfss   3,0
 goto   Lb3	; while B2 < 0
 Lb4:			;do
 addwf   Thou,f	; B3 += 10
 decf    TenK,f	; B4 -= 1
 btfss   3,0
 goto   Lb4	; while B3 < 0
 
 retlw   0
 | 
 Follow this link to go back
 
 
 
 
 
 
 | 
 
 
 
 |  HOT in heaven! 
 
   | 
 
 |