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