Hallo Wolf,
ich habe am PCA9555 ein LCD im 8-Bit Modus und ein Tastenkreuz mit 5 Tastern hängen. Bei mir schaut der relevante Teil so aus:
Code:
// PCA9555D: Adresse 0100 000x
// Schreib-Adresse 0x40, Lese-Adresse 0x41
#define PCA9555_wr 0x40
#define PCA9555_rd 0x41
// Konfiguration: Port 1 Bits 3-7 auf Input 0-2 Output
// Port 0 auf Output
// Port 0 Register (Command 0x06) auf 0x00
// Port 1 Register (Command 0x07) auf 0xF8
void init_pca9555(void)
{
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Adresse PCA9555
i2c_schreiben (0x06); // Control-Byte 6
i2c_schreiben (0x00); // Direction für Port 0
i2c_schreiben (0xF8 ); // Direction für Port 1
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
}
// pca9555_read_port1(void)
// Liest 8 Datenbit von Port 1
// P1.3-1.7 => Tastenkreuz
unsigned char pca9555_read_port1(void)
{
unsigned char wert;
i2c_init (); // I2C-Bus initialisieren (Grundzustand)
i2c_start (); // Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_wr); // Baustein Adresse Schreiben
i2c_schreiben (0x01); // Controll-Byte lese Port 1
i2c_start (); // repeated Startbedingung I2C-Bus ausgeben
i2c_schreiben (PCA9555_rd); // Baustein Adresse lesen
wert = i2c_lesen (0);
i2c_stop (); // Stoppbedingung I2C-Bus ausgeben
return (wert);
}
Beim Schreiben und Lesen auf nachfolgende Register muss nur 1x die Startadresse angegeben werden. Danach inkrementiert der Baustein die Registeradresse automatisch.
gruß
Bernhard
Lesezeichen