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

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