Comment sont cablés tes boutons ?
As tu lu la doc du PCF sur le fonctionnement des broche "quasi-bidirectionelles" ? c'est très spécial !
Voir section 7.3 de la datasheet ainsi que le schéma interne au début du chapitre 7
En gros : une broche I/O de PCF peut fonctionner soit en entrée, soit en sortie mais il n'y a pas de registre de direction comme sur les ports I/O de l'ATmega.
Pour utiliser une broche en entrée il faut préalablement écrire cette broche à 1 (état HAUT).
Alors la broche dispose d'un pull-up faible et peut être "drivée" par un signal externe.
Si elle n'est pas connectée ou reçoit un signal haut, elle sera lue à HIGH (1)
Si elle reçoit un signal bas, elle sera lue à LOW (0)
En sortie, tu peux écrire LOW ou HIGH sur la broche. Si tu écris LOW alors la pin sort un signal bas acceptant jusqu'à -25mA. Mais si tu écris un HIGH, alors la broche est dans l'état ci-dessus avec un pull-up faible ne pouvant fournir que 300µA.
En clair, il faut pratiquement considérer les broches d'un PCF comme des collecteurs ouverts.
En résumé, pour lire un bouton poussoir un seul montage fonctionne (une fois que tu as écris HIGH dans les broches correspondantes) : Pull-up vers VCC et bouton poussoir vers la masse.
Un bouton pressé se lit alors comme un LOW (0).
De même si tu souhaite allumer un LED sur une broche de PCF, il faut la relier au VCC (+résistance) et l'allumer par un LOW. Aucune chance de pouvoir l'allumer en la reliant vers le GND (+résistance) avec un HIGH.
Coté code, tu peux récupérer ou t'inspirer de ma lib ci-jointe ou de celle de Skywodd sur son blog.
pcf8574.zip (2.39 KB)