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:
Beim Schreiben und Lesen auf nachfolgende Register muss nur 1x die Startadresse angegeben werden. Danach inkrementiert der Baustein die Registeradresse automatisch.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); }
gruß
Bernhard







Zitieren

Lesezeichen