Forum: Mikrocontroller und Digitale Elektronik Hilfe bei KS0076B


von Dominik B. (dominik123)


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

von Matthias (Gast)


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

von Dominik B. (dominik123)


Lesenswert?

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

von Michael U. (amiga)


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

von Dominik B. (dominik123)


Lesenswert?

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? ^^

von Thomas S. (thomass)


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

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
Noch kein Account? Hier anmelden.