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
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
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.
Ich habe das mal Bildlich dargestellt: http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%201.pdf Ab Seite 131
Super, danke. Ich stand scheinbar auf dem Schlauch...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.