Forum: Mikrocontroller und Digitale Elektronik HD44780 LCD Display Verstehe Funktion nicht


von Al3ko -. (al3ko)


Lesenswert?

Hi Leute,

ich habe das LCD Display ausm Tutorial zum Laufen gebracht. Jetzt möchte 
ich den Code verstehen und hangel mich durch den Dschungel von Code 
durch. Gar keine einfache Aufgabe für einen Anfänger :D

Ich hänge an der Funktion lcd_out, die wie folgt definiert ist:
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
}

Okay, die Funktion lcd_out erhält einen Wert und speichert ihn in die 
Variable data. Dieser Wert ist
1
0x30 = 0b00110000
Dann wird data UND verknüpft mit
1
0x30 = 0b11110000

Das ergibt meiner Ansicht nach
1
0b00110000

Ich verstehe überhaupt nicht die Intention, die dahinter steckt. Wieso 
sind das die oberen 4 Bit, die maskiert werden? Irgendwie sehe ich da 
nur 2 Bit :/

Und vom restlichen Code in der lcd_out Funktion will ich gar nicht erst 
sprechen... :(

Tut mir Leid für die doofe Frage, aber mag mir jemand beim Verstehen 
dieser Funktion auf die Sprünge helfen?

Der Link zum Tutorial und zum Code:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung


Ich bedanke mich.

Gruß

EDIT:
Soweit ich den restlichen Code überfliegen konnte, habe ich damit keine 
Verständnisschwierigkeiten. Es begrenzt sich vorerst also wirklich auf 
diese lcd_out Funktion.

von Krapao (Gast)


Lesenswert?

> Ich verstehe überhaupt nicht die Intention, die dahinter steckt. Wieso
> sind das die oberen 4 Bit, die maskiert werden? Irgendwie sehe ich da
> nur 2 Bit :/

Die oberen 4 Bits behalten den Wert, den sie vor dem UND hatten, aber 
die untere vier Bits werden immer zu 0. Man kann quasi sagen: Die MASKE 
schützt die oberen vier Bitwerte vor Veränderungen durch das UND.

Bitmanipulation

von Joachim .. (joachim_01)


Lesenswert?

0x30 = 0b11110000
falsch kopiert?


Grundsätzlich wird mit einer UND-Maske erzwungen, daß gewisse Bits auf 0 
gehen müssen, während sich andere verändern können.

von al3ko (Gast)


Lesenswert?

Hi Joachim,

Joachim ... schrieb:
> 0x30 = 0b11110000falsch kopiert?Grundsätzlich wird mit einer UND-Maske 
erzwungen, daß gewisse Bits auf 0gehen müssen, während sich andere verändern 
können.

das ist ein Tippfehler. Aufm Papier sieht es richtig aus. Ich werde zur 
Mittagspause das ganze noch mal sauber und richtig hinschreiben.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Klaus Dietmar schrieb:

> Ich verstehe überhaupt nicht die Intention, die dahinter steckt. Wieso
> sind das die oberen 4 Bit, die maskiert werden? Irgendwie sehe ich da
> nur 2 Bit :/

Weil in deinem Datenbyte nur 2 Bit gesetzt waren.
Das ist aber nicht der springende Punkt.

Der springende Punkt ist, das die Maske die 4 oberen Bits unangetastet 
lässt, während die 4 unteren Bits gezielt auf 0 gesetzt werden.

Die Maske fungiert also wie ein Brett mit 8 Löchern (durch welches die 
einzelnen Bits durchmüssen), und in dem Brett werden bewusst die unteren 
4 Bits verstopft, so dass dort auf jeden Fall auf der anderen Seite des 
Brettes lauter 0 Bits ankommen. Was auf den oberen 4 Bits ankommt hängt 
davon ab, welche Daten du durch das Brett jagst, die Maske lässt die 
ungehindert durch.

Bei dir sind das eben 2 Stück 1 Bits. Wenn alle 4 oberen Bits auf 1 
gewesen wären, dann wären eben alle 4 durchgekommen.

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.