Forum: Mikrocontroller und Digitale Elektronik LCD Ausgabeport definieren


von f1d1 (Gast)


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

von f1d1 (Gast)


Lesenswert?

Habe die Antwort auf meine Frage gerade in einem anderen thread recht 
weit unten gefunden. Thread handelt eigentlich von einem anderen Thema 
aber Problem wird dort auch behandelt.

Darf man einträge im WIKI einfach ändern? Wäre gut, wenn das noch 
hineingeschrieben würde, wie es funktioniert.

Thread ist
Beitrag "LCD nicht nur für einen Port in C"

von Gerhard O. (gerhard_)


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

von f1d1 (Gast)


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

von Gerhard O. (gerhard_)


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

von f1d1 (Gast)


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

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.