LCD gibt keine ä ö ü aus

Gast #118971
Lesenswert?

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
Angehängte Dateien:
#118972
Lesenswert?

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
Gast #118974
Lesenswert?

@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
Gast #118975
Lesenswert?

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.
Gast #118976
Lesenswert?

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
Gast #118977
Lesenswert?

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
Gast #118978
Lesenswert?

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
Gast #118979
Lesenswert?

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.
Gast #118980
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren