Hilfe bei KS0076B

OP #860586
Lesenswert?

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
Gast #860613
Lesenswert?

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
#860658
Lesenswert?

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
#860748
Lesenswert?

@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren