beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 115<br />
; Bin2ToAsc<br />
; =========<br />
; wan<strong>de</strong>lt eine 16-Bit-Binärzahl in eine fünfstellige ASCII-kodierte Dezimalzahl um,<br />
Zeiger<br />
; zeigt auf die erste signifikante Ziffer <strong>de</strong>r Zahl, und gibt Anzahl <strong>de</strong>r Ziffern zurück<br />
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf Anfang <strong>de</strong>r Zahl (5 Stellen<br />
; erfor<strong>de</strong>rlich, auch bei kleineren Zahlen!)<br />
; Rückkehr: Z zeigt auf erste signifikante Ziffer <strong>de</strong>r ASCII-kodierten Zahl, rBin2L<br />
enthält<br />
; Länge <strong>de</strong>r Zahl (1..5)<br />
; Benutzte Register: rBin1H:L (bleibt erhalten), rBin2H:L (wird überschrieben), rmp<br />
; Aufgerufene Unterroutinen: Bin2ToBcd5, Bin2ToAsc5<br />
;<br />
Bin2ToAsc:<br />
rcall Bin2ToAsc5 ; Wandle Binärzahl in ASCII<br />
ldi rmp,6 ; Zähler auf 6<br />
mov rBin2L,rmp<br />
Bin2ToAsca:<br />
<strong>de</strong>c rBin2L ; verringere Zähler<br />
ld rmp,z+ ; Lese Zeichen und erhöhe Zeiger<br />
cpi rmp,' ' ; war Leerzeichen?<br />
breq Bin2ToAsca ; Nein, war nicht<br />
sbiw ZL,1 ; ein Zeichen rückwärts<br />
ret ; fertig<br />
; Bin2ToBcd5<br />
; ==========<br />
; wan<strong>de</strong>lt 16-Bit-Binärzahl in 5-stellige BCD-Zahl um<br />
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf die erste Stelle <strong>de</strong>r BCD-kodierten<br />
; Resultats<br />
; Stellen: Die BCD-Zahl hat exakt 5 gültige Stellen.<br />
; Rückkehr: Z zeigt auf die höchste BCD-Stelle<br />
; Benötigte Register: rBin1H:L (wird erhalten), rBin2H:L (wird nicht erhalten), rmp<br />
; Aufgerufene Unterroutinen: Bin2ToDigit<br />
;<br />
Bin2ToBcd5:<br />
push rBin1H ; Rette Inhalt <strong>de</strong>r Register rBin1H:L<br />
push rBin1L<br />
ldi rmp,HIGH(10000) ; La<strong>de</strong> 10.000 in rBin2H:L<br />
mov rBin2H,rmp<br />
ldi rmp,LOW(10000)<br />
mov rBin2L,rmp<br />
rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen<br />
ldi rmp,HIGH(1000) ; La<strong>de</strong> 1.000 in rBin2H:L<br />
mov rBin2H,rmp<br />
ldi rmp,LOW(1000)<br />
mov rBin2L,rmp<br />
rcall Bin2ToDigit ; Ermittle 4.Stelle durch Abziehen<br />
ldi rmp,HIGH(100) ; La<strong>de</strong> 100 in rBin2H:L<br />
mov rBin2H,rmp<br />
ldi rmp,LOW(100)<br />
mov rBin2L,rmp<br />
rcall Bin2ToDigit ; Ermittle 3.Stelle durch Abziehen<br />
ldi rmp,HIGH(10) ; La<strong>de</strong> 10 in rBin2H:L<br />
mov rBin2H,rmp<br />
ldi rmp,LOW(10)<br />
mov rBin2L,rmp<br />
rcall Bin2ToDigit ; Ermittle 2.Stelle durch Abziehen<br />
st z,rBin1L ; Rest sind Einer<br />
sbiw ZL,4 ; Setze Zeiger Z auf 5.Stelle (erste Ziffer)<br />
pop rBin1L ; Stelle <strong>de</strong>n Originalwert wie<strong>de</strong>r her<br />
pop rBin1H<br />
ret ; und kehre zurück<br />
; Bin2ToDigit<br />
; ===========<br />
; ermittelt eine <strong>de</strong>zimale Ziffer durch fortgesetztes Abziehen einer binär kodierten<br />
; Dezimalstelle