Das Thema wurde hier ja zwar schon mehrmals angesprochen, hab aber
trotzdem leider nichts passendes gefunden.
Habe jetzt 2 Stunden so ziemlich jeden beitrag durchgeackert und auch
Google befragt, konnta aber keine hilfreiche Anleitung finden wie man
die 8 frei definierten Zeichen für ein LCD programmiert.
Soviel ich herausfinden konnte geht das ganze mittels einer Tabelle, in
der man seine Pixel definiert.
Mit einer Funktion definiert man dann in welche Adresse des Displays
welches Zeichen geschrieben wird
1
voidwrite_lcd_cg(bytelcd_addr,byte*lcd_zeichen)
2
{
3
bytelcd_i;
4
for(lcd_i=0;lcd_i<8;lcd_i++)
5
{
6
lcd_puts(0x40+lcd_addr*8+lcd_i,1);// CG RAM Adresse Set (01aa azzz)
7
lcd_puts(*lcd_zeichen,0);// Data Write 8x Pixelzeile
8
lcd_zeichen++;
9
}
10
}
Und das gibt man dann irgendwie aus.
Nur komm ichd amit überhaupt nicht klar.
Ich verwende die LCD-Library von Peter Fleury.
Ich habe eine EADOG und mir eine eigene LIB geschrieben. Da schreibe ich
sowas raus:
1
// neues Zeichen:
2
LCD_WR(0,0x78);// RAM Umschalten
3
LCD_WR(1,0x14);// Zeichen Addr 7: "KHz"
4
LCD_WR(1,0x18);
5
LCD_WR(1,0x14);
6
LCD_WR(1,0x00);
7
LCD_WR(1,0x13);
8
LCD_WR(1,0x19);
9
LCD_WR(1,0x16);
10
LCD_WR(1,0x17);
11
LCD_WR(0,0x80);// Zeichenanzeige wieder aktivieren
Mit
LCD_Char(7); // LCD Zeichen "KHz"
rufe ich das Zeichen auf.
PS: Die Definition:
void LCD_WR(unsigned char RS, unsigned char Dat);
void LCD_Char(char Dat);
im datenblatt gibt es startadressen für die eigenen zeichen
ab dieser startadresse werden 8 byte reingeschrieben
diese stellen die pixel dar
also
1. byte: xxx00000
2. byte: xxx00000
3. byte: xxx00000
4. byte: xxx00000
5. byte: xxx00000
6. byte: xxx00000
7. byte: xxx00000
8. byte: xxx00000
da es nur 5x8 pixel sind werden nur die untersten bits genutzt
aufrufen kann man das zeichen ganz einfach in dem man die normale
lcd_puts( ) mit 0x00 bis 0x07 aufruft
grob nochmal ..
also ein array mit 8 byte die pixelweise das zeichen darstellen
const char symbol[] PROGMEM= {130,130,130,130,130,130,130,130};
das läd man ab adresse 0x40 in den RAM des LCDs
also ab
adresse 0x40 ( lcd_puts ( 0x00) )
adresse 0x48 ( lcd_puts ( 0x01) )
adresse 0x4F ( lcd_puts ( 0x02) )
Hi, das hatte ich schon versucht.
Kannst du mir sagen an welche Stelle genau die beiden Codeschnippsel hin
müssen?
Ich nehme mal an beide ins die lcd.c
Und wie gibt man diese Zeichen dann aus?
ich hab das ganze in lcd.c drin - das ist richtig. Die Tabelle oben nach
den #include Zeilen und der Rest in der Funktion lcd_init. Allerdings
nutze ich die LCD-Routine von Ulrich Radig.
Manfred W. schrieb:
> Ich habs jetzt mal so versucht:>>
1
>staticconstunsignedcharsymbol[]PROGMEM=// Acht
2
>selbstdefinierteSymbolefuerdasLCD
3
>{
4
>0x90,0x98,0x9C,0x9E,0x9C,0x98,0x90,0x80,//
5
>0x00,0x0A,0x1B,0x1B,0x03,0x1F,0x0E,0x00,//
6
>0x1F,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1F,//
7
>0x00,0x0A,0x1F,0x1F,0x1F,0x0E,0x04,0x00,//
8
>0x15,0x0E,0x15,0x0E,0x04,0x04,0x04,0x00,//
9
>0x04,0x0E,0x1F,0x11,0x11,0x11,0x1F,0x00,//
10
>0x04,0x0E,0x1F,0x04,0x04,0x04,0x04,0x00,//
11
>0x04,0x04,0x04,0x04,0x1F,0x0E,0x04,0x00//
12
>};
13
>
Also das höchste was pro Zeile an Hex Wert geht ist 0x1F (alles an) ...
wie kommen Deine 0x90 oder 0x98 zustande? Die 8 HEX Werte geben ja die 8
Zeilen eines Zeichens an, mit jeweils 5 bit ...
Als kleine Hilfe fand ich diese Seite immer praktisch:
http://www.quinapalus.com/hd44780udg.html
Mal damit mal Deine Zeichen und nimm das Ergebnis für den symbol[] ...
Gruß
Jens
Chris M. schrieb:
> nutze ich die LCD-Routine von Ulrich Radig.
Hallo Chris,
ich setzte dieselbe Routine ein und mir stellt sich jetzt noch die
Frage, wie du die Zeichen aufrufst.
LCD_PRINT scheint je nur Ascii zu nehmen, wenn ich das richtig lese?
MfG
Kay