LCD - Displaycode 4 Bitmodus

Gast #1534133
Lesenswert?

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.
Angehängte Dateien:
Gast #1534161
Lesenswert?

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);
#1534172
Lesenswert?

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);
Persönliche Seite #1534180
Lesenswert?

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...
Persönliche Seite #1534182
Lesenswert?

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...
Gast #1534197
Lesenswert?

@ 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?
Gast #1534404
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren