Forum: Mikrocontroller und Digitale Elektronik Wann genau nutze ich ein or und wann ein and?


von Maddin (Gast)


Lesenswert?

Hallo Gemeinde,

ich werde aktuell nicht schlau beim thema Bitmanipulation. Hier ein 
Auszug aus eurem LCD Tut.
//////////////////////////////////////////////////////////////////////// 
////////
// Sendet ein Datenbyte an das LCD
void lcd_data( uint8_t data )
{
    LCD_PORT |= (1<<LCD_RS);    // RS auf 1 setzen


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

}

Warum wird einmal das |= und das &= genutzt?

Vielen Dank schon mal.

Grüße,

Maddin

von 6A66 (Gast)


Lesenswert?

Maddin schrieb:
> Hallo Gemeinde,
>
> ich werde aktuell nicht schlau beim thema Bitmanipulation. Hier ein
> Auszug aus eurem LCD Tut.
> ////////////////////////////////////////////////////////////////////////
> ////////
> // Sendet ein Datenbyte an das LCD
> void lcd_data( uint8_t data )
> {
>     LCD_PORT |= (1<<LCD_RS);    // RS auf 1 setzen
>
>
> ////////////////////////////////////////////////////////////////////////
> ////////
> // Sendet einen Befehl an das LCD
> void lcd_command( uint8_t data )
> {
>     LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen
>
> }
>
> Warum wird einmal das |= und das &= genutzt?
>
> Vielen Dank schon mal.
>
> Grüße,
>
> Maddin

Hallo Maddin,

schau Dir mal die OR/AND Funktion in Wikipedia an, hilft auch weiter.
OR: Bit setzen mit 1
AND: Bit rücksetzten mit 0

rgds

von Cyblord -. (cyblord)


Lesenswert?

Ja rechne mal von Hand nach was passiert dann wird es eigentlich sofort 
klar. Dann hast du es auch ein für alle mal verstanden.

von Bronco (Gast)


Lesenswert?


von Wusel D. (stefanfrings_de)


Lesenswert?


von Maddin (Gast)


Lesenswert?

Super, danke. Ich stand scheinbar auf dem Schlauch...

von optimax (Gast)


Lesenswert?

Hi,

also das |= ist eine Kurzschreibweise für:

LCD_PORT = LCD_PORT | (1<<LCD_RS)

was wird hier gemacht?

(1<<LCD_RS)
Als erstes wird die 1(dezimal) 0b00000001 um die Anzahl von LCD_RS nach 
links geshifted. Hier: Typischerweise das Treiberregister des PINs mit 
dem LCD_RS verbunden ist.

Bsp.: LCD_RS = 8 am 4ten PIN des LCD_Ports -> 0b00001000

Jetzt ist aber das Register (zum Bsp. nach einem Neustart unbeschrieben, 
bdeutet alles mit Nullen gefüllt) mit 0b00000000 gefüllt.

Jetzt wird die ODER-Verknüpfung ausgeführt

  0b00001000
| 0b00000000 LCD_PORT
============
  0b00001000 -> Dieser Wert wird nun in das Register LCD_PORT 
geschrieben.

So nun wollen wir einen weiteren Steuer-PIN, der links daneben 
angeschlossen ist, umschalten.

LCD_PORT:   0b00001000
2ter PIN: | 0b00010000
======================
            0b00011000 -> nun sind beide PINs angeschaltet

jetzt will man aber auch einen einzelnen PIN ausschalten ohne die 
anderen Bits/Pins im Register zu ändern, dafür ist eine UND-Verknüpfung 
und Invertierung zweckmäßig

LCD_PORT &= ~(1<<LCD_RS)

führt zu

LCD_PORT = LCD_PORT & ~(1<<LCD_RS)

Also schalten wir jetzt den ersten Treiber wieder ab

(1<<LCD_RS) 0b00001000 shiften an die entsprechende Postion
~           0b11110111 invertiern

LCD_PORT    0b00011000
&           0b11110111 UND-Verknüpfung ausführen
======================
            0b00010000  so, nun ist die eine 1 verschwunden

VG

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.