Forum: Mikrocontroller und Digitale Elektronik Sonderzeichen LCD HD44780 kompatibel


von safran (Gast)


Lesenswert?

Guten Abend!
Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung 
von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays 
zusammenzustellen. Umlaute kann man damit bei der Verwendung eines 
Arduinos z.B. wie folgt darstellen:

lcd.print("R\365cklauf"); //wird dargestellt als" Rücklauf"

\40  !
\41  "
\42  #
\43  $
\44  %
\45  &
\50  (
\51  )
\52  *
\53  Plus-Zeichen
\54  Komma
\55  Minus-Zeichen
\56  Punkt
\57  Schrägstrich
\72  Doppelpunkt
\73  Semikolon
\74  <
\75  Gleichheitszeichen
\76  >
\77  ?
\100  @
\134  eckige Klammer links
\136  eckige Klammer rechts
\137  accent circonflexe
\138  Unterstrich
\140  accent grave
\173  geschweifte Klammer links
\174  senkrechter Strich
\175  geschweifte Klammer rechts
\176  Pfeil nach rechts
\177  Pfeil nach links
\260  Minuszeichen
\333  Kastenrahmen
\337  hochgestellter Kastenrahmen(wie Potenz)
\340  gr. alpha
\341  ä
\342  ß
\343  klein epsilon
\344  µ
\350  Wurzelzeichen
\351  hoch minus 1
\353  hoch x
\356  n mit Oberstrich ( spanisch )
\357  ö
\363  Zeichen unendlich
\364  Ohm
\365  ü
\366  gr.Summe
\367  pi ( klein )
\371  u mit strich rechts unten
\375  geteilt durch
\377  alle Leuchtpunkte eingeschaltet

von Karl H. (kbuchegg)


Lesenswert?

safran schrieb:
> Guten Abend!
> Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung
> von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays
> zusammenzustellen.

Die Mühe hättest du dir sparen können.
Entsprechende ASCII-Tabellen sind in jedem LCD-Datenblatt enthalten
bzw. werden mit Google und dem Stichwort "hd44780 zeichensatz" in 2 
Sekunden gefunden

http://de.wikipedia.org/wiki/HD44780#Schrift_und_Zeichensatz

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> safran schrieb:
>> Guten Abend!
>> Ich habe mir mal die Mühe gemacht, die Oktalcodes für die Darstellung
>> von einigen Sonderzeichen auf HD44780-kompatiblen-LCD-Displays
>> zusammenzustellen.
>
> Die Mühe hättest du dir sparen können.
> Entsprechende ASCII-Tabellen sind in jedem LCD-Datenblatt enthalten
> bzw. werden mit Google und dem Stichwort "hd44780 zeichensatz" in 2
> Sekunden gefunden
>
> http://de.wikipedia.org/wiki/HD44780#Schrift_und_Zeichensatz


Entschuldige.
Ich hab ganz übersehen, dass du ja Oktalcodes angegeben hast. Benutzt 
zwar keiner, aber die sind in den Tabellen natürlich nicht enthalten.

von safran (Gast)


Lesenswert?

....und dieser Code ist so wunderbar einfach in einen Text einzufügen! 
:-)

von Karl H. (kbuchegg)


Lesenswert?

halb so wild.
da macht man sich einmalig eine Ausgabefunktion, die die wichtigsten 
Ersetzungen zb für die Umlaute durchführt und für den Rest ein paar 
#define, die ins Header File für die LCD-Funktionen dazukommen.


#define OHM   "\xF4"

und schreibt dann zb

   lcd.print( "480" OHM );

dann kann man das Ganze sogar im Code direkt lesen :-)

von Jobst M. (jobstens-de)


Lesenswert?

... und dann ist da noch die Frage, für welchen HD44780 diese Tabelle 
ist. Die gibt es nämlich mit unterschiedlichen Zeichensätzen ...


Gruß

Jobst

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jobst M. schrieb:
> Die gibt es nämlich mit unterschiedlichen Zeichensätzen ...

Allerdings. Ich drücke euch die Daumen, das ihr nie einen mit ROM 
Kennung B04 bekommt - da hat es einige Zeit gedauert, bis ich die 
richtige Übersetzungstabelle drin hatte, weil da nicht mal die ASCII an 
der richtigen Stelle waren...
Die gebräuchlichsten Versionen sind A00 (ASCII und japanisch) und A02 
(ASCII und europäisch), nachzulesen im Hitachi Datenblatt ab Seite 17.

