HEX nach DEZ umrechenen für LCD ?

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 18 10 2024  13:26:13      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
HEX nach DEZ umrechenen für LCD ?
Suche nach: lcd (4682)

    







BID = 93453

Condor-x

Gelegenheitsposter



Beiträge: 56
 

  


Hallo

habe einen AVR mit LCD display und über I2C einen LM 75.

vom LM 75 bekomme ich die temperatur in Hex(1 byte)
für das LCD brauche ich sie aber in 3 DEZ zahlen z.b.1 0 5...
gibt es einen einfachen trick sowas umzurechnen ?



BID = 93482

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  

Was du suchst ist eine Binär zu BCD-Wandlung.

Einen Trick dafür mittels des DAA-Befehls gab es auf den CISC-Prozessoren, aber da der AVR so etwas nicht hat, solltest du dir mal die vom Hersteller gelieferten Beispiele oder Mathe-Libs anschauen.

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 93510

ERDI-Soft

Stammposter



Beiträge: 200
Wohnort: Offenburg
Zur Homepage von ERDI-Soft ICQ Status  

Gabs hier schonmal:

https://forum.electronicwerkstatt.d.....al%2A

_________________
Wie immer gilt: Erst googeln, dann fragen!

(Für ICQ bitte erst Anfrage per PM, da alles andere nicht angenommen wird.)

BID = 93609

Jornbyte

Moderator



Beiträge: 7155

Ein Beispiel in ASM:

; Bin2ToAsc5
; ==========
; wandelt eine 16-Bit-Binärzahl in eine fünfstellige ASCII-
; kodierte Dezimalzahl um
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf Anfang
; der Zahl
; Rückkehr: Z zeigt auf Anfang der Zahl, führende Nullen sind
; mit Leerzeichen überschrieben
; Benutzte Register: rBin1H:L (bleibt erhalten), rBin2H:L
; (wird überschrieben), rmp
; Aufgerufene Unterroutinen: Bin2ToBcd5
;
Bin2ToAsc5:
rcall Bin2ToBcd5 ; wandle Binärzahl in BCD um
ldi rmp,4 ; Zähler auf 4
mov rBin2L,rmp
Bin2ToAsc5a:
ld rmp,z ; Lese eine BCD-Ziffer
tst rmp ; prüfe ob Null
brne Bin2ToAsc5b ; Nein, erste Ziffer ungleich 0 gefunden
ldi rmp,' ' ; mit Leerzeichen überschreiben
st z+,rmp ; und ablegen
dec rBin2L ; Zähler um eins senken
brne Bin2ToAsc5a ; weitere führende Leerzeichen
ld rmp,z ; Lese das letzte Zeichen
Bin2ToAsc5b:
inc rBin2L ; Ein Zeichen mehr
Bin2ToAsc5c:
subi rmp,-'0' ; Addiere ASCII-0
st z+,rmp ; und speichere ab, erhöhe Zeiger
ld rmp,z ; nächstes Zeichen lesen
dec rBin2L ; noch Zeichen behandeln?
brne Bin2ToAsc5c ; ja, weitermachen
sbiw ZL,5 ; Zeiger an Anfang
ret ; fertig

Bin2To5:
rcall Bin2ToBcd5 ; wandle Binärzahl in BCD um
ldi rmp,4 ; Zähler auf 4 ist Kommastelle
mov rBin2L,rmp
Bin2To5a:
ld rmp,z ; Lese eine BCD-Ziffer
ld rmp,z ; Lese das letzte Zeichen
Bin2To5b:
inc rBin2L ; Ein Zeichen mehr
Bin2To5c:
subi rmp,-'0' ; Addiere ASCII-0
st z+,rmp ; und speichere ab, erhöhe Zeiger
ld rmp,z ; nächstes Zeichen lesen
dec rBin2L ; noch Zeichen behandeln?
brne Bin2To5c ; ja, weitermachen
sbiw ZL,5 ; Zeiger an Anfang
ret ; fertig
;
; Bin2ToBcd5
; ==========
; wandelt 16-Bit-Binärzahl in 5-stellige BCD-Zahl um
; Aufruf: 16-Bit-Binärzahl in rBin1H:L, Z zeigt auf die
; erste Stelle der BCD-kodierten Resultats
; Stellen: Die BCD-Zahl hat exakt 5 gültige Stellen.
; Rückkehr: Z zeigt auf die höchste BCD-Stelle
; Benötigte Register: rBin1H:L (wird erhalten), rBin2H:L
; (wird nicht wieder hergestellt), rmp
; Aufgerufene Unterroutinen: Bin2ToDigit
;
Bin2ToBcd5:
push rBin1H ; Rette Inhalt der Register rBin1H:L
push rBin1L
ldi rmp,HIGH(10000) ; Lade 10.000 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(10000)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen
ldi rmp,HIGH(1000) ; Lade 1.000 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(1000)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 4.Stelle durch Abziehen
ldi rmp,HIGH(100) ; Lade 100 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(100)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 3.Stelle durch Abziehen
ldi rmp,HIGH(10) ; Lade 10 in rBin2H:L
mov rBin2H,rmp
ldi rmp,LOW(10)
mov rBin2L,rmp
rcall Bin2ToDigit ; Ermittle 2.Stelle durch Abziehen
st z,rBin1L ; Rest sind Einer
sbiw ZL,4 ; Setze Zeiger Z auf 5.Stelle (erste Ziffer)
pop rBin1L ; Stelle den Originalwert wieder her
pop rBin1H
ret ; und kehre zurück

