Initialisierung von KS0070B LCD

Gast #825689
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
Angehängte Dateien:
Gast #827020
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
Angehängte Dateien:
#1212263
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
Gast #2470421
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
Angehängte Dateien:

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