Forum: Mikrocontroller und Digitale Elektronik Initialisierung von KS0070B LCD


von martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Bin grade am grübeln, wie die Initialisierung meines DEM16216 LCDs mit 
KS0070B-Chip funktioniert. Das LCD soll im 4Bit Modus ohne R/W Leitung 
arbeiten (siehe 
http://www.roboternetz.de/wissen/index.php/Bild:Lcdmodul_4bit_schem.png). 
Ich habs am PortB hängen, wobei die Anschlüsse so belegt sind:

DB4 = B.0
DB5 = B.1
DB6 = B.2
DB7 = B.3
EN  = B.4
RS  = B.5

Im Datenblatt des LCDs (im Anhang) ist die Initialisierung für den 4 
Bit-Modus zwar angegeben aber ich blicke mich da nicht ganz durch. Z.B. 
muss man für Function Set 3 Befehle hintereinander schicken. Aber was 
ist zwischen den Befehlen - nichts, enable oder vielleicht delays?? So 
sieht meine bisherige Initialisierung aus:
1
void lcd_init(void)
2
{
3
  _delay_ms(100); //wegen Spannungsversorgung
4
  
5
   PORT_LCD &= 0x0F; /* bei den 2 zeilen bin ich mir nicht sicher, wofür man die überhaupt braucht */
6
   PORT_LCD |= 0x30; 
7
   
8
   PORT_LCD &= ~(1<<LCD_RS);    // clear RS
9
 
10
11
   lcd_enable();
12
   _delay_ms(5);
13
14
//Function set
15
   lcd_command(0x20); //0010 0000
16
   lcd_enable();
17
   _delay_ms(1);
18
   lcd_command(0x20); //0010 0000
19
   lcd_enable();
20
   _delay_ms(1);
21
   lcd_command(0x80); //1000 0000
22
23
24
lcd_enable();
25
_delay_us(50);
26
27
//Display on
28
lcd_command(0x00);
29
lcd_command(0xC0); //1100 0000
30
31
lcd_enable();
32
_delay_us(50);
33
34
//Clear Display
35
lcd_command(0x00);
36
lcd_command(0x10); //0001 0000
37
38
lcd_enable();
39
_delay_ms(3);
40
41
//Entry Mode
42
lcd_command(0x00);
43
lcd_command(0x30); //0011 0000
44
45
lcd_clear();
46
47
}


Kann mir bitte jemand helfen die Initialisierung richtig hinzubekommen.

lg, martin

von martin (Gast)


Angehängte Dateien:

Lesenswert?

Bin jetzt doch noch von alleine draufgekommen. Für alle die auch 
Probleme mit dem initialisieren eines KS0070B im 4 Bit Modus (ohne R/W) 
haben, liegt die komplette LCD-Routine im Anhang vor. Ich möchte euch 
die Stunden der Verzweiflung ersparen. In der lcd-routines.h steht 
folgendes drinnen:
1
void lcd_data(unsigned char temp1);
2
void lcd_command(unsigned char temp1);
3
void lcd_enable(void);
4
void lcd_init(void);
5
void lcd_home(void);
6
void lcd_out(char *s);
7
void set_cursor(uint8_t x, uint8_t y);
8
void lcd_out_var(int16_t var);

In der main.c schreibt man dann (gilt jetzt nur für meine Beschaltung an 
PORTB):
1
#include "lcd-routines.h"
2
int main(void)
3
{ lcd_init();
4
  DDRB |= 0x3F;
5
  lcd_out("LCD-Testprogramm");
6
}

mfg martin

von Slawo J. (slawo)


Lesenswert?

Ich habe ein ähnliches Display (DEM 16216 SBH-PW-N)
Danke Martin, ohne deine C-Routine wäre ich wohl nie drauf gekommen, wie 
man das richtig machen soll :-)
Hier meine Init-Routine in Assembler, die ich von Martins C-Routine 
abgeleitet habe:
1
;
2
; Initialize LCD
3
;
4
           ; function set
5
           ldi   TMP1, 0b00100000 ; pad byte
6
           out   DATA_PORT, TMP1
7
           rcall lcd_enable
8
           rcall delay1ms
9
           rcall lcd_enable
10
           rcall delay1ms
11
           rcall lcd_enable
12
           rcall delay1ms
13
14
15
           ldi TMP1, 0b00101000 ; function set
16
           rcall lcd_command
17
           rcall delay1ms
18
   
19
           ldi TMP1, 0b00001100 ; display on
20
           rcall lcd_command
21
           rcall delay1ms
22
23
           ldi TMP1, 0b00000110 ; entry mode set
24
           rcall lcd_command
25
26
           rcall delay1ms
27
28
           rcall lcd_clear
Zu beachten:
Das Pad-Byte muss eventuell umgedreht werden (bei mir hängen DB4-DB7 an 
PORT4-PORT7)
Die restlichen Bytes sind bereits "normale" Commands, die Nibble-weise 
übertragen werden

von Marcel F. (kellertuer)


Lesenswert?

Hi, ich habe auch so meine Probleme mit der Ansteuerung eines KS0070B.

Was ist denn in deinem Beitrag mit dem "pad-byte" gemeint? Das kann ich 
nirgends in Datenblättern finden..

von Marcel F. (kellertuer)


Lesenswert?

is das geil..... ich habs geschafft. es lag nur an nem WACKELKONTAKT!!! 
das is echt fies... ich hab schon an mir gezweifelt... ;)

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich hoffe diesen Thread wird nochmal jemand lesen...
Und zwar stehe ich nun vor folgendem Problem. Ich benutze das gleiche 
Display wie der Martin, habe allerdings andere Pinbelegungen.

RS -> PD2
E  -> PD3

DB4 -> PD4
DB5 -> PD5
DB6 -> PD6
DB7 -> PD7


Nun hätte ich ein paar Fragen:


1.) Was ist denn der Unterschied von "void lcd_data" zu "void 
lcd_command"?  Was macht dieses RS?

2.) In diesen beiden Funktionen werden ja obere und untere Nibble 
gesetzt... da ich ja von der Pinbelegung anders bin, muss ich hier doch 
auch was ändern! Muss ich nun beim oberen Nibble die unteren 4 Bits 
löschen und bei unteren Nibble die oberen 4 Bits und das ganze dann nach 
links verschieben?

3.) Die Funktion "void lcd_enable" kann ich doch belassen oder?

4.) Bei der Funktion "void lcd_init" müssen neue Einstellungen bei 
LCD_DDR und PORT_LCD vorgenommen werden, stimmts? Reicht es, wenn ich 
hier die Einstellungen einfach umdrehe, also aus "0x0F" -> "0xF0" und 
auch "0x03" -> "0x30" mach?

5.) Wenn ich den Cursor nicht benutzen will, kann ich dann einfach die 
Funktionen "void lcd_home" und "void set_cursor" löschen? Muss ich 
dementsprechend auch andere Einstellungen in der "lcd_init" vornehmen?


Ich hänge mal die von mir geänderte Datei als Anhang an.


Außerdem würde mich noch eines interessieren. Der Martin hat ja die 
Datei "lcd_routines.c" angehängt und erwähnt das in die Datei 
"lcd_routines.h" der Code aus seinem Beitrag eingefügt werden soll. 
Weiter unten hat er dann ja den Code für die "main.c" geschrieben. Muss 
ich nun die Funktionen aus der "lcd_routines.c" in die "main.c" einfügen 
oder wie binde ich diese Datei noch mit ein?


Wäre toll, wenn ihr mir helfen könntet...!


Gruß und frohe Weihnachten

Alexander

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.