hallo
wir wollen das LCD 161A von displaytech ansteuern.
in einem 8-bit modus.
die programmiersprache ist c
wir brauchen hilfe bei den datenleitungen
also wir haben rausgefunden das d0 bis d7 für die asci code
zuständigsind oder?
aber mit den datenleitungen en, rs, rw kommen wir nicht zurecht
bitte um hilfe
guten leitwert prof. dr. muchel
danke
hallo
wir wissen nicht wie die en, rs, rw "benutzen sollen"
wir haben auch kein datenblatt gefunden zum LCD-display
also wofür und wie benutzt man en, rs, rw???
danke für die hilfe
guten leitwert flo
en --> wenn der EN Pin von H nach L geht werden die daten/kommandos die
zu dem zeitpunkt am lcd anliegen "gelesen/verarbeitet"
rs --> damit wählst du ob du daten (also ascii zeichen) oder einen
befehl an das lcd sendest
rw --> wenn du keine daten vom lcd lesen willst, dann rw auf gnd
weiß jemand etwas über die Inizialisierung des LCD's??? Man muss woll
auch erst mal denn Speicher anfordern und dann kann man erst das
Display und denn Code eingeben.
Kann uns da jemand helfen ??? Danke
guten leitwert flo
Hallo,
ich bins mal wieder...
Ich versuche gerade ein Display, das den KS0066U verwendet anzusteuern.
Allerdings zeigt das Display nur 8 Schwarze Balken an.
Es handelt sich um ein 1x16 Char Display.
Ich verwende den 8-bit Mode.
DB0...DB7 vom Display hängen an PB0...PB7 am µC (Mega32)
RS ist am PD0, R/W am PD1 und E am PD2.
Bei dem Display handelt es sich um das gleiche, wie beim OP.
Anbei habe ich meinen Sourcecode (C-Code).
Die Hintergrundbeleuchtung geht leider auch nicht...
hab an LED- GND angeschlossen und an LED+ ca. 2,2Volt.
VO hab ich mit so einem Poti fast ganz auf Masse eingestellt, damit der
Kontrast stimmt.
PORTC, steuert nur LEDs, damit man sieht, wenn das Programm irgendwo
"hängt" :-)
Doran
ok, danke, das ist echt gut, ich schaffs auch, das Display so zu
bedienen, aber ich Wirklichkeit gehts halt nicht... Findet Jemand einen
Fehler im Code?
Doran
>Das Display schneidet alles nach dem 8. Zeichen ab... :-(>Was kann man da machen?
Das Display ist real ein 2x8 Zeichen Display.
Wenn du Zeichen 9 beschreiben willst mußt du
in die zweite Zeile wechseln. Mit lcd_gotoxy()
oder sowas.
holger schrieb:
> Das Display ist real ein 2x8 Zeichen Display.> Wenn du Zeichen 9 beschreiben willst mußt du> in die zweite Zeile wechseln. Mit lcd_gotoxy()> oder sowas.
Er hat doch nur eine Zeile im Display. Wie kann er da in die 2.
wechseln?
So, jetzt habe ich aber doch nochmal eine Frage: Ich möchte in der
Funktion write() erkennen, dass wenn Zeichen 8 schon beschrieben wurde,
dass dann automatisch Zeichen 9 beschrieben wird (Also automatischer
"Zeilenwechsel")
Wie kann ich das machen?
hab es schon mit der Funktion visible():
1
voidvisible()
2
{
3
PORTD=0b00000011;//RS und R/W = hight
4
PORTB=0x00;
5
DDRB=0x00;//PINB als Eingang
6
enable();//"E" von low hach high, dann wieder nach low
7
8
if((PINB&0b00001000)==1)//Abfragen, ob Zeichen 8 schon beschrieben.... (liest DD-RAM ein, da RS und R/W high)
9
{
10
DDRB=0xFF;//PORTB wieder als Ausgang
11
PORTD=0x00;//RS und R/W auf low
12
13
//Courser verschieben (DD-RAM)
14
PORTB=0b11000000;//setzt DB7+DB6 auf high, setzt DD-RAM auf 0x40
15
enable();
16
_delay_ms(10);
17
PORTB=0x00;
18
}
19
20
PORTD=0x00;
21
DDRB=0xFF;
22
PORTB=0x00;
23
}
versucht... funktioniert leider nicht..... was kann ich machen?
Meine Funktion visible() wird gleich zum Anfang von write() aufgerufen.
Doran
Hallo,
Wie kann ich vor einer weiteren Ausgabe auf dem Display überprüfen,
wieviele Zeichen gerade auf dem Display sind und wo die stehen?
Über etwas Hilfe würde ich mich freuen!
Doran
Hi
>Wie kann ich vor einer weiteren Ausgabe auf dem Display überprüfen,>wieviele Zeichen gerade auf dem Display sind und wo die stehen?
Einfach mitzählen. Oder du legst dir für jede Zeile einen Puffer im Ram
an.
MfG Spess
ok, wie mach ich das mit dem Puffer im RAM? kenn mich da nicht so aus...
Kann ich nicht einfach so wieder aus dem Display "lesen"?
Doran
PS: funktioniert eigentlich meine Funktion "Busy()"? Benötige ich noch
eine Flanke an "E"???
1
voidbusy()//soll einfach nur warten, bis das Display bereit ist...
Hallo,
mir ist gerade aufgefallen, dass das Senden an das Display hervoragend
klappt - nur ich schaffe es nicht, Daten von dem Display abzurufen (Auch
das mit dem Busy-Flag klappt nicht so richtig).
Wie muss ich grundsätzlich bei Lesen vorgehen? (insbesondere bezogen auf
das "Enable")?
Doran
Hi
>Wie muss ich grundsätzlich bei Lesen vorgehen? (insbesondere bezogen auf>das "Enable")?
Was sagt dir das Datenblatt des Displaycontrollers dazu?
MfG Spess
spess53 schrieb:
> Was sagt dir das Datenblatt des Displaycontrollers dazu?
Das Datenblatt versteh ich noch nicht 100%... außerdem find ich dazu
keine Informationen im Datenblatt!
Doran
Hi
>Das Datenblatt versteh ich noch nicht 100%... außerdem find ich dazu>keine Informationen im Datenblatt!
Dann sieh mal in deinem geposteten Datenblatt des Displays unter 'Read
Mode' nach. Unter 'READ BUSY FLAG & ADDRESS' findest du dann auch in der
Befehls-Tabelle die Pegel für RS und R/W.
Das sollte eigentlich reichen.
MfG Spess
spess53 schrieb:
> Dann sieh mal in deinem geposteten Datenblatt des Displays unter 'Read> Mode' nach. Unter 'READ BUSY FLAG & ADDRESS' findest du dann auch in der> Befehls-Tabelle die Pegel für RS und R/W.
Ja, das ist mir klar soweit. Aber was muss ich bei der "Read operation"
mit "Enable" machen???
Doran
Ich hab grad folgende Information beim lycosen gefunden:
Busy-Flag und Adress-Zähler auslesen
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 1 BF A6 A5 A4 A3 A2 A1 A0
http://www.a-netz.de/lcd.de.php
Heißt für mich soviel wie RS=0 und R/W=1 kurz warten(wie kurz weiß ich
nicht) und D7 ist das busyflag. Weiter ober steht E=1 beim lesen und
schreiben.
Bin mir aber nicht sicher. Am besten einfach mal testen.
Hi
>Ja, das ist mir klar soweit. Aber was muss ich bei der "Read operation">mit "Enable" machen???
In dem Diagramm siehst du eine Kurve, die mir 'E',wie Enable,
beschriftet ist. Genau das was dort steht musst du programmtechnisch
umsetzen.
Entschuldige wenn ich dir keine fertige Lösung anbieten will. Aber
erstens könnte ich das nur in Assembler und zweitens ist weder dir noch
dem Forum geholfen, wenn du nicht verstanden hast was du da
programmierst (oder kopiert hast).
MfG Spess
Doran S. schrieb:
> geht aber nicht, es wird einfach nicht eingelesen... wo könnte der> Fehler liegen? Bin an verzweifeln...
Sieht vom Prinzip her in Ordnung aus.
Reichen die 3 nops vielleicht nicht?
wie ist das eigentlich, was für einen Wert lese ich da ein?
Wenn ich z.B. 7 Zeichen in der 1. Zeile auf dem Display habe. Dann ist
DD-RAM=0x07. Wenn ich dann einlese, dann müssten doch diese ACx-Register
den Wert 0x07 haben - oder wie ist das?
Doran
Hi
>wie ist das eigentlich, was für einen Wert lese ich da ein?>Wenn ich z.B. 7 Zeichen in der 1. Zeile auf dem Display habe. Dann ist>DD-RAM=0x07. Wenn ich dann einlese, dann müssten doch diese ACx-Register>den Wert 0x07 haben - oder wie ist das?
Das hängt von der Initialisierung 'Entry Mode Set' ab.
MfG Spess
spess53 schrieb:
> Entschuldige wenn ich dir keine fertige Lösung anbieten will. Aber> erstens könnte ich das nur in Assembler und zweitens ist weder dir noch> dem Forum geholfen, wenn du nicht verstanden hast was du da> programmierst (oder kopiert hast).
Da hast Du echt recht, ich will es ja auch selbst verstehen.
Habe gerade die Spannung an DB0...DB7 gemessen, während R/W=1 und E=1
war: 2,2Volt konstant!!! ist das normal?
sind da vielleicht Pullups aktiv?
Doran
Hi
>Habe gerade die Spannung an DB0...DB7 gemessen, während R/W=1 und E=1>war: 2,2Volt konstant!!! ist das normal?
Das Display reagiert nicht so richtig auf ein statisches E-Signal. Das
Kriterium ist die H-L-Flanke. Damit werden z.B. anliegende Daten
geschrieben. Beim Lesen sind die Daten erst nach der Flanke gültig.
MfG Spess
Hallo,
ich glaub, ich verstehe hier was nicht richtig...
Mein Display besteht ja aus 2x8Char. Nur mechanisch sind die eben wie
1x16Char angeordnet. Die Adressen für die Zeichen sind im Anhang. (Hab
sie aus dem Datenblatt)
Nun möchte ich also automatisch in der Funktion, die auf das Display
schreibt, erkennen, wann das 8. Zeichen(DD-RAM-Adresse = 0x07)
beschrieben wurde, sodass dann automatisch das 9. Zeichen(DD-RAM-Adresse
= 0x40) beschrieben wird.
Dazu habe ich ja, wie bereits geschrieben, diesen Code...
1
intg=0;
2
3
PORTD=0b00000010;
4
PORTB=0x00;
5
DDRB=0x00;
6
7
PORTD|=(1<<PD2);//E high
8
_delay_us(2);
9
PORTD&=~(1<<PD2);//E low
10
11
g=PINB&0b01111111;//Busy-Flag maskieren, sodass nur die Adresse gelesen wird
12
13
if(g==7)//Wenn cursor an position 8, dann...
14
{
15
DDRB=0xFF;
16
PORTD=0x00;
17
18
//Courser verschieben (DD-RAM) //Dieser Teil des Codes funktioniert...
19
PORTB=0b11000000;//Sprung nach Position 9 (DD-RAM Adresse für Pos 9 = 0x40=0b11000000)
20
enable();//
21
_delay_ms(10);
22
PORTB=0x00;
23
}
24
25
PORTD=0x00;
26
DDRB=0xFF;
27
PORTB=0x00;
...vor der Funktion, die auf das Display schreibt. Der Code soll einfach
die aktuelle Cursor Position auslesen und wenn sie = 0x08 (also 8.
Zeichen bereits beschrieben, dann soll die DD-RAM-Adresse auf 0x40
gesetzt werden. Also 9. Zeichen)
Das mit dem Setzen des DD-RAMs funktioniert auch, nur das erkennen, wann
das 8. Zeichen beschrieben wurde klappt nicht.
Ich weiß, das ist alles etwas schwer zu verstehen, aber ich hoffe, jetzt
kann man mir helfen.
Also: Wie kann ich die aktuelle Cursor Position erkennen/ermitteln
(außer dem Mitzählen)?
Doran