Pages: [1]   Go Down
Author Topic: LCD-Ausgabe von Umlauten  (Read 1807 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  lcd.print("R");
  lcd.write(0xf5); 
  lcd.print("cklauf: "); 

Kann man das irgendwie in einen Zeile packen?

Gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Uwe,

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

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21661
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Uwe,

weiss ich eigentlich alles.  smiley-razz
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

Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3040
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3057
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Cloppenburg
Offline Offline
Edison Member
*
Karma: 30
Posts: 1281
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Nicht Mensch, nicht Tier: Programmierer halt...

Germany S-H
Offline Offline
Faraday Member
**
Karma: 146
Posts: 3040
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 3
Posts: 385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Pages: [1]   Go Up
Jump to: