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
10 Bit ist im Extremfall vierstellig (0-1023) oder dreistellig mit Vorzeichen.
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
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
@Peter Dannegger wenn ich zum Beispiel die zahl 3600 habe, welche zahl befindet sich dann in welchem Register? gruss
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.