Bitte, bitte, bitte. Besorg dir ein Einführungsbuch in C.
Du wirst es brauchen.
~ macht eine bitweise Negierung.
| ist das Symbol für bitweises ODER
& bedeutet bitweises UND
Die Schreibweise a |= b ist die Kurzform für a = a | b;
Und 0x leitet eine Hexadealzahl ein.
> uchar code ROW[] = { ~0x01, ~0x02, ~0x04 }; // low active
0x01 ist also die Hexadezimalzahl 1, bitweise also 00000001
~ negiert das ganze, also 11111110
selbiges für all die anderen Konstanten.
> P0 |= ~0x07;
bedeutet also P0 = P0 | ~0x07;
Da wird also P0 hergenommen und mit etwas verodert. Womit?
Mit ~0x07 0x07 ist wieder die hex Schreibweise für 00000111
Die Tilde ~ macht daraus 11111000. Und wenn man das mit einem
anderen Wert verodert, dann werden genau die Bits auf jeden Fall
gesetzt, die in 11111000 auch 1 sind. Denn gemäß der ODER
Tabelle:
OR A B Ergebnis
--------------------
0 0 0
1 0 1
0 1 1
1 1 1
Ist das Ergebnis genau dann eine 1, wenn entweder A oder B oder
beide 1 sind.
> P0 &= ROW[i];
Selbiges hier: P0 = P0 & ROW[i];
Mittels Und werden meistens Bits gelöscht. Da das Ergebnis einer
UND Verknüfung nur dann 1 ist, wenn beide beteiligten Bits eine
1 aufweisen. Mann benutzt daher gerne binäre Masken wie zb 00011000,
damit im Ergebnis auf jeden Fall an der Bitposition eine 0 auftaucht,
wo auch in der Maske eine 0 ist.