Forum: Mikrocontroller und Digitale Elektronik LCD-Display ansteuern


von Natalie (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin verzweifelt. Ich versuche seit Tagen ein 2x16 Zeichen 
LCD-Display anzusteuern, aber irgendwie will es einfach nicht 
funktionieren. Ich glaube das Problem liegt schon in der 
initialisierung, da wenn ich die Kontrastspannung verändere nur die 
obere Zeile "erscheint". Kann mir bitte jemand helben? Danke!!

LG

von Klaus (Gast)


Lesenswert?

Seltsame Programmiersprache ist das C???

Aber hier scheint der hund begraben zu sein.

LCD_DATA = LCD_DATA & 0x0F; // Höherwertigeres Nibble löschen
SWAPF(befehl,1);  // Höherwertige- und Niederwertige Nibbles vertauschen
temp = befehl & 0xF0; // Niederwert. Nibble ausmaskieren
LCD_DATA = LCD_DATA | temp; // High-Nibble an LCD übergeben

Du wolltest sicherlich das höher wertige Nibble ausgeben.
Dann solltest dies nicht löschen.

vllt hilft dir das.

temp = befehl;

LCD_DATA = LCD_DATA & 0xF0;   //Höherwertigeres Nibble zuerst senden
LCD_DATA = LCD_DATA | befehl

LCD_DATA = LCD_DATA & 0x0F;  // dann Niederwertigeres Nibble senden
LCD_DATA = LCD_DATA | befehl

von Klaus (Gast)


Lesenswert?

Natalie

Propier das mal in deinem Code aus Mußt allerdings etwas anpassen.

// Ausgabe eines Kommandos
void LCD_Command ( uint8_t data )
{
    uint8_t d = data;

    LCD_Busy();

  LCD_DDR |= ((1 << LCD_D7 ) | (1 << LCD_D6 ) |(1 << LCD_D5 ) | (1 << 
LCD_D4 ) );   // D4 - D7 als Ausgang
    LCD_PORT &= ~((1 << LCD_D7 ) | (1 << LCD_D6 ) |(1 << LCD_D5 ) | (1 
<< LCD_D4 ) ); // D4 - D7 Zurücksetzen

  // Erst High-Byte senden
    data >>= 4;

    if (data & 0x01 )
    {
        LCD_PORT |= (1 << LCD_D4);
    }
    if (data & 0x02)
    {
        LCD_PORT |= (1 << LCD_D5);
    }
    if (data & 0x04)
    {
        LCD_PORT |= (1 << LCD_D6);
    }
    if (data & 0x08)
    {
        LCD_PORT |= (1 << LCD_D7);
    }

    LCD_PORT |= (1 << LCD_EN  );        // Daten stehen an
     _delay_us(50);
    LCD_PORT &= ~(1 << LCD_EN  );       //  Übernahme mit fallender 
Flanke


    LCD_Busy();

    LCD_DDR |= ((1 << LCD_D7 ) | (1 << LCD_D6 ) |(1 << LCD_D5 ) | (1 << 
LCD_D4 ) );   // D4 - D7 als Ausgang
    LCD_PORT &= ~((1 << LCD_D7 ) | (1 << LCD_D6 ) |(1 << LCD_D5 ) | (1 
<< LCD_D4 ) ); // D4 - D7 Zurücksetzen

    // Low-Byte senden
    data = d;
    data &= 0x0F;

    if (data & 0x01 )
    {
        LCD_PORT |= (1 << LCD_D4);
    }
    if (data & 0x02)
    {
        LCD_PORT |= (1 << LCD_D5);
    }
    if (data & 0x04)
    {
        LCD_PORT |= (1 << LCD_D6);
    }
    if (data & 0x08)
    {
        LCD_PORT |= (1 << LCD_D7);
    }

    LCD_PORT |= (1 << LCD_EN  );        // Daten stehen an
     _delay_us(50);
    LCD_PORT &= ~(1 << LCD_EN  );       //  Übernahme mit fallender 
Flanke


}

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.