Forum: Mikrocontroller und Digitale Elektronik LCD gibt keine ä ö ü aus


von Jonny (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


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

von Andreas W. (Gast)


Lesenswert?

Hi,

hat dein string auch eine NULL am Ende?


Gruß
Andreas

von Jonny (Gast)


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

von crazy horse (Gast)


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.

von Hanno (Gast)


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

von Markus_8051 (Gast)


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

von Jonny (Gast)


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

von Sebastian (Gast)


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.

von Jonny (Gast)


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

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.