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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.