Forum: Projekte & Code Ausgabe Binärzahl 8, 16, 24 und 32Bit auf LCD!


von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hi!

Habe ein paar "kleine" Routinen zur Ausgabe von Binärzahlen in den
größen 8, 16, 24 und 32Bit in ASM entwickelt.
Die Routinen beherschen die sogenannte "Print Using"-Funktion, also
das bei Ausgabe z. B. einer 16Bit-Zahl die Anzahl der Stellen von 5 bei
Werten von 0 bis 65535 immer gleich bleibt.
Dabei werden führene Nullen (0) durch Leerzeichen ersetzt.
Durch setzen von Bit 4 im Register BCDFlag läßt sich das auch
abschalten und eine 3 benutzt dann nur eine und 123 benötigt dann 3
Stellen.
Desweiteren kann man in BCDFlag im unteren Nibble die Anzahl der
Kommastellen angeben was ja in ASM ohne Float-Routinen recht schwer
ist.
Möchte man z. B. eine Binärzahl mit 4 Stellen (0-9999) ausgeben wo bei
die unteren 2 Stellen die Kommastellen sind lädt man in BCDFlag einfach
2 und ruft die Routine PrintBCD16 auf.
Man kann auch mit Ausgabe einer 32Bit-Zahl 9 Kommastellen festlegen ist
aber eher Unsinn und ginge dann auch nur bis 4,294967295.
Parameter:
In Register Z übergibt man die Adresse der Binärzahl im SRAM.
In Register BCDFlag (r19) an Bit 4 ob Print Using an (0) oder aus sein
soll (1) und im unteren Nibble die Anzahl der Kommastellen von 0
(keine) bis 2, 4, 7 oder 9 (je nachdem, welche BCD-Funktion aufgerufen
wird).

Ein paar Beispiele:
Ausgabe einer 16Bit Zahl wobei die unteren beiden Ziffern als
"Kommastelle" fungieren:

 ldiwz BCDZahl          ;macro ist in "BCD-Macros.inc" im Anhang.
 ldi   BCDFlag,0x02     ;Print Using an und 2 Kommastellen.
 rcall PrintBCD16       ;Binärzahl ausgeben.
.dseg
BCDZahl .byte 2

Ausgabe einer 24Bit Zahl wobei die unteren 3 Ziffern als
"Kommastelle" fungieren und ohne "Print Using":

 ldiwz BCDZahl          ;macro ist in "BCD-Macros.inc" im Anhang.
 ldi   BCDFlag,0x13     ;Print Using aus und 3 Kommastellen.
 rcall PrintBCD24       ;Binärzahl ausgeben.
.dseg
BCDZahl .byte 3

Die Routinen PrintBCD8, ...16 ...24 sind abhängig von PrintBCD32 da
dort entsprechende Einsprungpunkte sind wegen der Code-Effezience.

Eine Routine wie "PrintCode" muß von euch enthalten sein da ich euch
meine nicht unbedingt aufzwängen will (geht über einen LCD-Buffer mit
Verschiebung der Spalte zum Text rollen).
Diese muß einfach nur auf irgend eine Art und Weise ein Zeichen auf dem
LCD oder in euren LCD-Buffer ausgeben können.
Es ist noch darauf zu achten, das Ihr vor dem Aufruf einer der
BCD-Routinen in eurem LCD oder LCD-Buffer-Routinen noch die
Anfangsposition der BCD-Ausgabe festlegen müßt.
Eure PrintCode-Routine sollte, wenn mit Buffer im SRAM, auch die
Spalten-Nr. erhöhen.

Falls es Register-Konflickte gibt, sind die leicht in dem
.def-Abschnitt änderbar. Nur r18, was bei mir ein unbenutztes
"Vielzweckregister" ist, muß man bei der Routine PrintBCD32 anpassen
wenn erfoderlich.

Gruß
Andi

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang die neue Version von BCD8-32!
Das mit dem Register r18 zur Prüfung der Kommastelle entfällt jetzt und
es wird mit einem von der Routine bereits genutzten Register BCDTemp =
r20 gemacht.
r20 ist somit ein "Shared Register".
Somit sind nun die Register r17 und r18 frei falls Ihr diese für die
Zeichenausgabe, z. B. lcd_data aus dem TUT (Temp1, Temp2 und Temp3),
verwendet.

Gruß
Andi

von Andi (Gast)


Lesenswert?

Hi!

Wie ich sehe, haben sich schon ein paar Leute die Routine geholt und
vielleicht auch ausprobiert.
Würde mich über eine Resonance freuen.
Bin auch am grübeln, wie ich das mit "echter" Binär/BCD-Wandlung
beschleunigen kann ohne viel zu subtrahieren.
Bis jetzt bin ich darauf gekommen, das man sich von unten nach oben mit
einem Versatz von 6 Nibble für Nibble hoch arbeiten muß.
Mal sehen, was da raus kommt.

Gruß
Andi

von smartie (Gast)


Lesenswert?

Steht leider nirgendwo, für welchen Prozessor das ganze sein soll.
Ein Anzeige in Binärzahlen ist aber sehr schwer ablesbar, mir
sind Dezimalzahlen jedenfalls lieber.

von Andi (Gast)


Lesenswert?

Das ganze ist für die AVR´s mit SRAM und LCD.
Es wird ja umgewandelt in BCD, Dual- nach Dezimalsystem, und jede
Ziffer sofort ausgegeben. Eine "PrintOut"-Routine zur Zeichenausgabe
muß von euch kommen bzw. könnt das z. B. ändern in lcd_data.
In r16 steht der ASCII für die Ziffer bereit.
Ließ oben noch mal, da ist ein kleines Beispiel.

Gruß
Andi

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Habe eine neuere Version!
Die neue Version ist nun auch in der Lage, Zahlen mit Vorzeichen
auszugeben.
Bei negativen Zahlen wird vor der Zahl ein "-" ausgegeben und bei
positiven ein Leerzeichen.
Das Komma (",") für die Kommazahlen habe ich durch einen Dezimalpunkt
(".") ersetzt.
Ausserdem kann man ein Anzeigen der "Vornullen", z. B. "00364"
aktivieren.

Hier noch mal das BCDFlag mit seinen Funktionen:
 Bit 6 = 1 = Vornullen-Anzeige ein.
 Bit 5 = 1 = Vorzeichen-Ausgabe (Signed) ein.
 Bit 4 = 1 = Print-Using (Rechtsbündig) aus. Standard (0) = Print-Using
an.
 Bit 3 bis 0 = Anzahl der Kommastellen also die Position des
Dezimalpunktes von rechts.

Bei Ausgabe mit Vorzeichen muß man darauf achten, das die Ausgabe für
das Vorzeichen, "-" oder Leer, ein Zeichen mehr benötigt, ausser bei
24Bit-Zahlen da sich bei denen mit Vorzeichen die Anzahl der möglichen
Ziffern um 1 verringert (-8388608 bis 8388607 statt 0 bis 16777215).
Ansonsten erfolgt der Aufruf wie oben beschrieben.

Gruß
Andi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.