Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuerung im 8 Bitmodus


von K. B. (derkevin)


Lesenswert?

Einen schönen Sonntag-Nachmittag wünsche ich!

Wie man aus dem Titel des Threads bereits herauslesen kann, habe ich 
meinen Meister in der 8 Bit Ansteuerung eines LCD Moduls gefunden.
In allen bisherigen Tutorials über LCD Ansteuerungen wird immer nur die 
4 Bit Variante erklärt und es lassen sich auch nur die nötigen Dateien 
dafür finden. Zum Beispiel gibt es auch hier im Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung) 
nur die lcd-routines.h & lcd-routines.c für den 4 Bit Modus. Ich 
bräuchte jetzt jedoch diese beiden Dateien für den 8 Bit Modus.

Meine Bitte/Frage: Hat die jemand von euch, beziehungsweise weiß jemand 
wo ich die Beiden herbekomme?

Ich bin für jede Hilfe dankbar.
LG Kevin

von (prx) A. K. (prx)


Lesenswert?

Wie wärs mit einem Blick ins Datasheet vom HD44780? Da steht drin wie es 
geht.

von K. B. (derkevin)


Lesenswert?

Tut mir leid, aber auf dem Gebiet bin ich Neuling - da sagt mir das 
Alles im Datenblatt nicht sehr viel. Ich dachte, dass es eventuell (wie 
auch für den 4 Bit Modus) schon fertige Dateien gibt. Dann bräuchte man 
das Ganze nicht wieder neu verfassen.
Wüsstest du da nichts?
Wie gesagt, das mit dem Datenblatt ist für mich sehr, sehr schwer.

von Dietrich L. (dietrichl)


Lesenswert?

Frage aus Neugier: wieso solls denn der 8-Bit-Modus sein? Hast Du 4 
Portpins zu viel, die man einfach nicht ungenutzt herumliegen lassen 
darf? ;-)

Gruß Dietrich

von Werner (Gast)


Lesenswert?

Warum läßt du dein Modul nicht im 4-Bit Modus laufen? Die paar µs für 
die doppelten Zugriffe stellen eine zu vernachlässigende Prozessorlast 
dar.

von gaast (Gast)


Lesenswert?

Im Tutorial steht doch alles nötige? Die Ansteuerung bleibt exakt die 
selbe, bloß dass du jedes Byte in einem Rutsch überträgst statt auf die 
beiden Nibble aufgeteilt.

von Dr. G. Reed (Gast)


Lesenswert?

Die Ansteuerung im 8 Bit Modul erfolgt eigentlich genauso wie im 4 Bit 
Modus, nur der Programmteil, welcher das Byte in zwei Nibbles zum 
Display schickt muss geändert werden.

Und natürlich darf in der Initialisierung nicht der 4Bit Modus 
eingestellt werden.

Alle anderen Kommandos etc sind gleich.

von Jack der Erste (Gast)


Lesenswert?

Lass es lieber bei 4-bit Ansteuerung solange du nicht einen zwingenden 
Grund hast für 8-bit - und investier die gesparte Zeit in den Erwerb von 
Grundlagenwissen (z.B. das Lesen von Datenblättern).

von Otto (Gast)


Lesenswert?

8 bit Modus ist nur was für Leute, die in C programmieren können. Alle 
anderen, zu denen ich mich auch zähle, nehmen den bewährten 4 bit Modus.

von K. B. (derkevin)


Lesenswert?

Ich bin im Nachhinein auch zu der Erkenntnis gekommen, dass es der 4 Bit 
Modus hätte sein sollen - jedoch ist meine Platine bereits fix fertig 
hier bei mir zu Hause und noch einmal die 60 Euro zu zahlen, nur weil 4 
Datenleitungen umgelegt werden will mein Auftraggeber nicht.
Deswegen die Frage hier im Board.

