From: Juan Mayoral
Based on these two documents from the code library: 1): Binary to BCD half-packed 8 bit to 3 digit From: Scott Dattalo, notes 2): Binary to BCD unpacked 16 bit to 5 digit From: John Payson via Scott Dattalo I wrote this linear code to convert binary to bcd unpacked. The code isn't too short (131 words), but it always takes the same time. aar0 = binary number low byte aar1 = binary number high byte aac0 = bcd number ones aac1 = bcd number tens aac2 = bcd number hundreds aac3 = bcd number thousands aac4 = bcd number ten-thousands b16_d5 swapf aar0,w ; partial ones sum in low byte addwf aar0,w ; andlw 0x0f ; skpndc ; addlw 0x16 ; skpndc ; addlw 0x06 ; addlw 0x06 ; skpdc ; addlw -0x06 ; wmax=3:0 ; btfsc aar0,4 ; complete ones sum in low byte addlw 0x15+0x06 skpdc addlw -0x06 ; wmax=4:5 movwf aac0 ; save sum in aac0 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 20 ; 100 60 30 15+ ; ---------------------------------------------------- ; 128 64 32 16 8 4 2 1 ; swapf aar1,w ; partial ones sum in high byte addwf aar1,w ; andlw 0x0f ; skpndc ; addlw 0x16 ; skpndc ; addlw 0x06 ; addlw 0x06 ; skpdc ; addlw -0x06 ; wmax=3:0 ; btfsc aar1,0 ; complete ones sum in high byte addlw 0x05+0x06 skpdc addlw -0x06 ; wmax=3:5 ; btfsc aar1,4 addlw 0x15+0x06 skpdc addlw -0x06 ; wmax=5:0 ; addlw 0x06 ; include previous sum addwf aac0,w skpdc addlw -0x06 ; wmax=9:5, ones sum ended ; movwf aac0 movwf aac1 swapf aac1,f movlw 0x0f andwf aac0,f ; save total ones sum in aac0 andwf aac1,f ; save partial tens sum in aac1 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60 80 90 10+ 5+ ; 700 300 100 80 40 20 10 50 ; 32000 16000 8000 4000 2000 1000 500 200 ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete tens sum in low and high byte rrf aar1,w ; rotate right high byte once andlw 0x0f ; clear high nibble addlw 0x06 ; adjust bcd skpdc addlw -0x06 ; wmax=1:5 ; addlw 0x06 ; include previous sum addwf aac1,w skpdc addlw -0x06 ; wmax=2:4 ; btfsc aar0,5 addlw 0x03+0x06 skpdc addlw -0x06 ; wmax=2:7 ; btfsc aar0,6 addlw 0x06+0x06 skpdc addlw -0x06 ; wmax=3:3 ; btfsc aar0,7 addlw 0x12+0x06 skpdc addlw -0x06 ; wmax=4:5 ; btfsc aar1,0 addlw 0x25+0x06 skpdc addlw -0x06 ; wmax=7:0 ; btfsc aar1,5 addlw 0x09+0x06 skpdc addlw -0x06 ; wmax=7:9 ; btfsc aar1,6 addlw 0x08+0x06 skpdc addlw -0x06 ; wmax=8:7 ; btfsc aar1,7 addlw 0x06+0x06 skpdc addlw -0x06 ; wmax=9:3, tens sum ended ; movwf aac1 ; save total tens sum in aac1 swapf aac1,w andlw 0x0f ; load partial hundreds sum in w ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 20+ 5+ ; 100+ 60+ 30+ 10+ ; ---------------------------------------------------- ; 128 64 32 16 8 4 2 1 ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60+ 80+ 90+ 10+ 5+ ; 700 300 100 80+ 40+ 20+ 10+ 50+ ; 32000 16000 8000 4000 2000 1000 500 200+ ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete hundreds sum in high byte btfsc aar1,1 addlw 0x05+0x06 skpdc addlw -0x06 ; wmax=1:4 ; btfsc aar1,5 addlw 0x01+0x06 skpdc addlw -0x06 ; wmax=1:5 ; btfsc aar1,6 addlw 0x03+0x06 skpdc addlw -0x06 ; wmax=1:8 ; btfsc aar1,7 addlw 0x07+0x06 skpdc addlw -0x06 ; wmax=2:5, hundreds sum ended ; movwf aac2 ; save total hundreds sum in aac2 swapf aac2,w movwf aac3 ; save partial thousands sum in aac3 movlw 0x0f ; clear high nibble andwf aac1,f ; andwf aac2,f ; andwf aac3,f ; ; ; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+ ; 5+ ; 60+ 80+ 90+ 10+ 5+ ; 700+ 300+ 100+ 80+ 40+ 20+ 10+ 50+ ; 32000 16000 8000 4000 2000 1000 500+ 200+ ; ------------------------------------------------------ ; 32768 16384 8192 4096 2048 1024 512 256 ; ; complete thousands sum in low and high byte rrf aar1,w ; rotate right high byte twice movwf aac4 ; rrf aac4,w ; andlw 0x0f ; clear high nibble addlw 0x06 ; adjust bcd skpdc ; addlw -0x06 ; wmax=1:5 ; addlw 0x06 ; include previous sum addwf aac3,w skpdc addlw -0x06 ; wmax=1:7 ; btfsc aar1,6 addlw 0x16+0x06 skpdc addlw -0x06 ; wmax=3:3 ; btfsc aar1,7 addlw 0x32+0x06 skpdc addlw -0x06 ; wmax=6:5, thousands sum ended ; movwf aac3 ; save total thousands sum in aac3 movwf aac4 ; swapf aac4,f ; save ten-thousands sum in aac4 movlw 0x0f ; clear high nibble andwf aac3,f ; andwf aac4,f ; P.S.: I am a beginner in the task of programming micro controllers. And all suggestion that improves this code will be welcome. Juan Mayoral (from the end of the world). ;* * * * * * * * * * * * * * * * * *
Comments:
file: /Techref/microchip/math/radix/b2bu-16b5d-jm.htm, 6KB, , updated: 2013/5/16 11:18, local time: 2024/12/21 21:56,
3.22.75.247: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? <A HREF="http://massmind.org/techref/microchip/math/radix/b2bu-16b5d-jm.htm"> PIC Microcontoller Radix Math Method </A> |
Did you find what you needed? |
Welcome to massmind.org! |
Ashley Roll has put together a really nice little unit here. Leave off the MAX232 and keep these handy for the few times you need true RS232! |
.