10 Bit binärzahl in BCD umwandeln

(Firma: Druckerei Beste) #844373
Lesenswert?
• ▲
▼
Am besten unterteils du die 10 Bit in Gruppen: (2 + 4 + 4) Bit. Dann 
kriegst du x = a2 * 256 + a1 * 16 + a0.

Daraus machst du dir vier Bytes, die die einzelnen Stellen enthalten: x 
= 1000 * d3 + 100 *  d2 + 10 * d1 + d0. Daraus ergibt sich

b0 = a0 + 6 * (a1 + a2)
b1 = a1 + 5 * a2 + s * a3 + (b0 / 10)
b2 = 2 * a2               + (b1 / 10)
b3 = 0                    + (b2 / 10)

und daraus dann:

d0 = b0 % 10
d1 = b1 % 10
d2 = b2 % 10
d3 = b3 % 10

Ziemlich trickreich, das Ganze! Wenn du die ai mit 2, 5, oder 6 
multiplizierst, dann kommen höchstens 6 * 15 = 90 raus. Spielt sich also 
in einem Byte ab - und ist damit problemlos auf uC zu implementieren.

virtuPIC
#844487
Lesenswert?
• ▲
▼
Man benutze die übliche 16Bit auf Dezimal Ausgaberoutine und lasse die 2 
höherwertigen Digits weg:
1
;*************************************************************************
2
;*                                                                       *
3
;*                      Convert unsigned 16bit to ASCII                  *
4
;*                                                                       *
5
;*              Author: Peter Dannegger                                  *
6
;*                                                                       *
7
;*************************************************************************
8
;
9
;input: R6, R7= 16 bit value 0 ... 65535
10
;output: R3, R4, R5, R6, R7 = 5 digits (ASCII)
11
;
12
bin16_ascii:
13
        mov     a, r7
14
        mov     r3, #-1 + '0'
15
_bcd1:  inc     r3
16
        add     a, #low(-10000)
17
        xch     a, r6
18
        addc    a, #high(-10000)
19
        xch     a, r6
20
        jc      _bcd1
21
        mov     r4, #10 + '0'
22
_bcd2:
23
        dec     r4
24
        add     a, #low(1000)
25
        xch     a, r6
26
        addc    a, #high(1000)
27
        xch     a, r6
28
        jnc     _bcd2
29
        mov     r5, #-1 + '0'
30
_bcd3:
31
        inc     r5
32
        add     a, #low(-100)
33
        xch     a, r6
34
        addc    a, #high(-100)
35
        xch     a, r6
36
        jc      _bcd3
37
        mov     r6, #10 + '0'
38
_bcd4:
39
        dec     r6
40
        add     a, #10
41
        jnc     _bcd4
42
        add     a, #'0'
43
        mov     r7, a
44
        ret
45
;-------------------------------------------------------------------------
46
end

Wenn keine ASCII-Ausgabe gewünscht wird, einfach alle '0' durch 0 
ersetzen.


Peter
Gast #850830
Lesenswert?
• ▲
▼
@ Peter Dannegger

Hast du wirklich schön programmiert.
Ich würde nur gerne mal wissen, wie rufe ich dieses Unterprogramm 
"formal" richtig auf, wie übergebe ich Daten, wie bekomme ich Daten 
zurück.
Du magst die Frage vieleicht dämmlich finden, sie hat aber durchaus ihre 
Berechtigung.
#850860
Lesenswert?
• ▲
▼
Tagträumer wrote:
> @ Peter Dannegger
>
> Hast du wirklich schön programmiert.
> Ich würde nur gerne mal wissen, wie rufe ich dieses Unterprogramm
> "formal" richtig auf, wie übergebe ich Daten, wie bekomme ich Daten
> zurück.

Steht eigentlich oben drüber:
1
;input: R6, R7= 16 bit value 0 ... 65535
2
;output: R3, R4, R5, R6, R7 = 5 digits (ASCII)
D.h. der 16Bit-Wert muß in R6 und R7 übergeben werden.
Üblicher Weise schreibt man das höherwertige Register links
(wie bei Zahlen auch).
Also R6 mit dem High-Byte laden und R7 mit dem Low-Byte
Und dann:
1
call bin16_ascii
Und danach ist in R3 die 10000-Stelle usw.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren