Verständnisfrage zu LCD Ansteuerung in C

Gast #5202972
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
Persönliche Seite #5203015
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.