mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Initialisierung von KS0070B LCD


Autor: martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:Lc...). 
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:
void lcd_init(void)
{
  _delay_ms(100); //wegen Spannungsversorgung
  
   PORT_LCD &= 0x0F; /* bei den 2 zeilen bin ich mir nicht sicher, wofür man die überhaupt braucht */
   PORT_LCD |= 0x30; 
   
   PORT_LCD &= ~(1<<LCD_RS);    // clear RS
 

   lcd_enable();
   _delay_ms(5);

//Function set
   lcd_command(0x20); //0010 0000
   lcd_enable();
   _delay_ms(1);
   lcd_command(0x20); //0010 0000
   lcd_enable();
   _delay_ms(1);
   lcd_command(0x80); //1000 0000


lcd_enable();
_delay_us(50);

//Display on
lcd_command(0x00);
lcd_command(0xC0); //1100 0000

lcd_enable();
_delay_us(50);

//Clear Display
lcd_command(0x00);
lcd_command(0x10); //0001 0000

lcd_enable();
_delay_ms(3);

//Entry Mode
lcd_command(0x00);
lcd_command(0x30); //0011 0000

lcd_clear();

}


Kann mir bitte jemand helfen die Initialisierung richtig hinzubekommen.

lg, martin

Autor: martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void lcd_data(unsigned char temp1);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_out(char *s);
void set_cursor(uint8_t x, uint8_t y);
void lcd_out_var(int16_t var);

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

mfg martin

Autor: Slawo Janotta (slawo)
Datum:

Bewertung
0 lesenswert
nicht 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:
;
; Initialize LCD
;
           ; function set
           ldi   TMP1, 0b00100000 ; pad byte
           out   DATA_PORT, TMP1
           rcall lcd_enable
           rcall delay1ms
           rcall lcd_enable
           rcall delay1ms
           rcall lcd_enable
           rcall delay1ms


           ldi TMP1, 0b00101000 ; function set
           rcall lcd_command
           rcall delay1ms
   
           ldi TMP1, 0b00001100 ; display on
           rcall lcd_command
           rcall delay1ms

           ldi TMP1, 0b00000110 ; entry mode set
           rcall lcd_command

           rcall delay1ms

           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

Autor: Marcel F. (kellertuer)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Marcel F. (kellertuer)
Datum:

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

Autor: Alex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.