Was mir noch auffällt, bzw als Verbesserungsvorschlag. Mach dir Makros wie

#define sda_to_high() (PXYZ |= (1<<PXY))
#define sda_to_low() (PXYZ &= ~(1<<PXY))

dann erscheint der code leserlicher und du bist sicher, dass du immer bei SDA/SCL whatever das gleiche register beschreibst


Gruß
Georg