LCD Ausgabeport definieren

Gast #1098840
Lesenswert?

Hi,
habe das myavr Testboard gerade vor mir liegen und möchte das LCD Addon 
in Betrieb nehmen. Leider habe ich die Dokumentation verschlampt. :(

Nun also zu meinem eigentlichen Problem.

Ich möchte auf meinem LCD das Testprogramm hier aus dem Tutorial zum 
laufen bekommen. Das klappt bis hierhin auch eigentlich recht gut.

Nun muss ich aber die Eingangspins des LCDs, auf PortD pin 4,5,6,7 
legen.
Also D4 -> PortD4 , D5 -> PortD5 usw

In dem Quelltext der Headerdatei für das LCD steht folgender 
Codeabschnitt:
1
// Pinbelegung für das LCD, an verwendete Pins anpassen
2
 
3
#define LCD_PORT      PORTD
4
#define LCD_DDR       DDRD
5
#define LCD_RS        PD2
6
#define LCD_EN        PD3
7
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden

RS und EN habe ich mir schon angepasst auf meine Bedürfnisse.

Mein Problem besteht darin, den LCD_PORT nicht von Anfang PortD zu 
benutzen sondern von 4 an zugewiesen auf die Eingänge des LCDs.

Hoffe habe es ausführlich genug beschrieben.

Schonmal Danke im vorraus :)

Fidi
#1098851
Lesenswert?

Wenn es hilft,

hier ist ein Auszug der Portzuweising unter CODEVISION AVR von einem 
Programm von mir:

// Display pin assignments
#define LCD_E               PORTC.4     // PC4
#define LCD_RS              PORTC.5     // PC5
#define LCD_WR              PORTC.6     // PC6
#define LCD_PORT            PORTC       // PC0-PC3

z. B. um das LCD_E zu anzusteuern:

LCD_E = 1; // setzt den E-pin
LCD_E = 0; // setzt den E-PIN zurrueck.

Hier ist ein Beispiel um ein Datenbyte an das LCD im 4-bit modus 
auszugeben:

void wr_disp(unsigned char data)
{
    unsigned char port_state;
    unsigned char indata;

    indata = data;                  // Make a copy for part 2

    port_state = LCD_PORT & 0xF0;   // Save Bits 7-4
    data = data >> 4;               // Shift data to lower nibble
    data = data & 0x0F;
    LCD_PORT = data | port_state;   // Combine data and saved nibble
    LCD_E = 1;                      // raise E
    #asm("nop");                    // notwendig bei AVR wegen clock
    LCD_E = 0;                      // drop E
    indata = indata & 0x0F;         // clear lower nibble
    LCD_PORT = indata | port_state; // Combine data and saved nibble
    LCD_E = 1;                      // raise E
    #asm("nop");                    // notwendig bei AVR wegen clock
    LCD_E = 0;                      // drop E

    delay_us(40);        // allow display time to accept the new data
}

Bei anderen Compilern musst Du das warscheinlich etwas aendern.

mfg,
Gerhard
Gast #1098854
Lesenswert?

Dank dir für deine Hilfe,
aber in deinem Programm steckt auch genau das, was ich umgehen möchte :)

Und zwar oben bei der definierung des Ports.

#define LCD_PORT            PORTC       // PC0-PC3

Dort wird als Datenports PortC 0-3 verwendet. Also von unten aufgefüllt.

In meinem Programm wollte ich aber an PortD bei D4 beginnen. Also PortD4 
- PortD7.

Fidi
#1098856
Lesenswert?

Hallo Fidi,

Das macht gar nichts. Du brauchst nur das Datenbyte mit dem Shift 
Operator um 4-bits nach rechts (-> MSB) zu shiften:

#define LCD_PORT            PORTD       // PD0-PD3


// Shift the lower half of data right by 4 bits
LCD_PORT = (indata << 4) | port_state; // Fuer LSB Nibble
.
.
.
// mask off lower nibble
LCD_PORT = (indata & 0xF0) | port_state; // Fuer MSB Nibble

Jetzt wird das 4-bit Datenwort zwischen PD4-PD7 ausgegeben.

Was haeltst Du davon?

Gruss,
Gerhard
Gast #1098857
Lesenswert?

Ja,
das klingt ja super. Habe es jetzt anders gelöst, so wie in dem besagten 
Thread.
Allerdings klingt deine Lösung doch eleganter und weniger 
schreibaufwendig.

Werde das morgen mal ausprobieren.

Vielen Dank

Fidi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren