Wann genau nutze ich ein or und wann ein and?

Gast #3156789
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
Gast #3156792
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
Gast #3156836
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

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