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: