www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Probleme mit "ä" "ö" usw...


Autor: eaglo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!
Ich benutze ein Ampire 202A (20x2) LCD mit KS066U Controller ich kann
alle normalen zeichen ohne probleme ausgeben, außer ä,ö, etc. ...

Versuch: stroutxy("Hallo äöü",0,0);
heraus kommt dann "Hallo" + irgendwelche chinesischen Zeichen

gibts da ne einfach möglichkeit eine ascii translation zu machen ?

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Umlaute liegen im Zeichensatz des LCD nicht an der richtigen Stelle.
Für ein "ü" muss man z.B. 0xF5 (hex) bzw. 245 (dez) ausgeben und
demzufolge auch so im Ausgabestring definieren. in Assembler sieht das
dann z.B. so aus
.db "Programm w",0xE1,"hlen",0

wobei die 0xE1 für das "ä" steht. Die Lage der Umlaute findet man im
Datenblatt des LCD-Controllers (der KS066U dürfte kompatibel zum
Standard HD44780 sein).

Jörg

Autor: eaglo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ... und wie kann ich das performance sparend in eine funktion
implementieren bzw. in c realisieren ? :D

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus meiner sicht gibt es da prinzipiell 2 Wege. Entweder, man beachtet
die Verschiebung der Umlaute bereits bei der Texterstellung, für Dein
Beispiel sollte das etwa so funtionieren

 stroutxy("Hallo "+0xE1+0xE5+0xF5,0,0); (die einzelnen Hex-Werte
hängen vom Zeichensatz des Controlers ab)

Ob das in C vom Syntax her so funktioniert, kann ich leider nicht
sagen, da ich mit C nicht viel am Hut habe.

Die 2.Variante wäre ein "Umkodieren on the fly". Die eigentliche
Ausgaberoutine oder Bibliothek müsste dazu vor der Ausgabe prüfen, ob
das auszugebende Zeichen ein Umlaut ist und diesen dann durch ein für
den Controllerzeichensatz passendes Zeichen ersetzen. Wenn man Platz
hat, kann man das z.B. auch über eine Tabelle machen und den
Zeichensatz komplett und vor allem schnell "umkodieren". Wenn Du
allerdings die Standad-Bibliotheken von Deinem C-Compiler verwendest,
hast Du dort, denke ich mal, keine Eingriffsmöglichkeiten. Da sind
wieder die C-Programmierer gefragt, oder?

Jörg

Autor: LötNix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
case char {
  ä: char = 0xE1;
  ö: char = 0xirgenwds;
  ü: char = 0xwasanderes;
};

putchar(char);

Syntaktisch nicht ganz sauber aber so sollte es gehen...

Nachteil: die printf Routine kannst Du dafür nicht verwenden.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@LötNix
Was ist das denn für eine Programmiersprache? C ist es auf jeden Fall
nicht.

Matthias

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scheint eine art Meta-Speach zu sein. Unbestaetigten Beobachtungen nach
soll spaetestens nach dem ersten Semsester das Gehirn eines
Informatikstudenten damit funktionieren.

Olaf

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, nochmal nachgeschaut:
wenn char das Zeichen enthält, das angezeigt werden soll

switch (char)
{
   case 'ä':
           char == 0xnn;
           break;
   case 'ö':
           char == 0xnn;
           break;
   case 'ü':
           char == 0xnn;
           break;
}

putchar(char);

Achtung: nn durch die richtigen Hex Codes ersetzen

@Matthias:
echt konstruktiver Beitrag, da du C ja anscheinend kennst, hättest Du
die richtige Lösung sicher gewusst. Wenns jetzt noch nicht ganz stimmt,
verrat uns halt die Lösung.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

fast:

switch (char)
{
   case 'ä':
           char = 0xnn;
           break;
   case 'ö':
           char = 0xnn;
           break;
   case 'ü':
           char = 0xnn;
           break;
   default:
           break;
}

Matthias

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias
na dachte ichs mir doch man muss Dich nur etwas motivieren ;-)

das default: stand leider nicht in meinem avr-gcc manual drin, ich
glaube das braucht man auch nur, wenn man was anderes als 'break'
machen mächte. Kann aber auch ein Bug im Manual sein...

