Gast
#365173
Hallo, ich habe eine Variable uint8_t wert, und muss jetzt für jede Stelle wissen, ob dort eine 1 oder eine 0 steht, um dies nachher einem Pin zuzuweisen. Wie erreiche ich das? Gruß Manipulator
|
Anzeige
|
Bestimmter Stelle aus Variable erhalten
Gast
#365173
Hallo, ich habe eine Variable uint8_t wert, und muss jetzt für jede Stelle wissen, ob dort eine 1 oder eine 0 steht, um dies nachher einem Pin zuzuweisen. Wie erreiche ich das? Gruß Manipulator C?
if(nValue & (1<<7))
{
print("Bit 7 ist 1");
}
else
{
}
Du kannst die Variable auch als bitarray definieren.
Grüße, Freakazoid
Hier was zum Lesen zu Bitfeldern: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Bitfelder Wenn Du vorhast sowas wie für x in Bit 0..7 Wenn Bit x == 1 setze PinB.x sonst lösche PinB.x end machen willst - das kann man vereinfachen (zwinker) Grüße, Freakazoid
Gast
#365176
Hallo,
hab das so versucht:
void write_data(uint8_t wert)
{
if(wert & 1)
{
LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN);
}
else
{
LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN);
}
if(wert & 2)
{
LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN);
}
else
{
LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN);
}
if(wert & 4)
{
LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN);
}
else
{
LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN);
}
if(wert & 8)
{
LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN);
}
else
{
LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN);
}
}
aber funktioniert nicht, z.B. mit dem Wert 1010.
Gast
#365177
Muss natürlich jedesmal (wert & (1<<Stelle)) heissen, geht damit aber auch nicht.
Gast
#365178
So gehts, wobei ich nicht verstehe, warum ich bei den ifs löschen muss,
um das richtige Resultat zu bekommen....
void write_data(uint8_t wert)
{
if(wert & (1<<0))
{
LCD_DATA0_PORT &= ~(1 << LCD_DATA0_PIN);
}
else
{
LCD_DATA0_PORT |= (1 << LCD_DATA0_PIN);
}
if(wert & (1<<1))
{
LCD_DATA1_PORT &= ~(1 << LCD_DATA1_PIN);
}
else
{
LCD_DATA1_PORT |= (1 << LCD_DATA1_PIN);
}
if(wert & (1<<2))
{
LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN);
}
else
{
LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN);
}
if(wert & (1<<3))
{
LCD_DATA3_PORT &= ~(1 << LCD_DATA3_PIN);
}
else
{
LCD_DATA3_PORT |= (1 << LCD_DATA3_PIN);
}
Gast
#365179
Das hat nichts mit Löschen zu tun. Such bei Google mal nach Bitoperationen (&) und Shift-Operator (<<).. Sollte helfen ;) @Nico:
Und? Was würde er dann lernen?
if(wert & (1<<2))
{
LCD_DATA2_PORT &= ~(1 << LCD_DATA2_PIN); *
}
else
{
LCD_DATA2_PORT |= (1 << LCD_DATA2_PIN);
}
Seine Frage war, warum bei * das Bit ausgeblendet werden muß, wo
if(...) auf '1' im Bit prüft (bzw. auf != 0).
Kann ich mir nur durch eine umgekehrte Ausgangslogik erklären, oder ich
hab was übersehen (dann sollte ich das Vorglühen bei Maiwanderungen
weglassen).
Grüße, Freakazoid
Antwort schreiben |
Anzeige
|