Ich mach' das in 2 Etappen...
Ein Macro sichert die Inhalte der verwendeten Register und ruft das
Unterprogramm zur ASCII-Umwandlung auf.
Hier das Macro:
.macro print8 ;Registername
;Gibt Zahl im Register 2- oder 3-stellig am LCD aus.
;Parameter bestimmt das Register, in dem die Zahl liegt.
;Dieses Register wird nicht verändert.
;Kopie der Zahl temporär in xl,
push xl ;verwendete Register sichern
mov xl,@0 ;Kopie vom Quellregister
rcall lcd_print8 ;Aufruf...
pop xl ;verwendete Register wiederherstellen
.endmacro ;
Und hier das Unterprogramm:
lcd_print8: ;Wird vom Makro aufgerufen. Gibt Byte als 2 oder 3
;Ziffern an LCD aus.
push wl ;Reg sichern
ldi wl,-1+'0' ;Hunderter-Stelle als ASCII-Zeichen, Zahl ist
positiv
inc wl ;Hunderter hoch und
subi xl,100 ;100 subtrahieren bis Unterlauf erfolgt
brsh pc-2 ;Unterlauf? nein, 2 Zeilen hoch
cpi wl,'0' ;ja, ist Ziffer = "0"?
breq pc+2 ;ja, nicht ausgeben...
rcall lcd_data ;Hunderter ausgeben...
ldi wl,10+'0' ;Zehner-Stelle als ASCII-Zeichen, Zahl ist negativ
dec wl ;Zehner runter und
subi xl,-10 ;10 addieren bis Überlauf erfolgt
brlo pc-2 ;Überlauf? nein, 2 Zeilen hoch...
rcall lcd_data ;ja, Zehner Stelle ausgeben...
ldi wl,'0' ;ASCII-0
add wl,xl ;Einer addieren (Rest war ja positiv)
rcall lcd_data ;Einer ausgeben...
pop wl ;Reg wiederherstellen
ret ;zurück
Da man gelegentlich auch andere Zahlenformate in ASCII-Text umwandeln
und am LCD ausgeben muss, ist diese Routine Teil einer Sammlung
ähnlicher Routinen für andere Formate, die so nach und nach gewachsen
ist.
Weitere Beispiele findest du in der Codesammlung oder wenn du mal nach
"8x24" oder "4x27" suchst und die dort gefundenen Links verfolgst.
...