Hi! Habe vor Kurzem ein Display von Electronic Assembly in die Hände bekommen. Bisher läuft es recht gut, nur bin ich mit dem Kontrast überhaupt nicht zufrieden! Den kann man ja bereits bei der init festlegen. ich habe alle C-Bits laut DB gesetzt, nur sehe ich immer noch gleich viel. Einen Text zu schreiben geht, nur lesen wird verdammt schwer. Gibt es da irgendeine Lösung, oder habden diese Displays generell einen schlechten Kontrast? Ansocnsten sehen die wirklich top aus... Oder mache ich nur etwas grundsätzlich verdreht? Freue mich auf jede Hilfe!! Vielen Dank und freundliche winterliche Grüße philipp
Ich dabe das Teil in einem Projekt im Einsatz. Zur Kontraständerung muß zunächst die Instruction-Tabelle umgeschaltet werden. Hier ist meine Init-Sequenz: void Lcd_Init(void) { Lcd_Ctrl(0b00111001); // 8-Bit, 2 Zeilen, Instr. Table 1 Lcd_Ctrl(0b00011101); // BS:1/4, 3-Zeiliges LCD Lcd_Ctrl(0b01010000); // Booster aus Kontrast C5, C4 setzen Lcd_Ctrl(0b01101100); // Spannungsfolger und Verstärkung setzen Lcd_Ctrl(0b00001100); // Display ein, Cursor aus Lcd_Ctrl(0b00000110); // Cursor Auto-Increment Lcd_Ctrl(0b00111000); // 8-Bit, 2 Zeilen, Instr. Table 0 } Und hier die Routine zur Kontrasteinstellung: void Lcd_SetContrast(U8 b) { Lcd_Ctrl(0b00111001); // 8-Bit, 2 Zeilen, Instr. Table 1 Lcd_Ctrl(b | 0b01110000); // Kontrast C3,C2,C1,C0 setzen Lcd_Ctrl(0b00111000); // 8-Bit, 2 Zeilen, Instr. Table 0 } Ich hoffe, ich konnte Dir damit helfen. mfG. Erwin Reuss
Was denn für ein Display genau? Die Dinger mit Hintergrundbeleuchtung sind natürlich nicht so toll was den Kontrast an geht. Das normale EA-Dog ohne Hintergrundbeleuchtung ist aber sehr gut lesbar.
@Erwin Super, jetzt habe ich erst überrissen was es mit den verschiedenen Instruction tables auf sich hat. Nun funkt es auch tadellos mit dem Contrast. (Das Display ist ein 16x2 EA DOG-M mit blauer Hintergrundbeleuchtung) Achja noch etwas. Ich versuchte das Display so zu initialisieren, dass es die Zeichen doppelt so groß darstellt. Nun sehe ich die zeichen zwar doppelt so groß, nur leider fehlen zwischen den zeilen pixel. Ist es bei der Initialisierung ausreichend in Fubction Set DH="1" und N="0" zu setzen? oder muss ich sonst noch was einstellen? vielen dank nochmals!!! schöne grüße philipp
> nur leider fehlen zwischen den zeilen pixel.
Was vollkommen normal ist, da du ja ein 2-Zeilen Display hast.
Aha, eigentlich logisch. Da hab ich mich wohl zu früh gefreut. Wäre doch ein super Feature gewesen, naja egal. Das Teil läuft jetzt ziemlich gut, sieht auch super aus!! Hat jemand schon mal etwas mit customchars mit so einem DOG-Display ausprobiert? Das wäre so das nächste was in in Angriff nehmen würde grüße philipp
> Hat jemand schon mal etwas mit customchars mit so einem DOG-Display > ausprobiert? Ja :)
1 | ////////////////////////////////////////////////////////////////////////
|
2 | /*!
|
3 | * \brief LCD Zeichen Generieren
|
4 | * \param new_char Datenstring mit Hex Werten für 8 Zeilen und 5 Spalten
|
5 | * \param addr CGRAM Adresse 0x00 oder 0x08
|
6 | */
|
7 | void LCD_generate_icon (unsigned char *new_char, unsigned char addr) |
8 | {
|
9 | unsigned char i; |
10 | |
11 | i = 0; |
12 | |
13 | LCD_SET_INSTRUCTION; // RS auf low (Instruction) |
14 | |
15 | put_LCD_Data_out(FUNCTION_NORM_MODE); // 8/4 Bit operation, 1/2 Zeilen |
16 | LCD_clock(); // Befehl ausfuehren |
17 | |
18 | put_LCD_Data_out(addr); // Set CGRAM Adress |
19 | LCD_clock(); // Befehl ausfuehren |
20 | |
21 | |
22 | LCD_SET_DATA; // RS auf high (Daten) |
23 | |
24 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
25 | LCD_clock(); // Befehl ausfuehren |
26 | |
27 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
28 | LCD_clock(); // Befehl ausfuehren |
29 | |
30 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
31 | LCD_clock(); // Befehl ausfuehren |
32 | |
33 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
34 | LCD_clock(); // Befehl ausfuehren |
35 | |
36 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
37 | LCD_clock(); // Befehl ausfuehren |
38 | |
39 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
40 | LCD_clock(); // Befehl ausfuehren |
41 | |
42 | put_LCD_Data_out(new_char[i++]); // Char Zeile einfach auf Port |
43 | LCD_clock(); // Befehl ausfuehren |
44 | }
|
45 | ////////////////////////////////////////////////////////////////////////
|
Wobei mir auffällt das man das auch schön in ner Schleife hätte programmieren können... Na ja, egal, es funktioniert ;)
Super! Eine Frage gleich dazu: Ein Zeichen besteht ja bekanntemaßen aus pixeln, welche ich setzten(einschalten) und löschen(ausschalten kann. Ist es dann auch richtig, dass ich zb. wenn ich ein "T" darstellen will 8mal 8bit (da 8 Spalten) mit richtig gesetzten Bits? verdammt, das kling unverständlich... also so: 1.) 000111111 2.) 000001000 3.) 000001000 4.) 000001000 5.) 000001000 6.) 000001000 7.) 000001000 8.) 000000000 Da Du in deinem Code nur 7 mal etwas schreibst, gehe ich davon aus, dass man eine Nullzeile gar nicht schreiben bräuchte. Könnte ich diese denn überhaupt verweden? Wäre ja eigenlich für den Cursor gedacht? Benutzt du bei deinem Code den internen Icon-Speicher? oder geht es auch ohne? Vielen vielen Dank für deine Hilfe grüße philipp
Achja, noch eine Sache die ich nicht ganz verstehe: Mit der Instruction Table 0 kann ich ja bereits bei der Initialisierung die CGRAM-Adresse setzen. Muss ich das machen? Oder mache ich das z.b auch nach der init, indem ich mit dem FunctionSet in die IT0 gehe und dort meine Adresse setzte? Achja, der CGRAM hat 6bits platz, also 63 Mögliche Speicherstellen, nicht? Im DB des ST7036 steht: "In the character generator RAM, the user can rewrite character patterns by program. For 5 x 8 dots, eight character patterns can be written." Heißt das, ich kann nur 8 Zeichen speichern, oder sind da die Zeilen gemeint? so, morgen werde ich mich mal dran wagen!! grüße philipp
So, jetzt verzfeifle ich! Wie ich meine Zeichen ins CGRAM bekomme, ist mittlerweile ziemlich klar; Nur eine Frage bleibt noch: Die Adressen des CGRAM wie verwende ich die? Es sind ja 6bits da, kann ich die adressen so vergeben: zb adr 15 = 0b01001111 (die letzten 1er für 15 dez, der erste für den Befehl laut DB) Oder kann ich nur jedes Bit für ein Zeichen nutzten? zb. 0b01000001 für das erste zeichen; 0b01000010 fürs zweite? Wenn ich nun die Zeichen im Display habe, wie sag ich dem Ding, dass er mir das Zeichen anzeichen soll? Hier mein Code; vielleicht hilfts: void lcd_generate_icon(unsigned char *zeichen, unsigned char adr) { unsigned char i=0, a; a=(adr<<3) | 0x40; lcd_write(0b00101000, 0); //Function Set mit IT0 - Instruction lcd_write(0b01000000, 0); //CGRAM adresse setzten - Instruction for(i=0; i<8; i++) { lcd_write(0b01000000, 0); lcd_write(*zeichen, 1); /Daten ins RAM schreiben - Data zeichen++; } } Meine Idee zum Anzeigen war: void lcd_show_icon(unsigned char adr) { unsigned char a; a=(adr<<3) | 0x40; lcd_write(0b00101000, 0); //Function Set mit IT0 - Instruction lcd_write(a, 0); } Das funktioniert allerdings NICHT!!! Verdammt! Kann mir jemand einen guten Tip geben? Wäre demjenigen sehr dankbar! freundliche Grüße philipp
@ Philipp Putzer: Wäre es möglich dass Du Deinen LCD-Code mal komplett postest? Ich will das Ding auch mit 8 Bit betreiben und bekomme es nicht zum laufen. Danke schonmal :-) Ivo
Ja, kann ich machen. Ist aber nicht alles von mir, nur der Teil fürs DOG-LCD. Hier erst mal die C-Datei Grüße
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.