;
; Bin2ToDigit
; ===========
; ermittelt eine dezimale Ziffer durch fortgesetztes Abziehen
; einer binär kodierten Dezimalstelle
; Unterroutine benutzt von: Bin2ToBcd5, Bin2ToAsc5, Bin2ToAsc
; Aufruf: Binärzahl in rBin1H:L, binär kodierte Dezimalzahl
; in rBin2H:L, Z zeigt auf bearbeitete BCD-Ziffer
; Rückkehr: Ergebis in Z (bei Aufruf), Z um eine Stelle er-
; höht, keine Fehlerbehandlung
; Benutzte Register: rBin1H:L (enthält Rest der Binärzahl),
; rBin2H (bleibt erhalten), rmp
; Aufgerufene Unterroutinen: -
;
Bin2ToDigit:
clr rmp ; Zähler auf Null
Bin2ToDigita:
cp rBin1H,rBin2H ; Vergleiche MSBs miteinander
brcs Bin2ToDigitc ; MSB Binärzahl kleiner, fertig
brne Bin2ToDigitb ; MSB Binärzahl größer, subtrahiere
cp rBin1L,rBin2L ; MSB gleich, vergleiche LSBs
brcs Bin2ToDigitc ; LSB Binärzahl kleiner, fertig
Bin2ToDigitb:
sub rBin1L,rBin2L ; Subtrahiere LSB Dezimalzahl
sbc rBin1H,rBin2H ; Subtrahiere Carry und MSB
inc rmp ; Erhöhe den Zähler
rjmp Bin2ToDigita ; Weiter vergleichen/subtrahieren
Bin2ToDigitc:
st z+,rmp ; Speichere das Ergebnis und erhöhe Zeiger
ret ; zurück


_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 95433

Condor-x

Gelegenheitsposter



Beiträge: 56

Danke diese lösung hatte ich auch angewand ich dachte nur das es vileicht auch einfacher geht .....


jetzt weiß eich jedenfals das ich nicht mit umwegen arbeite...

BID = 109878

Thanatos

Gerade angekommen


Beiträge: 1

hi !

ich hab da was für meinen AVR gebastelt

input in r20

output in r20=einer, r21=zehner, r22=hunderter

den output dann noch mit dem +wert für die ascii zahlen addieren und fertig.



;####################
;# BIN 8 nach BCD 3 # ;8bit BIN nach 3stellen BCD
;####################
MATH_bin_to_bcd:
clr r21 ;ergebnis (Z) löschen
clr r22 ;ergebnis (H) löschen
MATH_bin_to_bcd1:
subi r20, 100 ;input=input-100
brcs MATH_bin_to_bcd2 ;abbruch wenn carry gesetzt
inc r22 ;erhöhe (H)
rjmp MATH_bin_to_bcd1 ;schleife
MATH_bin_to_bcd2:
subi r20, -100 ;(Z) rückrechnen
MATH_bin_to_bcd3:
subi r20, 10 ;input=input-10
brcs MATH_bin_to_bcd4 ;abbruch wenn carry gesetzt
inc r21 ;erhöhe (Z)
rjmp MATH_bin_to_bcd3 ;schleife
MATH_bin_to_bcd4:
subi r20, -10 ;(E) rückrechnen
ret ;return



viel spaß damit !


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 182195550   Heute : 1957    Gestern : 4612    Online : 688        18.10.2024    13:26
5 Besucher in den letzten 60 Sekunden        alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0504698753357