Ciao

Autor: eaglo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja etwas pingelig matthias g das mit dem default kann man schreiben
muss aber nicht sein :) dafür würd ich statt dem char eine variable da
reinschreiben ;)

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, char sollte eigentlich die Variable sein, ist aber natürlich ein
reserviertes wort in C ...
Aber ich denke, Du weisst, was zu tun ist.

Ciao

Autor: eaglo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank jedenfalls an alle =)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Alternative wäre die Verwendung einer Tabelle. Für die würden 128
Bytes genügen, da die unteren 128 Bytes nicht konvertiert werden
müssen.

Der resultierende Code sähe dann in etwa so aus:

  unsigned char Zeichen;

  if (Zeichen > 0x7f)
    Zeichen = Codetabelle[Zeichen - 0x80];


und Codetabelle ist so definiert

  const unsigned char Codetabelle[128] = { 0x00, 0x01, 0x02, ...}

(statt der sinnlosen Werte müssten halt die zum Display passenden
Übersetzungen eingetragen werden. Nicht übersetzbare Codes werden mit
einem sinnvollen Defaultwert besetzt).

Auf einem AVR ließe sich diese Tabelle auch im Flash-ROM halten, dann
muss beim Auslesen mit PROG_RDB gearbeitet werden.

Ob ein größeres switch/case-Statement der hier besprochenen Art weniger
Code verbraucht als so eine Tabelle?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"ups, char sollte eigentlich die Variable sein, ist aber natürlich ein
reserviertes wort in C ..."


Und Matthias hats nichtmal gemerkt :-)


Peter

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve,

also wenn die Texte statisch sind, kannst Du die ganz einfach als
Oktalwerte in Deine Strings schreiben, per Escapezeichen "\".
Mein Nachname sähe z.B. so aus: "H\341mmerling" :) Egozentrisches
Beispiel, aber so fand ich's grad in meiner Dimmer-Firmware... (und
ein anderes Wort mit ä fällt mir grad nicht ein. ;))

Ist schon ziemlich häßlich, bei den HD44780-Zeichensätzen. Zumal die
auch nur lower-case Umlaute haben, was das ganze im Fall der Fälle
wirklich schwierig werden läßt.

Mark

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei festen Texten leg ich es auch lieber direkt in den Quelltext,

flash unsigned char text1[]="Das ist Mõll";
Das "õ" soll dann auf dem HD44780 ein "ü" sein, eingeben kann man
das mit Alt+0245 (0xF5=245dez.)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, gottlob verstehen C-Compiler auch Konstanten in anderer als
ausgerechnet oktaler Notation.

  "Hässlich" = "H\xe4sslich"  (ANSI-Code, nicht 44780!)

  "Straße" = "Stra\xdfe"      (ANSI)

Schön ist was anderes.


Habe mal im 44780-Datenblatt die Zeichencodes 'rausgesucht:

  ä e1
  ö ef
  ü f5
  ß e2

Damit auch andere Texte nicht so grauenerregend aussehen:

  g e8 (mit Unterlänge)
  j eb (mit Unterlänge)
  y fa (mit Unterlänge)

(damit ist mein Vorschlag der 128-Byte-Tabelle natürlich hinfällig)

Autor: Mark Hämmerling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salve,

die oktale Notation hatte ich gewählt, weil die selbstdefinierten
Zeichen nochmal in den Adressen 8..f auftauchen. Man kann daher in
einem String das erste Zeichen (also an Adresse 0 und 8) verwenden,
indem man "\010" in seinen String einbaut, anstatt "\000", was
aus bekannten Gründen für Probleme sorgen würde. :)
Und 010..017 läßt sich eben etwas übersichtlicher lesen als x08..x0f.

Mark

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

mift
Kommt davon wenn man seit einiger Zeit nur noch getypedefte Datentypen
verwendet. Ich schreibe Software zum Teil nach den MISRA Regeln. Daher
das leere default.

Matthias

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du (groß) Ä,Ö,Ü brauchst, dann bleibt nur selberdefinieren an
00h bis 07h (siehe Datenblatt, CGRam)

Gruss

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.