Hallo!
ich hab mal hier was zusammen gebastelt das Funzt für mein problem.
Ich hoffe es lacht sich keiner kaputt aber zumindest kann ich damit
bis 4095 DEZ in ASCII-Umwandeln und Direkt zum Display senden.
Der Aufruf zum senden an Display fehlt hier (ist Absicht).
Hier habe ich immer den Rest der division im Stack abgelegt.
Zur Erinnerung: Ausgang war z.B. die Zahl 4030 dez in C und sollte in
Assembler übergeben werden in die Register R6 und R7 dort
steht die Zahl natürlich in Hex --> 0FBE h = 4030 dez .
$NOMOD51
$include(c51rd2.inc)
org 00h
ljmp Teilen
org 4000h
;Der hier beschriebene Ablauf gilt für einen Durchlauf
;Der Rest der Division im Register B wird im Stack abgelegt und wird
Später
;weiter verarbeitet.
;
Teilen:
MOV R6,#0Fh ; 0FBEh = 4030 dez in die Register R6 u. R7
laden
MOV R7,#0BEh ;R6 u. R7 bilden den Dividenden
LOOP: mov B,#10 ;Divisor ist 10
mov A,R6 ;Inhalt von R6 in Akku laden
div AB ;Teile A / B ( hier 0F / A = 1 Rest 5)
mov R0,A ;Das Ergebnis in Register 0 ablegen
mov A,R7 ;Lade R7 in Akku ( hier BE)
anl A,#0F0h ;Lösche das unteres nibble
orl A,B ;Verodere Akku mit Bilfsakku B (Ergebnis =
B5)
swap A ;vertausche Akkuinhalt (Ergebnis = 5B) neuer
Dividend
mov B,#10 ;Divisor ist 10
div AB ;Teile A / B ( hier 5B / A = 9 Rest 1)
swap A ;vertausche Akkuinhalt (Ergebnis = 90)
mov R1,A ;Das Ergebnis in Register 1 ablegen
mov A,R7 ;Lade R7 in Akku ( hier BE)
swap A ;vertausche Akkuinhalt (Ergebnis = EB)
anl A,#0F0h ;Lösche das unteres nibble
orl A,B ;Verodere Akku mit Bilfsakku B (Ergebnis =
E1)
swap A ;vertausche Akkuinhalt (Ergebnis = 1E)
mov B,#10 ;Divisor ist 10
div AB ;Teile A / B ( hier 1E / A = 3 Rest 0)
orl A,R1 ;Verodere Akku mit Bilfsakku B (Ergebnis =
93)
mov R1,A ;Das Ergebnis in Register 1 ablegen
mov a,R0 ;Neuer Dividend in Register 6 u. 7 ablegen
mov R6,A
mov A,R1
mov R7,A
push B ;Rest der divison im Stack ablegen
cjne R7,#0,LOOP ;Widerhole bis Register 7 null ist
pop B ;Stelle den Letzten Rest der Division
;wieder her. ( hier 4)
mov A,#48 ;Lade den ASCII- Code für 0 (hier 30h)
orl A,B ;wird nun ASCII = 4 (hier 34h)
pop B ;Stelle den Letzten Rest der Division
;wieder her. ( hier 0)
mov A,#48 ;Lade den ASCII- Code für 0 (hier 30h)
orl A,B ;Aus 0 wird nun ASCII = 0 (hier 30h)
pop B ;Stelle den Letzten Rest der Division
;wieder her. ( hier 3)
mov A,#48 ;Lade den ASCII- Code für 0 (hier 30h)
orl A,B ;Aus 3 wird nun ASCII = 3 (hier 33h)
POP B
sjmp LOOP
ret
END
Wenn jemand etwas besseres in Assembler einfällt darf er es hier ruhig
Posten.
MfG Klaus