Forum: Compiler & IDEs LCD - Displaycode 4 Bitmodus


von Christian (Gast)


Angehängte Dateien:

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.

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Welche Zeilen verstehst du denn nicht?

von Christian (Gast)


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);

von Klaus W. (mfgkw)


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);

von Klaus W. (mfgkw)


Lesenswert?

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).

von Tom M. (tomm) Benutzerseite


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...

von Ch D. (chrisu) Benutzerseite


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...

von Christian (Gast)


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?

von begeisterter (Gast)


Lesenswert?

Christian schrieb:
> Warum Bit0 und
> Bit1 und keine anderen?

weil es so im datenblatt steht. damit sagt man dem display das es los 
geht^^

von Christian (Gast)


Angehängte Dateien:

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

von Ch D. (chrisu) Benutzerseite


Lesenswert?

>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
Noch kein Account? Hier anmelden.