OK, dann nochmal von vorn.
Die Funktion bit_is_set ist nämlich gar keine, sondern lediglich ein
Macro, welches in iomacros.h folgendermassen deklariert ist:
#define bit_is_set(port, bit) (__inb(port) & (1<<(bit)))
Wenn man dies nun ohne Makro programmieren möchte schriebe man folgenden
Befehl:
bBit = __inb(PINB & (1 << PINB3)); // Die korrekte Bez. für Pin 0, aber
egal
So, jetzt macht das Programm folgendes:
Zuerst wird der Wert des Port B gelesen und auf den Stack geschoben,
sagen wir mal Pin 0, 3 und 6 wären gesetzt, dann gibt dies folgenden
Wert:
Port B = 01001001
Jetzt wird der Wert 1 um die Anzahl des gewünschten Pins nach links
geschoben, das Resultat ist z. B. für Pin 3 = 00001000.
Und jetzt kommt das logische AND (Boolsche Algebra)
01001001
00001000
--------
00001000
Das Resultat ist, wie du unschwer feststellen kannst, Binär 00001000,
was Dezimal dem Wert 8 entspricht.
Dies bedeutet aber auch, dass die anderen Pins nicht etwa 0 oder 1
zurückliefern, sondern die entsprechende Wertigkeit des abgefragten
Pins.
Wenn du jetzt aber das Resultat noch mal verknüpfst, so dass ein
logischer Ausdruck entsteht, dann wird der Compiler als Resultat des
logischen Ausdrucks 0 (FALSE) oder 1 (TRUE) zurückliefern.
Beispiel:
Du möchtest wissen, ob Pin 1 oder Pin 5 gesetzt ist. Dann wirst du
schreiben:
bBitSet = bit_is_set (PINB, PINB1) || bit_is_set (PINB, PINB5)
Das Resultat dieser Berechnung ist nun entweder 0 oder 1.
Übrigens, die 1 ist Compilerabhängig. Viele C-Compiler defineren als
Rückgabewert TRUE den Wert -1 (Binär 11111111).
Der Wert 0 als FALSE ist hingegegen obligatorisch für jeden Compiler.
Gruss
Christian