mikrocontroller.net

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


Autor: Jonny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hat dein string auch eine NULL am Ende?


Gruß
Andreas

Autor: Jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hanno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jonny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.