Hallo nochmal und Danke an Oliver für die Verbesserung, es war wohl
wirklich etwas spät ;)
unsigned char Mask = 0x01, Value = 0xCC;
do
{
P2_B2 = (unsigned char)Value & Mask?1:0;
} while (Mask <<= 1);
Also hier die vermisste Erklärung:
Value wird dem LSB voran ausgegeben, das gesetzte Bit in der Maske
verschiebt sich mit jedem Durchlauf um eine Stelle nach links
(0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000,
0b01000000, 0b10000000, [0b00000000]), das macht "Mask <<= 1". Nach dem
letzten Durchlauf, 0b10000000, wird das das Bit einfach raus geschoben
und somit ist Mask = 0 und die While-Schleife wird verlassen. Will man
das MSB als erstes ausgeben initialisiert man Value einach auf 0x80 und
shiftet nach rechts.
In der Schleife wird dein Wert (Value) mit der Maske UND-Verknüpft, ist
die jeweiligen Bitstelle gesetzt so wird P2_B2 auf 1 gesetzt,
andernfalls auf 0. Dazu hab ich den ?-Operator benutzt,
<Bedingung>?<True-Statement>:<False-Statement>, der Cast nach "unsigned
char" sorgt dafür dass es auch brav 8 Bit bleiben, man müsste evtl. mal
ausprobieren ob dies überhaupt nötig ist.