Hallo Leute Verwende den LCD Code von Mikrocontroller.net, um ein Display anzusteuern. Ich verstehe allerdings nichtden ganzen Code. Hab hier mal einen kleinen Teil hineinkopiert. // sendet einen Befehl an das LCD void lcd_command(unsigned char temp1) { unsigned char temp2 = temp1; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen temp1 = temp1 >> 4; // oberes Nibble holen temp1 = temp1 & 0x0F; // maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp1; // setzen lcd_enable(); temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren LCD_PORT &= 0xF0; LCD_PORT |= temp2; // setzen lcd_enable(); _delay_us(42); } // erzeugt den Enable-Puls void lcd_enable(void) { // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16" LCD_PORT |= (1<<LCD_EN); _delay_us(1); // kurze Pause // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern // Beitrag "LCD -> Probleme mit Optimierungsgrad" LCD_PORT &= ~(1<<LCD_EN); } // Initialisierung: // Muss ganz am Anfang des Programms aufgerufen werden. void lcd_init(void) { LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten // muss 3mal hintereinander gesendet werden zur Initialisierung _delay_ms(15); LCD_PORT &= 0xF0; LCD_PORT |= 0x03; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(1); lcd_enable(); _delay_ms(1); // 4 Bit Modus aktivieren LCD_PORT &= 0xF0; LCD_PORT |= 0x02; lcd_enable(); _delay_ms(1); // 4Bit 2 Zeilen 5x7 lcd_command(0x28); // Display ein Cursor aus kein Blinken lcd_command(0x0C); // inkrement / kein Scrollen lcd_command(0x06); lcd_clear(); } Verwende das Display AC-202A. Kann mir bitte jemand den Code erklären, da ich einige Zeilen nicht verstehe. Danke für eure Hilfe.
Fangen wir langsam an ! Was bringt die Zeile mit LCD_PORT &= 0xF0; ? Wenn zu Beginn LCD_PORT null ist und ich dann dies mit 0xF0 verunde kommt meines Erachtens für das Bitmuster null raus. Eigentlich verstehe ich den Sinn des ersten Blocks überhaut nicht. // muss 3mal hintereinander gesendet werden zur Initialisierung _delay_ms(15); LCD_PORT &= 0xF0; LCD_PORT |= 0x03; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(1); lcd_enable(); _delay_ms(1);
Christian schrieb: > Fangen wir langsam an ! > Was bringt die Zeile mit LCD_PORT &= 0xF0; ? > Wenn zu Beginn LCD_PORT null ist und ich dann dies mit 0xF0 verunde > kommt > meines Erachtens für das Bitmuster null raus. Ja. Sind dagegen in LCD_PORT vorher alle Bits gesetzt, werden die Bits gelöscht, die in 0xF0 (also die oberen 4 des Bytes) sind, die anderen nicht angefasst. Welchen Sinn die oberen 4 Bits von LCD_PORT habebn, ergibt sich aus dem Schaltplan... > Eigentlich verstehe ich den Sinn des ersten Blocks überhaut nicht. > > // muss 3mal hintereinander gesendet werden zur Initialisierung > > _delay_ms(15); > LCD_PORT &= 0xF0; wie gesagt die oberen 4 Bits löschen > LCD_PORT |= 0x03; analog die unteren zwei Bits einschalten > LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 das Bit löschen, das sich ergibt durch Verschieben einer 1 um LCD_RS Stellen nach links. > lcd_enable(); Funktion aufrufen > > _delay_ms(5); Funktion aufrufen (warten) ... > lcd_enable(); > > _delay_ms(1); > lcd_enable(); > _delay_ms(1);
Welchen Sinn übrigens das Setzen und Löschen von Bits hat, ergibt sich aus dem Handbuch zum Display (oder einem beliebigen anderen mit Controller HD44780).
Christian schrieb: > Was bringt die Zeile mit LCD_PORT &= 0xF0; ? > Wenn zu Beginn LCD_PORT null ist und ich dann dies mit 0xF0 verunde > kommt meines Erachtens für das Bitmuster null raus. Und wenn LCD_PORT irgend was anderes ist? Die Routine sorgt dafür, dass dDas high nibble des LCD_PORTS sauber erhalten bleibt. Könnte ja sein, dass da weitere Hardware dranhängt...
1 | _delay_ms(15); |
2 | LCD_PORT &= 0xF0; /* unteres Nibbel von LCD_PORT auf Null machen, oberes Nibbel lassen wie es ist*/ |
3 | LCD_PORT |= 0x03; // Nun 0x03 zum initialisieren 3(!) mal schicken |
4 | LCD_PORT &= ~(1<<LCD_RS); /* RS auf 0 weil es ein command und nicht daten sind*/ |
5 | lcd_enable(); // Nummer 1 |
6 | |
7 | _delay_ms(5); |
8 | lcd_enable(); // Nummer 2 |
9 | |
10 | _delay_ms(1); |
11 | lcd_enable(); // Nummer 3 jetzt wurde 0x03 3 mal geschickt... |
12 | _delay_ms(1); |
Ich habs versucht zu erklären...
@ Christian D. LCD_PORT |= 0x03; // Nun 0x03 zum initialisieren 3(!) mal schicken LCD_PORT &= ~(1<<LCD_RS); /* RS auf 0 weil es ein command und nicht daten sind*/ Mir ist schon klar, dass Bit0 und Bit1 auf logisch high liegen und somit geseetzt sind. Die zweite Zeile verstehe ich auch, aber was macht das LCD, wenn ein Befehl und keine Daten übermittelt werden? Warum Bit0 und Bit1 und keine anderen?
Christian schrieb: > Warum Bit0 und > Bit1 und keine anderen? weil es so im datenblatt steht. damit sagt man dem display das es los geht^^
Mitlerweile habe ich mir das Datenblatt von HD44780U durchgelesen. Auf Seite 46 ist das Blockdiagramm meiner bisherigen Frage dargestellt. Mir ist nur aufgefallen, dass das letzte _delay_ms(1); nicht aufgelistet ist. // muss 3mal hintereinander gesendet werden zur Initialisierung _delay_ms(15); LCD_PORT &= 0xF0; LCD_PORT |= 0x03; LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 lcd_enable(); _delay_ms(5); lcd_enable(); _delay_ms(1); lcd_enable(); _delay_ms(1); // <= dieses delay ist nicht im Bockschaltbild Ist dieses delay für die Funktion notwendig, auch wenn es nicht im Dtenblatt aufgelistet ist? Weiters finde ich im Datenblatt die weiteren Codezeilen nicht. // 4 Bit Modus aktivieren LCD_PORT &= 0xF0; LCD_PORT |= 0x02; lcd_enable(); _delay_ms(1); // 4Bit 2 Zeilen 5x7 lcd_command(0x28); // Display ein Cursor aus kein Blinken lcd_command(0x0C); // inkrement / kein Scrollen lcd_command(0x06); lcd_clear(); Wo ist diese Vorgehensweise im Datenblatt aufgelistet? Vielleicht kann mir jemand auch diese Zeilen erläutern bzw. sagen wo ich im Datenblatt diese finde. Danke für eure Hilfe
>Ist dieses delay für die Funktion notwendig, auch wenn es nicht im >Datenblatt aufgelistet ist? kann ja nie schaden^^ wenn es geht kannst du es ja wieder weg machen. Auf Seite 24 steht alles zur init...
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.