10 bit Binary to BCD Conversion
Posted on the Chat Zone by Ed Grens on September 22, 2004 at 03 08 38
Code:
;======= Bin2Dec10G.asm ============= Sep 04 ========= ; Test of 10b binary to 4 digit conversion as ; based on division by powers of 10. ; ; E. A., Grens ; ; For most PICs - here for 16F628 with 4 MHz ; internal oscillator. ; ; Average processor cycles for execution of ; subroutine over the input range 0x000 to 0x3FF ; is 88. No variables required except the ; input blh, blo and the out BCD digits. ; Subroutine length 38. ;====================================================== list p=16f628 radix dec #include __config 0x3D30 ;-------Set Up RAM Variables--------------------------- blo equ 0x20 ;lsbyte of 10b binary bhi equ 0x21 ;msb d4 equ 0x23 ;msdigit d3 equ 0x24 d2 equ 0x25 d1 equ 0x26 ;lsd ;-------Program Code-------------------------------- org 0x00 ;Effective Reset Vector ; nop goto Start ;Jump by interrupt ; Start movlw 0x07 movwf CMCON ;Digital I/O movlw 0x03 ;Test input movwf bhi movlw 0xFF movwf blo movlw 0x04 call Bin2decg Hold goto Hold ;Finished Bin2decg ;10b binaey to BCD clrf d1 clrf d2 clrf d3 clrf d4 clrc rrf bhi,f ;N = 4*Q + R rrf blo,f ;blo = Q rrf d1,f ;d1 = R as temp, R25 goto B2d2 ;repeat B2d3 addwf blo,f ;get remainder ; after /100, C = 0 rlf d1,f ;*4 and add R back in rlf blo,f rlf d1,f rlf blo,f ;4*blo + R = N - ; 1000*d4 - 100*d3 movlw 10 B2d4 subwf blo,f ;blo = N - 1000*d4 - ; 100*d3 - 10*d2 skpc goto B2d5 ;blo10 goto B2d4 B2d5 addwf blo,f ;put last 10 back, C=0 movf blo,w movwf d1 return end ********************** 12-bit code Posted by Peter Hemsley on September 18, 2004 at 17 40 56 Message ; Bonus 12-Bit version ; Leaner and Meaner, 36 instructions ; Ideal for displaying A/D values Bin2DecFast movf NUMHI,w iorlw 0xF0 ;w=H2-16 movwf D1 ;D1=H2-16 addwf D1,f ;D1=H2*2-32 addwf D1,f ;D1=H2*3-48 movwf D2 ;D2=H2-16 addlw -D'5' ;w=H2-21 addwf D2,f ;D2=H2*2-37 Done! addlw D'41' ;w=H2+20 movwf D0 ;D0=H2+20 swapf NUMLO,w iorlw 0xF0 ;w=H1-16 addwf D1,f ;D1=H2*3+H1-64 addwf D0,f ;D0=H2+H1+4, C=1 rlf D0,f ;D0=(H2+H1)*2+9, C=0 comf D0,f ;D0=-(H2+H1)*2-10 rlf D0,f ;D0=-(H2+H1)*4-20 movf NUMLO,w andlw 0x0F ;w=H0 addwf D0,f ;D0=H0-(H2+H1)*4-20 Done! rlf D1,f ;C=0, D1=H2*6+H1*2-128 Done! movlw D'5' movwf D3 movlw D'10' mod0 addwf D0,f ;D(X)=D(X)mod10 decf D1,f ;D(X+1)=D(X+1)+D(X)div10 skpc goto mod0 mod1 addwf D1,f decf D2,f skpc goto mod1 mod2 addwf D2,f decf D3,f skpc goto mod2 return
See also:
Comments:
The 12 bit conversion routine, to use on PIC18, change all DECF for DECFSZ with NOP after.
DECF change carry on PIC18, not DECFSZ!
And also for all, SKPC, GOTO MODx change for BNC MODx
Michael Lee Van Dyke Says:
On the 10 bit code, the 9th instruction after the Bin2decg label is is "goto B2d2". There is no B2d2 label in the code, it will not work as it is written here.
Questions: