Hallo zusammen,
vielleicht hat ja hier jemand eine Lösung um den Schönheitsfehler zu verbessern.
![Klicke auf die Grafik für eine größere Ansicht
Name: OUT_VAL_formatiert.jpg
Hits: 6
Größe: 57,9 KB
ID: 35667](https://www.roboternetz.de/community/attachment.php?attachmentid=35667&d=1639422966&thumb=1)
Bleibt leider immer noch der Schönheitsfehler mit dem Minuszeichen,
welches nicht direkt vor dem Wert steht. Außer natürlich es ist ein
hunderter Wert.
Ach, übrigens - auch wenn am Ende, bzw. überhaupt kein RET-Befehl steht,
ist diese Routine mit einem RCALL,- oder CALL-Befehl aufzurufen.
Code:
;************************************************************************/
;* */
;* Display values on LCD */
;* */
;* Author: Peter Dannegger */
;* danni@specs.de */
;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt */
;************************************************************************/
;************************************************************************/
;-------------------------------------------------------------------------
; Anzeige ohne fuehrende Nullen
;-------------------------------------------------------------------------
;input: a = value 0..255
;used: a, b, c
;
_dec_out:
tst a ;Negativer Wert ?
brpl _positiv ;Nein -> springen
mov c,a ;Wert sichern
ldi a,$10 ;Cursor einen nach links um bei Minus Anzeige..
rcall _lcd_cmd ;..noch formatiert zu bleiben
ldi a,'-'
rcall _dou4 ;Zeichen ausgeben
mov a,c ;gesicherten Wert zurueck holen
neg a ;In positives Aquivalent umwandeln
_positiv:
mov c, a ;Wert f. weiterverarbeitung kopieren
subi c, 100 ;Hunderter ermitteln
brcc _hunderter ;if > = 100, die hunderter Stelle auswerten..
ldi a,' ' ;..ansonsten die hunderter Stelle durch Space ersetzen..
clt ;Keine Hunderter vorhanden
rjmp _dou2 ;..und dies ausgeben
_hunderter:
set ;Hunderter vorhanden
mov c, a ;Wert wieder neu laden und..
ldi a, '0' - 1 ;..Hunderter zaehlen..
_dou1:
inc a ;..wobei die Ziffer in ASCII umgewandelt wird
subi c, 100 ;100 subtrahieren
brcc _dou1 ;< 100 -> Nein -> weiter zaehlen
_dou2:
rcall _dou4 ;output hundrets
_zehner:
ldi a, '0' +10 ;Zehnerstelle in ASCII umwandeln..
_dou3:
dec a ;..und ASCII rueckwaerts von '9'
subi c, -10 ;Zehner x +10
brcs _dou3 ;Zehner gezaehlt ? NEIN -> weiter zaehlen
rcall _dou5 ;output tens
subi c,-'0' ;Einerstelle in ASCII uberfuehren
mov a, c ;output ones
_dou4:
rjmp _lcd_data ;ASCII-Zeichen ausgeben
_dou5:
cpi a, '0' ;Ist die Zehnerziffer eine Null ?..
brne _dou4 ;..Nein -> Zehnerziffer ausgeben..
brts _dou4 ;Waren vorher Hunderter vorhanden ? Ja -> Null ausgeben
ldi a,' ' ;..Nein -> Null durch Space ersetzen und..
rjmp _dou4 ;..jetzt ausgeben
;------------------------------------------------------------------------------
Seht evtl. auch hier nach :
https://www.mikrocontroller.net/topic/6516#6909211
Beziehungsweise überhaupt beim Ursprung :
https://www.mikrocontroller.net/topic/6516#41903
Bernd_Stein
Lesezeichen