Dr. G. Reed schrieb:
> Die Ansteuerung im 8 Bit Modul erfolgt eigentlich genauso wie im 4 Bit
> Modus, nur der Programmteil, welcher das Byte in zwei Nibbles zum
> Display schickt muss geändert werden.
>
> Und natürlich darf in der Initialisierung nicht der 4Bit Modus
> eingestellt werden.

Könntest du mir das in den beiden Files vom Tutorial genauer erklären?
Das wär mir wahrscheinlich eine große Hilfe, wenn ja nicht sehr viel zu 
ändern ist.

LG

von spess53 (Gast)


Lesenswert?

Hi

>jedoch ist meine Platine bereits fix fertig
>hier bei mir zu Hause und noch einmal die 60 Euro zu zahlen, nur weil 4
>Datenleitungen umgelegt werden will mein Auftraggeber nicht.
>Deswegen die Frage hier im Board.

Du brauchst doch an der Platine nichts ändern. Einfach nur D4...D7 
benutzen. Die Portpins von D0...D3 lässt du auf Eingang 
(Displaycontroller haben interne Pull-Up-Widerstände an den 
Datenleitungen).

MfG Spess

von Dr. G. Reed (Gast)


Lesenswert?

Versuch erstmal zu verstehen, wie das LCD angesteuert wird....

von K. B. (derkevin)


Lesenswert?

Dr. G. Reed schrieb:
> Versuch erstmal zu verstehen, wie das LCD angesteuert wird....

ja, ich weiß schon dass es auch im 4 Bit Modus angesteuert werden kann 
so wie ich die Platine jetzt hier habe. Nur ist es Teil einer Arbeit für 
die Schule und wenn 4 Leitungen sozusagen umsonst verbunden sind ohne 
jeden Zweck kommt das bei den Beurteilenden nicht sehr gut an. Deswegen 
möchte ich auch das LCD Display mit allen 8 Leitungen ansteuern.

von Otto (Gast)


Lesenswert?

Bitte, bitte helft Kevin. Er hats ja auch nicht leicht!

http://www.spiegel.de/schulspiegel/wissen/0,1518,649421,00.html

Zitat:

Auffällig schlecht bewerten die Lehrer die Namen Chantal, Justin, 
Dennis, Marvin und Jaquelin. Doch die Höchststrafe für Kinder lautet 
nach Ansicht der Grundschulpädagogen Kevin. Er führt die Rangliste der 
unbeliebten Namen an, gilt als verhaltensauffällig und leistungsschwach. 
Eine befragte Lehrerin kommentierte: "Kevin ist kein Name, sondern eine 
Diagnose."

Gruß
  Otto

von K. B. (derkevin)


Lesenswert?

Ein freier Sonntagnachmittag & du hast nichts besseres zu tun als Leute 
(die vielleicht nicht so versiert sind auf diesem Gebiet wie du) 
ärgern?!
Was für ein wundervolles, erfülltes Leben du doch haben musst :)

von Eumel (Gast)


Lesenswert?

Was verstehst du denn an der Ansteuerung im 8bit Modus nicht? Welche 
Informationen fehlen dazu im AVR Tutorial hier auf der Seite?

von Guttenberg (Gast)


Lesenswert?

Kevins Vorbild ist wohl der hier:

Karl Theodor Maria Nikolaus Johann Jacob Philipp Franz Joseph Sylvester 
Freiherr von und zu Guttenberg.

Warum soll man sich selbst in eine Materie einarbeiten, wenns auch mit 
Copy&Paste geht. Dieses Forum ist ja schließlich dazu da um faulen 
Schülern die Arbeit abzunehmen.

von Werner (Gast)


Lesenswert?

K. B. schrieb:
> Nur ist es Teil einer Arbeit für
> die Schule und wenn 4 Leitungen sozusagen umsonst verbunden sind ohne
> jeden Zweck kommt das bei den Beurteilenden nicht sehr gut an.

