Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zu LCD Ansteuerung in C


von Fuzzy (Gast)


Lesenswert?

Hallo,

da ich beruflich momentan mit 'C' zu tun habe wollte ich ein LCD Display 
mit einem Atmega8 ansteuern. Ich hab in folgendem Artikel die Datei 
lcd-routines.c

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.c:

und die zugehörige Headerdatei lcd-routines.h gefunden.


https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Datei_lcd-routines.h

Trotz suche im Internet und hier im Forum verstehe ich folgende Zeilen 
in lcd-routines.cnicht:

    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen

Was bedeutet (4-LCD_DB)? LCD_DB ist ja PD0. 4-PD0 ???
Die Datenbits sollen über PD0-PD3 geliefert werden. Heisst das an 4. 
letzte Position gehen (PD3) und dann Data dorthin schreiben?

Hier die gesamte Funktionen:
1
////////////////////////////////////////////////////////////////////////////////
2
// Sendet eine 4-bit Ausgabeoperation an das LCD
3
static void lcd_out( uint8_t data )
4
{
5
    data &= 0xF0;                       // obere 4 Bit maskieren
6
 
7
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
8
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
9
    lcd_enable();
10
}

LCD_DB stammt aus der Headerdatei:
1
////////////////////////////////////////////////////////////////////////////////
2
// Pinbelegung für das LCD, an verwendete Pins anpassen
3
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
4
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
5
 
6
//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_DB        PD0

Ich hoffe ich habe die Formatierungen richtig gemacht :-).

Vielen Danke schon mal für eine hilfreiche Erklärung!

Gruß
Fuzzy

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Fuzzy schrieb:
> LCD_DB ist ja PD0

Und, welchen Wert hat PD0?

0.

4 - PD0 ist also ... 4.


Der Grund für diese etwas arg kryptische Schreibweise ist der, daß es 
ohne Veränderung der Funktion auch möglich ist, die Datenleitung 4 des 
Displays an einen anderen Pin des µC anzuschließen.

Das Display wird im 4-Bit-Modus angesteuert, die vier genutzten 
Datenleitungen des Displays werden an vier aufeinanderfolgenden Portbits 
beginnend bei LCD_DB angelegt.

Im Beispiel werden die vier Datenleitungen mit PortD.0 bis PortD.3 
verbunden, es sollen aber die oberen vier Bit des an die Funktion 
lcd_out übergebenen Wertes ausgegeben werden.
Also muss um vier Bits nach rechts geschoben werden, damit diese Bits an 
den richtigen Positionen von PortD erscheinen.


Würde nun das Display aber nicht an PortD.0 bis PortD.3 angeschlossen, 
sondern z.B. an PortD.2 bis PortD.5, müsste nicht um vier Bits nach 
rechts geschoben werden, sondern nur um zwei Bits.

Und genau diese Unterscheidung ergibt sich mit der Differenz "4 - 
LCD_DB", denn das wäre dann ja als PD2 mit dem Wert 2 definiert.

Wird's klarer?

von Fuzzy (Gast)


Lesenswert?

Hallo Rufus,

Vielen Dank für die ausführliche und verständliche Erklärung :-) .

Gruß
Fuzzy

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.