Ein Servus an alle!
Wieder einmal schreibe ich euch, weil ich mein LCD nicht zum funzen
bringe! Langsam wird's echt mühsam - für euch wahrscheinlich auch!
Dennoch hoffe ich, ihr helft mir bei meinen Programmierproblemen.
Folgende Probleme habe ich:
- ä ö und ü werden als japanisches Zeichen (0xFC) ausgegeben
- das letzte Zeichen des Strins wird 2mal ausgegeben
z.B möchte ich "Servus" rausschreiben --> es erscheint "Servuss"
- Die Anzeige ändert sich ständig bis auf die letzten zwei Zeichen.
bei "Servus" also: "Servu <-- ändern sich immer, ss" --> bleiben
Im Anhang findet ihr die lcd.c und die main.c!
Würde mich über eure Hilfe freuen!
Servus
Jonny
1.
Bei Ausgabe eines kürzeren Textes, als vorher auf dem Display stand,
muß man mit Leerzeichen auffüllen, damit alle Buchstaben überschrieben
werden.
Vorher Löschen sieht unschön aus, da dann das Display sichtbar
flackert.
2.
Du must in der Zeichentabelle Deines Displays nachsehen, ob Umlaute
überhaupt drauf sind und welchen Code sie haben.
Wenn nicht, dann mußt Du sie in den 8 wählbaren Speicherplätzen selber
definieren.
Peter
@Peter
1. Ich verstehe was du meinst, allerdings ist z.B bei "Hallo" das
selbe Problem: "Halloo"
2. In der Zeichentabelle sind die Umlaute vorhanden
@Andreas
Das habe ich mir auch schon überlegt.
Gibt es nicht so etwas wie END OF TEXT, damit die Funktion erkennt wann
der String fertig ist?
Servus
Jonny
das Problem wird genau da liegen, wo Peter es vermutet.
Wenn die Strings nicht gleiche Länge haben, bleibt der alte Rest
stehen.
Lösungen: alle Strings, die auf eine bestimmte Position geschrieben
werden, auf gleiche Länge bringen, die kürzeren also mit 0x20
auffüllen.
Alternativ kannst du nach dem Schreiben eine Funktion lcd_write_spaces
(string_length - string_length_max) aufrufen, die eine übergebene Zahl
an Leerzeichen ausgibt und damit alte Zeichen überschreibt.
Das Problem der Umlaute liegt am nicht übereinstimmenden Zeichensatz.
Dazu gibts 2 Lösungsmöglichkeiten:
Entweder im Quelltext gleich das passende LCD-Zeichen angeben, sieht
komisch aus, funktioniert aber und ist auch am schnellsten und braucht
am wenigsten Speicherplatz.
"Daten gelþscht"
Die abweichenden Zeichen kannst du mit "Alt und 0xxx" eingeben, xxx
steht für den Dezimalcode des LCD-Zeichens, beim ö ist das 254.
Alternativ kannst du in der lcd_putchar jedes auszugegebende Zeichen
auf Sonderzeichen überprüfen und ggf. ersetzen.
Hi!
Ich glaube, der Fehler ist hier:
void LCDOuts(char* str) // Ausgabe eines Strings
{
while (*str != 0)
{
LCDOutc(*str++);
}
LCDClock(); // <------------ HIER!
}
LCDClock wird doch schon in der LCDOutc gemacht. Das heißt, beim
letzten Zeichen wird zweimal eine Clock gegeben -> Das Zeichen wird
zweimal ausgegeben. Also einfach mal die Zeile entfernen und sehen, obs
klappt.
Gruß,
Hanno
Du gibst am Ende der LCDOuts-Funktion nochmal einen Clock-Impuls.
Dadurch werden die letzten Daten nochmal ans LCD gesendet.
Also: den LCDClock in der LCDouts einfach weglassen.
Markus_8051
Mahlzeit @alle!
Vielen Dank für eure Antworten.
Ihr hattet alle irgendwie recht - so viel Fehler wie ich programmiert
hatte, da konnte das LCD nicht funzen!
Aber jetzt funktionierts!!!!!!!!
Meine Fehler waren:
- String nicht mit "\0" abgeschlossen
- DDRAM nicht gesetzt
- ... und noch ein paar so Kleinigkeiten, die eigentlich nicht sein
müssten!!
Noch einmal vielen Dank für eure Hilfe!
Servus
Jonny
Hm, wenn du schon meinen Code benutzt, dann doch ruhig richtig. ;-)
Ich dachte eigentlich, dass ich die Sachen im Tutorial ganz gut erklärt
hätte ... Und guck mal auf mathar.com, die LCDOutc() habe ich schon vor
einiger Zeit überarbeitet, damit sie auch Umlaute ausgeben kann.
(Direktlink: http://mathar.com/lcd.c). Du hast noch eine von meinen
alten Versionen, die bei Umlauten nur Müll ausgeben.
Hallo Sebastian!
Bin zwar täglich auf deiner Seite, aber den neuen Code für die
LCDOutc() hab ich nicht entdeckt! Ich war gerade dabei eigene Zeichen
für die Umlaute zu erstellen. Deine Meldung kam daher ganau richtig!
Vielen Dank für deinen Hinweis!
Servus
Jonny
Eine eigene Frage?
Dieser Thread ist über 22 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.