Dann hättest du das beim Schaltungsdesign schon berücksichtigen sollen. 
Wenn die Software 1:1 kopiert ist, ohne die paar Änderungen zum 
Downgrade auf den 8-Bit Modus selbst zu leisten, kommt das bestimmt auch 
nicht viel besser an.

von Eumel (Gast)


Lesenswert?

Ein LCD mit HD44780 ist nun wirklich kein Hexenwerk. Vorallem im 8bit 
Modus, der ist ja noch einfacher, weil die Nibble Tauscherei entfällt.

von K. B. (derkevin)


Lesenswert?

Eumel schrieb:
> Was verstehst du denn an der Ansteuerung im 8bit Modus nicht? Welche
> Informationen fehlen dazu im AVR Tutorial hier auf der Seite?

Ich bin mir nicht sicher was an den beiden Files geändert werden muss. 
Eine Idee hab ich ja, nur will ich nichts auf meinem Board zerstören 
oder in die Luft jagen.

Hier meine geänderte Version - wenn jemand Ahnung davon hat was 
abgeändert werden muss & mir eventuell sagen könnte ob meine 
Umstellungen korrekt sind oder nicht, wär ich sehr dankbar.

Die Header-Datei:

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
//

#ifndef LCD_ROUTINES_H
#define LCD_ROUTINES_H

//////////////////////////////////////////////////////////////////////// 
////////
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#ifndef F_CPU
#define F_CPU 8000000
#endif

//////////////////////////////////////////////////////////////////////// 
////////
// Pinbelegung für das LCD, an verwendete Pins anpassen
// Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
// Datenleitungen müssen auf aufeinanderfolgenden Pins liegen

#define LCD_PORT      PORTC
#define LCD_DDR       DDRC
#define LCD_DB        PC0

//  LCD RS      <-->  PORTC Bit PA0     (RS: 1=Data, 0=Command)
#define LCD_RS        PA0

//  LCD EN      <-->  PORTD Bit PA2     (EN: 1-Impuls für Daten)
#define LCD_EN        PA2

//////////////////////////////////////////////////////////////////////// 
////////
// LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)

#define LCD_BOOTUP_MS           15
#define LCD_ENABLE_US           20
#define LCD_WRITEDATA_US        46
#define LCD_COMMAND_US          42

#define LCD_SOFT_RESET_MS1      5
#define LCD_SOFT_RESET_MS2      1
#define LCD_SOFT_RESET_MS3      1
#define LCD_SET_4BITMODE_MS     5

#define LCD_CLEAR_DISPLAY_MS    2
#define LCD_CURSOR_HOME_MS      2

//////////////////////////////////////////////////////////////////////// 
////////
// Zeilendefinitionen des verwendeten LCD
// Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 
Zeichen passen
// Bei anderen Zeilenlängen müssen diese Einträge angepasst werden

#define LCD_DDADR_LINE1         0x00
#define LCD_DDADR_LINE2         0x40
#define LCD_DDADR_LINE3         0x10
#define LCD_DDADR_LINE4         0x50

//////////////////////////////////////////////////////////////////////// 
////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init( void );

//////////////////////////////////////////////////////////////////////// 
////////
// LCD löschen
void lcd_clear( void );

//////////////////////////////////////////////////////////////////////// 
////////
// Cursor in die 1. Zeile, 0-te Spalte
void lcd_home( void );

//////////////////////////////////////////////////////////////////////// 
////////
// Cursor an eine beliebige Position
void lcd_setcursor( uint8_t spalte, uint8_t zeile );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
void lcd_data( uint8_t data );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines Strings an der aktuellen Cursorposition
void lcd_string( const char *data );

//////////////////////////////////////////////////////////////////////// 
////////
// Definition eines benutzerdefinierten Sonderzeichens.
// data muss auf ein Array[5] mit den Spaltencodes des zu definierenden 
Zeichens
// zeigen
void lcd_generatechar( uint8_t code, const uint8_t *data );

//////////////////////////////////////////////////////////////////////// 
////////
// Ausgabe eines Kommandos an das LCD.
void lcd_command( uint8_t data );