von Alexander Predl (Gast)


Lesenswert?

Sorry für das alte Foren Posting popup... Aus Aktuellem Anlass:

also ich fand die Tabelle echt hilfreich, hat auf Anhieb funktioniert!!

Mein LCD Display ist von Adafruit, verwendet den I2C Bus und ich steuere 
das Ding mit dem Arduino Mega an.

Vielen Dank für die Mühe!

von Tim (Gast)


Lesenswert?

Karl H. schrieb:
> Benutzt zwar keiner

Anscheinend haben wir nach 2 Jahren einen gefunden.

von Elektrodoodle (Gast)


Lesenswert?

Auch wenn der Beitrag zunächst vielleicht unnötig erscheint, mir hat er 
geholfen :D. Da die Ausgabe mit Ascii und UTF-8 vom Arduino nicht 
richtig funktionierte (gab immer ein japanisches Zeichen davor) war ich 
kurz vor dem verzweifeln. Dank deinem Beitrag ging es dann ;)

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Fast 4 Jahre alt und nur ein halbes Jahr nach dem letzten Post:
Wieder Einer, dem Du mit Deiner Liste in kurzer Zeit geholfen hast.

Bei mir waren es 'Durchläufe', wo ein japanisches Schriftzeichen den 
Display-Inhalt auflockerte.

MfG

von JamsingSama (Gast)


Lesenswert?

Huhu,

und zwei Tage später hat es mir auch geholfen. :) Danke

von Gerd (Gast)


Lesenswert?

...und noch einer!
Vielen Dank für die Mühe, das war genau was ich gesucht habe!

von Nop (Gast)


Lesenswert?

Oktal? Kenne ich eigentlich nur von Sprit. ;-)

von Bernd (Gast)


Lesenswert?

Sinnvoll wäre eine Möglichkeit, dem Präprozessor/Compiler beizubringen, 
die Ersetzungen (z.B. ü -> \365) automatisch zur Compilezeit zu machen, 
sodass man Strings ganz einfach so schreiben kann, wie man sie meint. 
Und ohne eine ressourcenfressende Funktion zur Laufzeit bemühen zu 
müssen...

von noch ein gast (Gast)


Lesenswert?

Nop schrieb:
> Oktal? Kenne ich eigentlich nur von Sprit. ;-)

Selbst das kennst du nicht.

von Harald W. (wilhelms)


Lesenswert?

Nop schrieb:

> Oktal? Kenne ich eigentlich nur von Sprit. ;-)

Wir sind hier in einem Elektronikforum.
Da ist dieses Wort für Röhren reservert.
:-)

: Bearbeitet durch User
von Light up the magic in every little part (Gast)


Lesenswert?

Harald W. schrieb:
> Wir sind hier in einem Elektronikforum.
> Da ist dieses Wort für Röhren reservert.

Das haut mich vom Sockel.

von Harald W. (wilhelms)


Lesenswert?

Light up the magic in every little part schrieb:

>> Wir sind hier in einem Elektronikforum.
>> Da ist dieses Wort für Röhren reservert.
>
> Das haut mich vom Sockel.

