mikrocontroller.net

Forum: Compiler & IDEs LCD - Displaycode 4 Bitmodus


Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Zeilen verstehst du denn nicht?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 _delay_ms(15);
   LCD_PORT &= 0xF0;   /* unteres Nibbel von LCD_PORT auf Null machen, oberes Nibbel lassen wie es ist*/
   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*/
   lcd_enable(); // Nummer 1

   _delay_ms(5);
   lcd_enable(); // Nummer 2

   _delay_ms(1);
   lcd_enable();  // Nummer 3 jetzt wurde 0x03 3 mal geschickt...
   _delay_ms(1);

Ich habs versucht zu erklären...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: begeisterter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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^^

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.