Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuerung


von Andreas V. (wicky)


Lesenswert?

Hallo,

jetzt bin ich endlich soweit das ich mich an die Ansteuerung eines LCD 
Displays heran traue.
Ich arbeite mit einem STK 600 und einem ATMEGA 2560.

Zum erlernen habe ich mir als Hilfe das Tutorial/LCD Ansteuerung zur 
Hilfe genommen.

LCD besorgt,angeschlossen, Bsp. Code geladen. Alles läuft, alles Prima, 
Text wird auf dem Display ausgegeben.

Nun wollte ich hergehen und mir den Code mal etwas genauer ansehen, um 
die ansteuerung besser zu verstehen.

Da bin ich gleich bei der initialisierung über etwas gestolpert und ich 
hoffe Ihr könnt mir dazu ein paar Tips geben.

Der Code (Auszug):

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

Frage,
LCD_PORT &= 0xF0; sollen hier alle Ports von Port D auf 0 gesetzt 
werden?
LCD_PORT &= ~(0xF09); wäre es so dann nicht sicherer alle Ports 0?

Gruß,
Andreas

von Karl H. (kbuchegg)


Lesenswert?

Andreas V. schrieb:

> Frage,
> LCD_PORT &= 0xF0; sollen hier alle Ports von Port D auf 0 gesetzt
> werden?

Nein.
Nicht alle.

Nur die 4 niederwertigsten Bit an denen die 4 Datenleitungen des LCD 
hängen.
Die restlichen 4 lässt der Code in Ruhe, da er ja nicht wissen kann, ob 
und wenn ja was, dort angeschlossen ist.

von Andreas V. (wicky)


Lesenswert?

OK, seh ich ein.
Aber wenn ich das im AVR Studio im Debbug Modus laufen lasse, werden die 
4 höherwertigen Bits nicht gesetzt!
Das hat mich halt iritiert.

von Karl H. (kbuchegg)


Lesenswert?

Andreas V. schrieb:
> OK, seh ich ein.
> Aber wenn ich das im AVR Studio im Debbug Modus laufen lasse, werden die
> 4 höherwertigen Bits nicht gesetzt!

:-)

Mit
LCD_PORT &= 0xF0
setzt man auch keine Bits, sondern man löscht sie.
0xF0  =  0b11110000
               +  +
               ----

die 4 0-Bits sind dafür zuständig, dass am LCD_PORT die 
korrespondierenden Bits auf jeden Fall 0 werden. Bei den Stellen an 
denen binär eine 1 steht, ändert sich nichts. Wenn vorher dort am 
LCD_PORT eine 1 war, dann ist sie das auch nachher. War vorher dort eine 
0, dann ist nach der Operation dort eine 0.

von Andreas V. (wicky)


Lesenswert?

vielen Dank für schnelle sehr verständliche und freundliche Antwort.

Eine Frage aber noch zum Abschluß:

also muß ich oder brauche ich in diesem Fall das ~(Einerkompliment) zum 
löschen nicht einsetzen?
Weil ja in diesem Status noch nichts gesetzt war? Kann ich dies so 
verstehen?

von Karl H. (kbuchegg)


Lesenswert?

Andreas V. schrieb:
> vielen Dank für schnelle sehr verständliche und freundliche Antwort.
>
> Eine Frage aber noch zum Abschluß:
>
> also muß ich oder brauche ich in diesem Fall das ~(Einerkompliment) zum
> löschen nicht einsetzen?

Das Einerkomplement ist schon mit drinn

In Einerkomplemetschreibweise wäre das

   LCD_PORT &= ~(0x0F);

> Weil ja in diesem Status noch nichts gesetzt war? Kann ich dies so
> verstehen?

Du kannst es so verstehen, dass der Programmierer dem Compiler Arbeit 
abgenommen hat.

von Andreas V. (wicky)


Lesenswert?

Super,vielen Dank nochmal.

Gruß,
Andreas

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.