Hallo zusammen,
vielleicht hat ja hier jemand eine Lösung um den Schönheitsfehler zu verbessern.
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