Jetzt isse putt. :-(

von Klaus (Gast)


Lesenswert?

Hi ich bin auch darüber gestolpert weil mein Hitachi Display die 
Sonderzeichen auch nicht kann :-(

Aaaaber, bei mir funktioniert die Liste garnicht!!

zb sieht das OHM Zeichen wie ein kleines w aus und im Monitorfenster wie 
ein Viereck

und lcd.print("R\365cklauf");
da sieht das ü wie ein "Pfeil nach unten" aus und im Monitorfenster wie 
ein Viereck

Habe Arduino 1.8.5 (die neueste Version)...und alles läuft auf einem 
alten WinXP-Rechner.

Weiß jemand Rat?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das wird damit zusammen hängen, daß der Zeichensatz in Deinem Display 
ein Anderer ist - chinesisch wäre Da ganz groß im Kurs.
Google wird Dir die Zeichentabellen und Deren Unterschiede zeigen 
können.
Wenn Du eine Bezeichnung für Dein Display hast, um so besser.
Sonst musst Du über den verbauten Controller gehen.

MfG

Hmm, eigentlich hätte Es aber funktionieren sollen :/
Passt der verbaute Controller?
Sonst müsste ich Mal nach meinem 'Durchläufe' Beispiel (vor 10 Monaten 
fand ich diesen Thread auch Mal) heraussuchen.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Was mich etwas irritiert ist das die Umlaute in dem Monitorfenster auch 
nicht angezeigt werden...

Mein controler ist so eine 2 euro china teil, Nano V3 368 auf dem der 
auch gleich der COM3 CH340G drauf ist.

von Klaus (Gast)


Lesenswert?

Hey keiner Antwortet mehr?!
Ok also ich habe festgestellt, das meine Displays nicht die berühmten 
1602 sind (sie sehen optisch nur so aus), deshalb wird für wohl ein 
andere code benötigt werden :-(
Ich habe aus einem LC-Meter das Display ausgebaut und damit 
funktionieren die Umlaute.

Fall geklärt -> ich muß mir jetzt paar neue 1602 besorgen.

von Busy B (Gast)


Lesenswert?

Hallo,
der Beitrag ist sehr hilfreich, trotz des Alters!
Gibt es auch Codes für die Umlaute in Großschreibung?

von spess53 (Gast)


Lesenswert?

Hi

>Gibt es auch Codes für die Umlaute in Großschreibung?

Für welchen Displaycontroller mit welchem Zeichensatz?

Textdisplays haben die Möglichkeit acht selbst definierte Zeichen 
auszugeben. Das langt normalerweise für 'AÖÜ'.

MfG Spess

von c-hater (Gast)


Lesenswert?

Busy B schrieb:

> Gibt es auch Codes für die Umlaute in Großschreibung?

Das kommt auf das Display an. Typischerweise gibt's ein Datenblatt dazu, 
in dem der oder die Zeichensätze dokumentiert sind. Wenns nur einer ist, 
kannst du also sofort und direkt sehen, welche Glyphen er anbietet und 
über welchen Code diese jeweils zu erreichen sind.

Gibt es mehrere Zeichensätze und weißt du nicht, welcher dieser 
Varianten dein Display entspricht, dann ist die Sache  auch nicht sehr 
viel schwieriger: Du suchst dir einen Code aus, dessen Glyph in jedem 
der möglichen Zeichensätze unterschiedlich aussieht und gibst eben 
diesen Code aus. Aus dem tatsächlich dargestellten Zeichen kannst du 
dann direkt den verwendeten Zeichensatz ermitteln. Wenn du den kennst, 
kannst du wieder die restlichen Codes direkt ablesen.

Kurzfassung: Datenblatt lesen hilft.

von Peter D. (peda)


Lesenswert?

Einfach im lcd_putchar für die 6 Umlaute und 'ß' ein kleines switch/case 
einbauen.
Aber Achtung Fallgrube, das char Zeichen muß im switch zu uint8_t 
gecasted werden, sonst schlägt der Vergleich fehl!

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

spess53 schrieb:
> Textdisplays haben die Möglichkeit acht selbst definierte Zeichen
> auszugeben. Das langt normalerweise für 'AÖÜ'.

Hi @Spess,

Den Thread kennen wir ja noch. ;-)
Stichwort:

"user defined characters hd44780"

Es sind - wie bekannt - die unbenutzten Fernschreibcode-Steuerzeichen, 
deren Platz (Adressen) man eben noch anderweitig verwenden kann.

Hat nur den Nachteil, dass nach Abschalten der Versorgungsspannung diese 
Charakters verschwinden, und beim "Neustart" jedesmal wieder eine 
Routine durchlaufen werden muss. So seh' ich das jedenfalls.

ciao
gustav

von Dominik (Gast)


Lesenswert?

Karl B. schrieb:
> Hat nur den Nachteil, dass nach Abschalten der Versorgungsspannung diese
> Charakters verschwinden, und beim "Neustart" jedesmal wieder eine
> Routine durchlaufen werden muss. So seh' ich das jedenfalls.

Je nachdem wie lange der Strom weg war. Finde ich persönlich übrigens 
die beste Eigenschaft der User-Defined-Characters, da es sich um Ram 
handelt schreibt man es nicht kaputt und das ermöglicht einem eine sehr 
interessante Nutzung, die allerdings fast nirgends erwähnt wird (auch in 
den Tutorials hier auf der Seite nicht).

Normalerweise erzeugt man den Character und gibt diesen im Anschluss auf 
dem Display aus. Damit kann man schöne Bargraph-Anzeigen und ähnliches 
erzeugen, allerdings bei miserabler Auflösung und hoher 
Platzverschwendung.

Es geht aber auch umgekehrt: Character initialisieren, auf das Display 
ausgeben und dann "manipulieren".
Sprich den CGRam beschreiben während der Character bereits angezeigt 
wird. Damit lassen sich dann nette Animationen oder Bargraphs erstellen, 
die eine wesentlich höhere Auflösung haben. Ein senkrechter Bargraph auf 
einem Xx4er LCD kann dann bis zu 5 unterschiedliche Werte mit je einer 
Auflösung von 32 (5x8er Zeichen) Stufen darstellen und kostet nur eine 
Spalte.

Gruß Dominik

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Dominik schrieb:
> und das ermöglicht einem eine sehr
> interessante Nutzung, die allerdings fast nirgends erwähnt wird (auch in
> den Tutorials hier auf der Seite nicht).

OK,
wer suchet, der findet.
Ist zwar schon etwa 2 Jahre her. Sicher noch verbesserungsbedürftig. 
Aber als Quick-and-dirty-Lösung schon einmal nicht ganz verkehrt.
Die "Fallstricke" sind eben in den Screenshots noch kurz angerissen.


Ein Witz im Programm ist, dass in den Tabellen die Nullterminierung 
nicht verwendet wird, sonst könnte man die Null nicht als Pixelwert 
verwenden. Die Tabelle würde da stoppen.

cpi  temp2, 0x09    ; insgesamt achtmal Pixelwerte holen
breq  print_end0  ; wenn 9, dann zu print_end0


ciao
gustav

: Bearbeitet durch User
von Jörg R. (joggel67)


Lesenswert?

Wie schön dass es doch immer noch so alte Foren gibt in denen man immer 
wieder hilfreiche Tips findet.
Danke für die Tabelle, so schnell und einfach hab ich noch keine Umlaute 
auf`s Display gebracht....

von werner (Gast)


Lesenswert?

zwei Jahre später kann man einfach eine entsprechende Library verwenden, 
die die deutschen Umlaute direkt ausgeben kann:

https://werner.rothschopf.net/202003_arduino_liquid_crystal_umlaute.htm

klappt für HD44780U/ROM Code A00 und für den ST7070

von merciMerci (Gast)


Lesenswert?

werner schrieb:
> zwei Jahre später kann man einfach eine entsprechende Library verwenden,
> die die deutschen Umlaute direkt ausgeben kann:

Hi Werner,
bin auf deiner Seite unterwegs gewesen ..., viel/gute Arbeit deine 
Projekt Tutorials!

Kleiner Hinweis zu deinen verwendeten "Timeouts" ...
http://oneweekwonder.blogspot.com/2017/04/sign-up-to-signed-timeouts.html

ich würde mal darüber nachdenken ... :-)!
1
if (millis() - previousMillis > 3 * 1000UL && digitalRead(outputPin) == HIGH)

von Bauform B. (bauformb)


Lesenswert?

Bernd schrieb:
> Sinnvoll wäre eine Möglichkeit, dem Präprozessor/Compiler beizubringen,
> die Ersetzungen (z.B. ü -> \365) automatisch zur Compilezeit zu machen,
> sodass man Strings ganz einfach so schreiben kann, wie man sie meint.
> Und ohne eine ressourcenfressende Funktion zur Laufzeit bemühen zu
> müssen...

Wer den gcc sowieso aus den Quellen selbst baut, kann das einbauen 
(glaube ich; ungetestet, sieht aber einfach aus). In 
src/libiconv-1.xx/HACKING heißt es:
1
Adding new encodings
2
====================
3
For an indication which files need to be modified when adding
4
a new encoding, look for example at the 2007-05-25 ChangeLog
5
entry for RK1048.  The lib/*.h file for an encoding is usually
6
generated by one of the tools in the tools/directory.
7
All you need to provide is the conversion table in the format
8
of the many *.TXT files.
Im wesentlichen ist das eine Tabelle <HD44780-encoding> zu 
<unicode-encoding>. Zum Beispiel ein Ausschnitt aus 
src/libiconv-1.15/tests/ISO-8859-15.TXT, wo das Euro-Zeichen umkodiert 
wird:
1
0xA2    0x00A2
2
0xA3    0x00A3
3
0xA4    0x20AC
4
0xA5    0x00A5
Ganz Faule könnten einfach eine vorhandene Tabelle umbauen, die sonst 
niemand braucht ;)

Mit "-fexec-charset=HD44780-A00" würde man dem gcc sagen, dass er die 
neue Tabelle benutzen soll.

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.