//////////////////////////////////////////////////////////////////////// 
////////
// LCD Befehle und Argumente.
// Zur Verwendung in lcd_command

// Clear Display -------------- 0b00000001
#define LCD_CLEAR_DISPLAY       0x01

// Cursor Home ---------------- 0b0000001x
#define LCD_CURSOR_HOME         0x02

// Set Entry Mode ------------- 0b000001xx
#define LCD_SET_ENTRY           0x04

#define LCD_ENTRY_DECREASE      0x00
#define LCD_ENTRY_INCREASE      0x02
#define LCD_ENTRY_NOSHIFT       0x00
#define LCD_ENTRY_SHIFT         0x01

// Set Display ---------------- 0b00001xxx
#define LCD_SET_DISPLAY         0x08

#define LCD_DISPLAY_OFF         0x00
#define LCD_DISPLAY_ON          0x04
#define LCD_CURSOR_OFF          0x00
#define LCD_CURSOR_ON           0x02
#define LCD_BLINKING_OFF        0x00
#define LCD_BLINKING_ON         0x01

// Set Shift ------------------ 0b0001xxxx
#define LCD_SET_SHIFT           0x10

#define LCD_CURSOR_MOVE         0x00
#define LCD_DISPLAY_SHIFT       0x08
#define LCD_SHIFT_LEFT          0x00
#define LCD_SHIFT_RIGHT         0x04

// Set Function --------------- 0b001xxxxx
#define LCD_SET_FUNCTION        0x20

#define LCD_FUNCTION_4BIT       0x00
#define LCD_FUNCTION_8BIT       0x10
#define LCD_FUNCTION_1LINE      0x00
#define LCD_FUNCTION_2LINE      0x08
#define LCD_FUNCTION_5X7        0x00
#define LCD_FUNCTION_5X10       0x04

#define LCD_SOFT_RESET          0x30

// Set CG RAM Address --------- 0b01xxxxxx  (Character Generator RAM)
#define LCD_SET_CGADR           0x40

#define LCD_GC_CHAR0            0
#define LCD_GC_CHAR1            1
#define LCD_GC_CHAR2            2
#define LCD_GC_CHAR3            3
#define LCD_GC_CHAR4            4
#define LCD_GC_CHAR5            5
#define LCD_GC_CHAR6            6
#define LCD_GC_CHAR7            7

// Set DD RAM Address --------- 0b1xxxxxxx  (Display Data RAM)
#define LCD_SET_DDADR           0x80

#endif

Und hier noch die C-Datei:

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/HD44780
// 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar

#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>

//////////////////////////////////////////////////////////////////////// 
////////
// Erzeugt einen Enable-Puls
static void lcd_enable( void )
{
    LCD_PORT |= (1<<LCD_EN);     // Enable auf 1 setzen
    _delay_us( LCD_ENABLE_US );  // kurze Pause
    LCD_PORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen
}

