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


von eaglo (Gast)


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 ?

von Jörg (Gast)


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

von eaglo (Gast)


Lesenswert?

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

von Jörg (Gast)


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

von LötNix (Gast)


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.

von Matthias (Gast)


Lesenswert?

Hi

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

Matthias

von Olaf (Gast)


Lesenswert?

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

Olaf

von Lötnix (Gast)


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.

von Matthias (Gast)


Lesenswert?

Hi

fast:

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

Matthias

von Lötnix (Gast)


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

von eaglo (Gast)


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 ;)

von Lötnix (Gast)


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

von eaglo (Gast)


Lesenswert?

vielen dank jedenfalls an alle =)

von Rufus T. Firefly (Gast)


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?

von Peter D. (peda)


Lesenswert?

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


Und Matthias hats nichtmal gemerkt :-)


Peter

von Mark Hämmerling (Gast)


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

von crazy horse (Gast)


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.)

von Rufus T. Firefly (Gast)


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)

von Mark Hämmerling (Gast)


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

von Matthias (Gast)


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

von T.Stütz (Gast)


Lesenswert?

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

Gruss

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.