Forum: Mikrocontroller und Digitale Elektronik 10 Bit binärzahl in BCD umwandeln


von Florian (Gast)


Lesenswert?

hi zusammen, ich möchte eine 10 bit zahl in eine BCD zahl (3-stellen) 
umwandeln, kann mir da jemand helfen?
habe bisher nur 8-Bit-Zahlen in BCD umgewandelt.
ich programmiere in Assembler (8051).

Gruss und danke

von Stefan B. (stefan) Benutzerseite


Lesenswert?

10 Bit ist im Extremfall vierstellig (0-1023) oder dreistellig mit 
Vorzeichen.

von Thomas B. (Firma: Druckerei Beste) (virtupic)


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

von Passi (Gast)


Lesenswert?

!!!!!!!!!

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

?????????

virtuPIC

von Peter D. (peda)


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

von Florian (Gast)


Lesenswert?

@Peter Dannegger

wenn ich zum Beispiel die zahl 3600 habe, welche zahl befindet sich dann 
in welchem Register?

gruss

von Peter D. (peda)


Lesenswert?

r3 = '0'
r4 = '3'
r5 = '6'
r6 = '0'
r7 = '0'


Peter

von Tagträumer (Gast)


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.

von Peter D. (peda)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.