//////////////////////////////////////////////////////////////////////// 
////////
// Sendet eine 4-bit Ausgabeoperation an das LCD
static void lcd_out( uint8_t data )
{
    data &= 0xF0;                       // obere 4 Bit maskieren

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

//////////////////////////////////////////////////////////////////////// 
////////
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
void lcd_init( void )
{
    // verwendete Pins auf Ausgang schalten
    uint8_t pins = (0xFF << LCD_DB) |           // 8 Datenleitungen
                   (1<<LCD_RS) |                // R/S Leitung
                   (1<<LCD_EN);                 // Enable Leitung
    LCD_DDR |= pins;

    // initial alle Ausgänge auf Null
    LCD_PORT &= ~pins;

    // warten auf die Bereitschaft des LCD
    _delay_ms( LCD_BOOTUP_MS );

    // Soft-Reset muss 3mal hintereinander gesendet werden zur 
Initialisierung
    lcd_out( LCD_SOFT_RESET );
    _delay_ms( LCD_SOFT_RESET_MS1 );

    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS2 );

    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS3 );

    // 4-bit Modus aktivieren
    lcd_out( LCD_SET_FUNCTION |
             LCD_FUNCTION_4BIT );
    _delay_ms( LCD_SET_4BITMODE_MS );

    // 4-bit Modus  2 Zeilen  5x7
    lcd_command( LCD_SET_FUNCTION |
                 LCD_FUNCTION_4BIT |
                 LCD_FUNCTION_2LINE |
                 LCD_FUNCTION_5X7 );

    // Display ein  Cursor aus  Blinken aus
    lcd_command( LCD_SET_DISPLAY |
                 LCD_DISPLAY_ON |
                 LCD_CURSOR_OFF |
                 LCD_BLINKING_OFF);

    // Cursor inkrement / kein Scrollen
    lcd_command( LCD_SET_ENTRY |
                 LCD_ENTRY_INCREASE |
                 LCD_ENTRY_NOSHIFT );

    lcd_clear();
}

