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 ?
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
ok ... und wie kann ich das performance sparend in eine funktion implementieren bzw. in c realisieren ? :D
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
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.
Hi @LötNix Was ist das denn für eine Programmiersprache? C ist es auf jeden Fall nicht. Matthias
Scheint eine art Meta-Speach zu sein. Unbestaetigten Beobachtungen nach soll spaetestens nach dem ersten Semsester das Gehirn eines Informatikstudenten damit funktionieren. Olaf
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.
Hi fast: switch (char) { case 'ä': char = 0xnn; break; case 'ö': char = 0xnn; break; case 'ü': char = 0xnn; break; default: break; } Matthias
@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
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 ;)
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
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?
"ups, char sollte eigentlich die Variable sein, ist aber natürlich ein reserviertes wort in C ..." Und Matthias hats nichtmal gemerkt :-) Peter
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
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.)
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)
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.