Hallo, habe ein Probelm bei der Initialisierung des KS0076B(LCD Modul von Reichelt) Controllers. Möchte das Display mit 8Bit betreiben. Es besitzt 5*7 Dots und 2 Zeilen. Verwende einen ATmega162 mit einem externen 8MHz Quarz. Die Init laut Datenblatt ist wie folgt: - POWER On - Wait for more then 15ms - RS=0, R/W=0, DB7=0, DB6=0, DB5=1, DB4=1 - Wait for more then 4,1ms - RS=0, R/W=0, DB7=0, DB6=0, DB5=1, DB4=1 - Wait for more then 100us - RS=0, R/W=0, DB7=0, DB6=0, DB5=1, DB4=1 - RS=0, R/W=0, DB7=0, DB6=0, DB5=1, DB4=1, DB3=N, DB2=F - RS=0, R/W=0, DB7=0, DB6=0, DB5=0, DB4=0, DB3=1, DB2=0 (Display off) - RS=0, R/W=0, DB7=0, DB6=0, DB5=0, DB4=0, DB3=0, DB2=0,DB1=0, DB0=1 (Clear) -RS=0, R/W=0, DB7=0, DB6=0, DB5=0, DB4=0, DB3=0, DB2=1, DB1=I/D, DB0=Sh (Entry mode set) Quelltext: void Display_Init(void) { //-----Enable Display-------// _delay_ms(5000); Display_Enable = 1; _delay_ms(200); //--------1--Fset------------------// Display_DB4 = 1; Display_DB5 = 1; _delay_ms(500); Display_DB4 = 0; Display_DB5 = 0; _delay_ms(500); //---------2-----Fset-----------------// Display_DB4 = 1; Display_DB5 = 1; _delay_ms(500); Display_DB4 = 0; Display_DB5 = 0; _delay_ms(500); //---------3-----Fset-----------------// Display_DB4 = 1; Display_DB5 = 1; _delay_ms(500); Display_DB4 = 0; Display_DB5 = 0; _delay_ms(500); //------------SET Funktion-------------// Display_DB3 = 1; Display_DB4 = 1; Display_DB5 = 1; _delay_ms(500); Display_DB3 = 0; Display_DB4 = 0; Display_DB5 = 0; _delay_ms(500); //---------------Display Off-------------------------// /* Display_DB3 = 1; _delay_ms(15); Display_DB3 = 0; _delay_ms(15);*/ //--------Display on------// Display_DB3 = 1; Display_DB2 = 1; Display_DB1 = 1; Display_DB0 = 1; _delay_ms(15); Display_DB3 = 0; Display_DB2 = 0; Display_DB1 = 0; Display_DB0 = 0; _delay_ms(15); //-----------Display clear------------// Display_DB0 = 1; _delay_ms(15); Display_DB0 = 0; _delay_ms(15); //----------Entrymode set-------// Display_DB2 = 1; Display_DB1 = 1; Display_DB0 = 0; _delay_ms(15); Display_DB2 = 0; Display_DB1 = 0; Display_DB0 = 0; _delay_ms(15); //--------Display on------// Display_DB3 = 1; Display_DB2 = 1; Display_DB1 = 1; Display_DB0 = 1; _delay_ms(15); Display_DB3 = 0; Display_DB2 = 0; Display_DB1 = 0; Display_DB0 = 0; _delay_ms(15); } Gruß Dominik
Der Enable-Impuls fehlt, nur dann werden auch die angelegten Daten vom Display übernommen, so z.B.: Display_Enable = 0; Display_DB4 = 1; Display_DB5 = 1; Display_DB4 = 0; Display_DB5 = 0; RS = 0; // oder 1 WR = 0; Display_Enable = 1; _delay_ms(xxx); // einige µS, je nach Datenblatt Display_Enable = 0; _delay_ms(xxx); // Wartezeit bis Befehl ausgeführt, Zeit steht im Datenblatt ... nächste Befehlssequenz
Wie ist das genau gemeint mit dem Enable PIN? Wenn ich dem Display Daten Sende dann muss Enable = 0 sein und wenn der Befehl abgeschlossen ist dann geht Enable wieder auf 1 Delay wird gesetzt oder wie?? Gruß Dominik
Hallo, E auf L lassen, Daten und Steuerleitungen passend setzen. Dann E auf H, mindestens minimale Impulsdauer laut Datenblatt auf H lassen, dann wieder auf L. Wartezeit für die Befehlsausführung und dann nächste Daten usw. So ist es mir am übersichtlichsten. Man kann auch E auf H setzen, dann Daten und Steuerleitungen setzen, dann E wieder auf L. Spart meist die Wartezeit für die Impulsbreite, übernommen wird mit der H/L-Flanke. Genaues muß man sich aus den Impulsdiagrammen und Tabellen des Controller-Datenblattes raussuchen. Gruß aus Berlin Michael
Habe es so mal Programmiert und getestet geht auch leider nicht. Hat einer noch eine Idee oder ev. sogar schon mal die „Init“ für so ein Display geschrieben und könnte es mir zur Verfügung stellen? ^^
@Dominik, ich habe ein 4x40 Display im Einsatz also eigentlich sind es 2 Displays 2x40. Ich fahre über 4 Datenleitungen daher könnte sich der INIT Code etwas anderst sein als bei 8 Datenleitungen.
1 | void lcd_init(void) |
2 | {
|
3 | LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN1) | (1<<LCD_EN2); // Port auf Ausgang schalten |
4 | |
5 | // muss 3mal hintereinander gesendet werden zur Initialisierung
|
6 | Display = 0x03; // beide Displays init |
7 | _delay_ms(15); |
8 | LCD_PORT &= 0xF0; |
9 | LCD_PORT |= 0x03; |
10 | LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 |
11 | lcd_enable(); |
12 | |
13 | _delay_ms(5); |
14 | lcd_enable(); |
15 | |
16 | _delay_ms(1); |
17 | lcd_enable(); |
18 | _delay_ms(1); |
19 | |
20 | // 4 Bit Modus aktivieren
|
21 | LCD_PORT &= 0xF0; |
22 | LCD_PORT |= 0x02; |
23 | lcd_enable(); |
24 | _delay_ms(1); |
25 | |
26 | // 4Bit / 2 Zeilen / 5x7
|
27 | lcd_command(0x28); |
28 | |
29 | // Display ein / Cursor aus / kein Blinken
|
30 | lcd_command(0x0C); |
31 | |
32 | // inkrement / kein Scrollen
|
33 | lcd_command(0x06); |
34 | Display = 0x00; //Display deaktivieren |
35 | |
36 | lcd_clear(0x01); |
37 | lcd_clear(0x02); |
38 | }
|
Ich hoffe es hilft Dir etwas weiter. Thomas
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.