//////////////////////////////////////////////////////////////////////// 
////////
// Sendet ein Datenbyte an das LCD
void lcd_data( uint8_t data )
{
    LCD_PORT |= (1<<LCD_RS);    // RS auf 1 setzen

    lcd_out( data );            // zuerst die oberen,

    _delay_us( LCD_WRITEDATA_US );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Sendet einen Befehl an das LCD
void lcd_command( uint8_t data )
{
    LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen

    lcd_out( data );             // zuerst die oberen,

    _delay_us( LCD_COMMAND_US );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Sendet den Befehl zur Löschung des Displays
void lcd_clear( void )
{
    lcd_command( LCD_CLEAR_DISPLAY );
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Sendet den Befehl: Cursor Home
void lcd_home( void )
{
    lcd_command( LCD_CURSOR_HOME );
    _delay_ms( LCD_CURSOR_HOME_MS );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Setzt den Cursor in Spalte x (0..15) Zeile y (1..4)

void lcd_setcursor( uint8_t x, uint8_t y )
{
    uint8_t data;

    switch (y)
    {
        case 1:    // 1. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE1 + x;
            break;

        case 2:    // 2. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE2 + x;
            break;

        case 3:    // 3. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE3 + x;
            break;

        case 4:    // 4. Zeile
            data = LCD_SET_DDADR + LCD_DDADR_LINE4 + x;
            break;

        default:
            return;                                   // für den Fall 
einer falschen Zeile
    }

    lcd_command( data );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Schreibt einen String auf das LCD

void lcd_string( const char *data )
{
    while( *data != '\0' )
        lcd_data( *data++ );
}

//////////////////////////////////////////////////////////////////////// 
////////
// Schreibt ein Zeichen in den Character Generator RAM

void lcd_generatechar( uint8_t code, const uint8_t *data )
{
    // Startposition des Zeichens einstellen
    lcd_command( LCD_SET_CGADR | (code<<3) );

    // Bitmuster übertragen
    for ( uint8_t i=0; i<8; i++ )
    {
        lcd_data( data[i] );
    }
}

von Dr. G. Reed (Gast)


Lesenswert?

mindestens die lcd_out Funktion passt wohl noch nicht...

von Eumel (Gast)


Lesenswert?

Was hälst du davon ein eigenes Programm zu schreiben? Du lernst ja sonst 
eh nichts.

von gaast (Gast)


Lesenswert?

K. B. schrieb:
> Ich bin mir nicht sicher was an den beiden Files geändert werden muss.

Und du meinst also, es kommt soviel besser als eine vermurkste Schaltung 
an, wenn du keinerlei Ahnung hast, was dein Programm macht? Was ist das 
denn für eine Schule, in der Copy and Paste ohne die geringste Ahnung 
hingenommen wird?

von K. B. (derkevin)


Lesenswert?

Eumel schrieb:
> Was hälst du davon ein eigenes Programm zu schreiben? Du lernst ja sonst
> eh nichts.

Dafür ist leider die Zeit nicht mehr vorhanden, deswegen suche ich eben 
nach funktionierenden Dateien. Ich muss sowieso noch eine Menge anderen 
Programmcode schreiben & mit diesen fertigen "Standarddateien" wäre mir 
sehr geholfen.

von Eumel (Gast)


Lesenswert?

30 Minuten hast du nicht?
In der Zeit die du hier verplempert hast hättest du das locker selbst 
schreiben könne.
Zu deinem Programm: Ich mach nur Zeugs in ASM.

von K. B. (derkevin)


Lesenswert?

In 30 Minuten diese beiden Dateien? Du darfst dich nicht mit mir 
vergleichen. Ich bin Anfänger in C, kein Veteran in Sachen 
Mikrocontroller.

von Jonathan S. (joni-st) Benutzerseite


Angehängte Dateien:

Lesenswert?

Zur ursprünglichen Frage: In diesem Datenblatt ist die Ansteuerung ganz 
gut beschrieben.


Gruß
Jonathan

von Eumel (Gast)


Lesenswert?

Ne, nicht in C. In ASM.
Erscheint mir, zumindest in dem Fall, auch einfacher zu sein. Der 
Lerneffekt ist auch größer. Man sieht ja wozu das führt...du suchst nur 
irgendwelche Bibliotheken.

von K. B. (derkevin)


Lesenswert?

Jonathan Strobl schrieb:
> Zur ursprünglichen Frage: In diesem Datenblatt ist die Ansteuerung ganz
> gut beschrieben.

Danke Jonathan.
Ich werde mich jetzt in der Sache des "selber-verfassens" versuchen.

von Karl H. (kbuchegg)


Lesenswert?

Das geile ist, dass der 8 Bit Modus ja im Grunde sehr viel simpler in 
der Ansteuerung ist. Schon alleine die Initialisierung ist viel simpler, 
weil es in den meisten Fällen daran hängt, das LCD mit einer geeigneten 
Startsequenz in den 4 Bit Mouds zu kriegen. Bei 8 Bit ist das alles gar 
nicht notwendig, man kann gleich mit der Konfiguration loslegen.

Und da du 8 Bit, also einen kompletten Port, für die Datenleitungen 
verplempert hast, wirst du dir die Ansteuerung der R/S und E Leitung 
ansehen müssen. Denn die können logischerweise nicht mehr am gleichen 
Port wie die 8 Datenleitungen liegen.

von gaast (Gast)


Lesenswert?

K. B. schrieb:
> Dafür ist leider die Zeit nicht mehr vorhanden, deswegen suche ich eben
> nach funktionierenden Dateien. Ich muss sowieso noch eine Menge anderen
> Programmcode schreiben & mit diesen fertigen "Standarddateien" wäre mir
> sehr geholfen.

Dann sollte es ja kein Problem darstellen, die entsprechenden Stellen zu 
korrigieren. In welcher Schule wird es denn nun toleriert, wenn man 
Programme kopiert, die man nicht mal versteht? Ich würde ja stark davon 
ausgehen, dass da mal wer unangenehm fragen könnte, warum du dieses und 
jenes auf diese und jene Art gelöst hast.

Und in einem Nachmittag sollte wirklich jeder, der halbwegs Ahnung davon 
hat, das Tutorial nachprogrammieren können. Es wird ja nun wirklich 
alles genau beschrieben, wenn auch etwas durcheinander und 
unstrukturiert. Ein paar Byte auf einen Port ausgeben sollte gerade noch 
so hinzubekommen sein, ohne dass man ein "C-Veteran" ist.

von Werner (Gast)


Lesenswert?

Und das Schieben der Datenbits ist natürlich auch überflüssig, weil der 
ganz Port für die Daten genutzt wird. Das Gleiche gilt für die 
Bytezerlegerei in lcd_out.

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.