Oplossing drukknoppen gevorderd op I2C

Bij dit programma sluiten we 4 drukknoppen aan op P4..P7 van de PCF8574, en 4 leds op de P0..P3 van de I/O expander.

In het programma zetten we initieel alle uitgangen van PCF8574 hoog. Daardoor gaan de 4 leds, die in common anode configuratie aangesloten zijn uit.

Daarna lezen we de 8 lijnen van de PCF8574. We schuiven de 8 bits van het resultaat 4 posities op naar rechts, en sturen dit resultaat terug naar de PCF8574.

Het programma ziet er als volgt uit:

#include <Wire.h>

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(115200);  // start serial for output
}

void loop() {
  Wire.beginTransmission(0x38);
  Wire.write(0xFF);
  Wire.endTransmission();
 
  Wire.requestFrom(0x38, 1);    // vraag 1 byte aan de PCF8574
  while (Wire.available()) { // wacht tot byte beschikbaar is
    byte c = Wire.read();    // lees de waarde
    Wire.beginTransmission(0x38);
    Wire.write(c>>4);
    Wire.endTransmission();
  }
  delay(50);
}

Merk op dat wanneer een knop ingedrukt is, de bijhorende led gaat branden zolang de knop ingedrukt blijft, maar dat bij elke doorgang van de loop()-functie gedurende een fractie van een milliseconde de lijnen terug op 1 zullen gezet worden en alle leds dus zullen doven. Dit gaat echter zodanig snel dat we dit niet merken, en het lijkt alsof de led continu brandt.