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
Geht es um die Hardwareanbindung? Die Specs zur ANsteuerung stehn doch in Datenblatt zum Controller z.B. KS0066 oder HD44780
Datenblatt Seite 9 von 17 : Interface PIN Connctions => Erklärung !
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
ergenzung wir haben nur das datenblatt im anhang 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
Hier http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html kannst du dir ein LCD simulieren lassen, und per Mausklick an den Datenleitungen rumspielen.
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
vielleicht LCD kaputt??? kann das sein? die 8 Balken, gehen nicht weg...
Hi
Meine C-Kenntnisse sind zwar nur rudimentär, aber bist du sicher das das
richtig ist:
>_delay_us(0.01);
?
MfG Spess
sry, hatte ich experimentell geändert - welcher Wert ist denn zu empfehlen?
Hi >sry, hatte ich experimentell geändert - welcher Wert ist denn zu >empfehlen? Im einfachsten Fall mach 2 oder 3 ASM-Nops rein. MfG Spess
ok, hab jetzt nop's drinne(3), aber es funktioniert immernoch nicht.....
hab gerade noch gemessen: Wenn ich den Mega32 abklemme, dann liegen an den Anschlüssen vom Display (DB0...DB7) 5V an. Normal? Doran
Leute, es geht jetzt......... Ich hatte nur den Kontrast zu arg aufgedreht, darum hat das LCD nur so Balken angezeigt............. :-( Doran
Hallo, jetzt fällt mir gerade ein neues Problem auf... Das Display schneidet alles nach dem 8. Zeichen ab... :-( Was kann man da machen? Doran
Das liegt wahrscheinlich daran, dass ab dem 9.Zeichen ein anderer Adressbereich im CG-RAM benutzt wird. Schau mal in das Tutorial von Ulrich Radig. http://www.ulrichradig.de/home/uploads/images/Daten_Infos_Anleitungen/LC.pdf Auf Seite 4 siehst du genaueres.
>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?
>Er hat doch nur eine Zeile im Display.
Das ist nur eine räumliche Anordnung.
Es ist ein zweizeiliges Display.
holger schrieb: > Das ist nur eine räumliche Anordnung. > Es ist ein zweizeiliges Display. Alles klar jetzt weiß ich wie du das meinst.
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 | void visible() |
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 | void busy() //soll einfach nur warten, bis das Display bereit ist... |
2 | {
|
3 | int BF = 1; |
4 | |
5 | //Read Busy-Flag
|
6 | PORTD = 0b00000010; |
7 | DDRB = 0x00; |
8 | while(1) |
9 | {
|
10 | BF = (PINB & 0b10000000); |
11 | |
12 | if(BF==0) |
13 | break; |
14 | }
|
15 | BF=1; |
16 | DDRB = 0xFF; |
17 | PORTD = 0x00; |
18 | }
|
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
moin Ich bin ja auch dafür das Datenblätter endlich wieder in Deutsch gedruckt zur Verfügung gestellt werden ;-) aber bis es soweit ist ,würde ich an deiner Stelle mal hier nachlesen http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung mfg
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.
Ich versuche es gerade so:
1 | int g=0; |
2 | |
3 | PORTD = 0b00000010; //Nur R/W high |
4 | PORTB = 0x00; |
5 | DDRB = 0x00; //PINB als Eingang |
6 | |
7 | PORTD |= (1<<PD2); //E high |
8 | asm("nop"); |
9 | asm("nop"); |
10 | asm("nop"); |
11 | |
12 | g=PINB; //Pegel (aktuelle DD-RAM Adresse???) von PINB nach g speichern |
13 | |
14 | PORTD &= ~(1<<PD2); //E low |
15 | |
16 | if(g == 8) //Wenn an position 8, dann DD-RAM-Adresse nach 0x40 - 9. Zeichen |
17 | {
|
18 | DDRB = 0xFF; |
19 | PORTD = 0x00; |
20 | |
21 | //Courser verschieben (DD-RAM)
|
22 | PORTB = 0b11000000; |
23 | enable(); |
24 | _delay_ms(10); |
25 | PORTB = 0x00; |
26 | }
|
27 | |
28 | PORTD = 0x00; |
29 | DDRB = 0xFF; |
30 | PORTB = 0x00; |
geht aber nicht, es wird einfach nicht eingelesen... wo könnte der Fehler liegen? Bin an verzweifeln... Doran
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 | int g = 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.