PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD initialisierung



Eric79
08.06.2005, 20:06
Hi @all,
Ich habe ein porblem mit einer LCD initialisierung.
Ich benutze ein 4*20 LCD Display (EADIP204-4 mit von Reichelt) mit KS0073 Controller, ATmega16 bei 1 MHz und das AVR Stundio.

und zwar habe ich mir die LCD routine von mikrocontoller.de geholt
und die funktionier soweit auch wunderbar.
nur hat es den schönheitsfehler, daß bei mir nur die erste und dritte zeile funktioniert. das der display controller von disem tutorial ein aderer ist wie meiner ist mit auch klar.

jetzt habe ich einfach versucht die initialisierungs routine umzumodeln.

So sieht sie orginal aus mit der die erste und dritte zeile funktionieren:

;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00000011 ;muss 3mal hintereinander gesendet
out PORTD, temp1 ;werden zur Initialisierung
rcall lcd_enable ;1
rcall delay5ms
rcall lcd_enable ;2
rcall delay5ms
rcall lcd_enable ;und 3!
rcall delay5ms
ldi temp1, 0b00000010 ;4bit-Modus einstellen
out PORTD, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000 ;noch was einstellen...
rcall lcd_command
ldi temp1, 0b00001100 ;...nochwas...
rcall lcd_command
ldi temp1, 0b00000100 ;endlich fertig
rcall lcd_command
ret

laut datenblatt sollte die initialsierung für mein display so aussehen:

lcd_init:
ldi temp3,0x50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00100000 ; 4 bit Modus
out PORTD, temp1
rcall delay5ms
ldi temp1, 0b00100000 ; für was auch immer
rcall lcd_command
rcall delay5ms
ldi temp1, 0b10000000 ; für zweiline modus
rcall lcd_command ;( vier line modus seht im datenblatt
rcall delay5ms ; an dieser stelle nicht zur verfügung)
ldi temp1, 0b00000000 ;
rcall lcd_command ; für was auch immer
rcall delay5ms
ldi temp1, 0b11110000 ; Display on, curser on,
rcall lcd_command ; blink on
rcall delay5ms
ldi temp1, 0b00000000 ;>
rcall lcd_command ;>
rcall delay5ms ;>
ldi temp1, 0b00010000 ;> clear display
rcall lcd_command ;>
rcall delay5ms ;>
ldi temp1, 0b00000000 ; für was auch immer
rcall lcd_command ;
rcall delay5ms
ldi temp1, 0b01110000 ; increment mode &
rcall lcd_command ; entire shift on
rcall delay5ms
ldi temp1, 0b00000000 ; bis hier funktioniert auch
rcall lcd_command ; meine initialisierung
rcall delay5ms ;
ldi temp1, 0b00001001 ; laut datenblatt stell ich so
rcall lcd_command ; den 4 line modus ein.
rcall delay5ms ; ab hier bleibt dann das display ; dunkel! ](*,)
ret

Hat jemand eine idee woran das liegen könnte?
ich habe an dem display noch einen offenen reset pin mit dem ich nicht so
recht weiss was ich mit dem anfangen soll.
könnte es vielleich auch damit zusammen hängen.

danke schonmal im vorraus

ProgDom
08.06.2005, 21:37
Ich habe auch das Problem mit dem Code von Mikrocontroller.net ! Bei mir wird jedoch nur die erste Zeile angezeigt, weil ich ein 2*16 Display verwende. Und das hat den HD-Controller.

Flite
08.06.2005, 21:58
Wenn ich es noch richtig in Erinnerung habe, wird normalerweise die erste ZEile und die Dritte Zeile nacheinander addressiert und anschließend die 2. zeile und die 4. zeile (auch wenn 3. und 4. Zeile nicht existieren).

Du musst mal im Datenblatt nachschauen, bei welcher Adresse die zweite Zeile beginnt und dann da deinen cursor hinsetzen, bevor du schreibst.

Viele Grüße
Flite

izaseba
08.06.2005, 23:45
Hallo,
schaue mal hier (http://www.repairfaq.org/filipg/LINK/F_Tech_LCD2.html#TECHLCD_002)
Und ganz ganau die Zeile Display RAM Address Set
Übrigens das stimmt, was Flite geschrieben hat, bei Displays mit 4x20 Zeichen ist meistens
Zeile 1 von 0 bis 13h
Zeile 2 von 40h bis 53h
Zeile 3 von 14h bis 27h
Zeile 4 von 54h bis 67h

Gruß Sebastian

Eric79
09.06.2005, 09:31
Also bei meinem Display schaut das so aus:
1.Zeile $00...$13
2.Zeile $20...$33
3.Zeile $40...$53
4.Zeile $60...$73

und der Curser lässt sich auf die Zeile 1. und 3. auch so einstellen.
aber nur nicht die 2. und 4. zeile.

und ich vermute, daß es daran liegt, daß ich den vier zeilen modus aufrufen muß.
aber das funktioniert ja nicht siehe oben.
Gruß

ProgDom
09.06.2005, 16:04
Bei mir funktioniert es nun, indem ich nach jedem 16.Zeichen einfach in die 2.Zeile mit den Befehlen

ldi temp1, 0b11000000
rcall lcd_command
springe. Dabei beginnt meine 2.zeile mit der Adresse $64 !!!