Go Down

Topic: LCD-Ausgabe von Umlauten (Read 2027 times) previous topic - next topic

hk007

Hi,

ich habe gerade ein "Problem" bei der Ausgabe auf ein Serielles I2C-Display.
Es soll der Text "Rücklauf" ausgegeben werden.
Allerdings ist bei dem Display das "ü" nicht wie in der Standard-ASCII-Tabelle bei 0x81 sondern bei 0xf5.

Bis jetzt hab ich nur folgenden (uneleganten) Weg gefunden:
Code: [Select]
  lcd.print("R");
  lcd.write(0xf5); 
  lcd.print("cklauf: "); 


Kann man das irgendwie in einen Zeile packen?

Gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

Der HD44780 hat keinen 100% Standard-ASCII kompatiblen Zeichensatz.
http://www.adafruit.com/datasheets/HD44780.pdf ab Seite 17 oder Du kannst 8 Zeichen selbst definieren:
http://arduino.cc/en/Reference/LiquidCrystalCreateChar

Grüße Uwe

hk007

Hi Uwe,

weiss ich eigentlich alles.  :P
Ich wollte eigentlich wissen, ob ich meine drei Zeilen für die Ausgabe des Wortes "Rücklauf" irgendwie zusammenfassen kann.
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed


Hi Uwe,

weiss ich eigentlich alles.  :P
Ich wollte eigentlich wissen, ob ich meine drei Zeilen für die Ausgabe des Wortes "Rücklauf" irgendwie zusammenfassen kann.

Entschuldige, da hab ich Dich falsch verstanden.
Hast Du versucht das dem x0f5 entsprechende Zeichen der ascii Tabelle zu verwenden? laut http://www.amathis.ch/ASCII-Tabelle.pdf ist das das § also "R§cklauf"

Grüße Uwe


jurs


Allerdings ist bei dem Display das "ü" nicht wie in der Standard-ASCII-Tabelle bei 0x81 sondern bei 0xf5.


Der ASCII-Standard definiert nur einen 7-Bit Zeichensatz , also bis Code 127, alles darüber hinaus ist spezifisch.

Und Java(Arduino) verwendet standardmäßig UTF-8, das ist ein Zeichensatz mit 1-Byte und Mehrbyte-Zeichen im selben Zeichensatz: Die Standard-ASCII Zeichen sind 1 Byte und äöüß bei UTF-8 sind 2 Bytes.


Kann man das irgendwie in einen Zeile packen?


Man kann sich z.B. eine Funktion machen, die Strings zeichenzweise ausgibt, und falls UTF-8 Zeichen vorkommen eine Übersetzung durchführen und die entsprechenden Zeichen aus dem HD44780-Controllerzeichensatz ausgeben lassen.

Zumindest mit einer standardmäßigen Windows7-Java-Arduino Installation und auf einem HD44780 Controller mit A00 Zeichensatz funktioniert beispielsweise das:

Code: [Select]

void lcdPrint(char* buf)
//  for HD44780 controller with ROM character set A00
{
  for(byte i=0;i<strlen(buf);i++)
  {
    switch (buf[i])
    {
    case 0xC2:
    case 0xC3:
    case 0xCE:
    case 0xCF: break; // filtering UTF-8 highbyte 
    case 'ä': lcd.print('\xE1');break; // translate UTF-8 lowbyte
    case 'ö': lcd.print('\xEF');break; // translate UTF-8 lowbyte
    case 'ü': lcd.print('\xF5');break; // translate UTF-8 lowbyte
    case '?': lcd.print('\xE0');break; // alpha
    case 'ß': lcd.print('\xE2');break; // beta, sz
    case 'µ': lcd.print('\xE4');break; // micro
    case '°': lcd.print('\xDF');break; // degree symbol
    case '?': lcd.print('\xF4');break; // omega
    case '?': lcd.print('\xE5');break; // sigma
    case '?': lcd.print('\xF6');break; // Sigma
    default: lcd.print(buf[i]);
    }
  } 
}

// Beispielaufruf:
  lcdPrint("aäoöuü?ßµ?°??");


Dann rufst Du für die Ausgabe von C-Strings in char-Arrays einfach statt "lcd.print" nur die Funktion "lcdPrint" auf, und die Umsetzung passiert automatisch. Und zwar nicht nur für Umlaute (sind glaube ich nur Kleinbuchstaben enthalten), sondern auch noch für ein paar andere Sonderzeichen wie ein paar wenige griechische Buchstaben (das ß ist quasi wie beta) und das "Grad" Zeichen für die Ausgabe von Temperaturen.

michael_x

Quote
... ob ich meine drei Zeilen für die Ausgabe des Wortes "Rücklauf" irgendwie zusammenfassen kann


wenn du es einfacher willst:
c kennt die \xxx Syntax mit den (fast ausgestorbenen) oktal-Codes

0xF5 wäre oktal  365

was liefert denn    lcd.print("R\365cklauf"); ?
(falls das überhaupt deine Frage war, und du nicht doch lieber jurs' lcdPrint() verwenden möchtest). 


Stimmt, ü als 0x81 ist nicht ASCII, sondern eine hierzulande bei Windows gebräuchliche ANSI-Codierung,
aber UTF-8 ist ziemlich off topic, selbst im Serial Monitor ;)

skorpi08

es kommt auch Rücklauf dabei heraus. Wo bekommt man denn so eine oktal Tabelle her?
Kann man lcdPrint nicht irgendwie als lcd.print definieren? So dass ich nur 1 befehl für das ganze habe.
Nicht Mensch, nicht Tier: Programmierer halt...

jurs


Wo bekommt man denn so eine oktal Tabelle her?


Im Datenblatt des HD44780 Controllers ist eine Tabelle "ROM character set A00", da kannst Du die Hexadezimalcodes der Zeichen rauslesen.

Falls Du WINDOWS-7 Benutzer bist, kannst Du beispielsweise den Windows-Taschenrechner ("Calc") in der "Ansicht-Programmierer" zum Umrechnen zwischen verschiedenen Zahlensystemen verwenden, z.B. auch zur Umrechnung von hexadezimal Codes auf oktal Codes. Gibt aber bestimmt irgendwo im Internet auch Online-Umrechner.

hk007


wenn du es einfacher willst:
c kennt die \xxx Syntax mit den (fast ausgestorbenen) oktal-Codes

0xF5 wäre oktal  365

was liefert denn    lcd.print("R\365cklauf"); ?
(falls das überhaupt deine Frage war, und du nicht doch lieber jurs' lcdPrint() verwenden möchtest). 


Hi michael_x:

Super Lösung. (Habs erst heute im Froum gelesen) So kann ich meinen Code etwas kürzen. Muss ich mir merken.
Mit Oktalcode hab ich zwar noch nie was zu tun gehabt. Aber Umrechnen kanns ja wie vorher angesprochen der Windows Calculator.

gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Go Up