Excellente solution de jippie . J'aimerais élaborer un peu là-dessus.
Le schéma:
L'idée est de faire l'une des sorties d'E / S et les deux autres entrées qui permettent de lire le état de deux boutons. Trois fois la sortie \ $ \ fois \ $ deux entrées est bonne pour 6 boutons comme le montre le schéma.
Comment activer la sortie? Faites-le haut? Faisons-le pour la broche 1, puis les diodes B et F sont polarisées en avant, nous nous attendons donc à pouvoir lire ces boutons. Pour de nombreux microcontrôleurs, cela ne fonctionnera pas. Appuyer sur le bouton B rendra l'entrée 2 haute, mais que faire si le bouton n'est pas enfoncé? L'entrée serait flottante et vous ne pourrez rien y lire de significatif. Une résistance pull-down aiderait, mais de nombreux microcontrôleurs n'ont que des résistances pull-up, et vous ne lirez jamais un niveau bas. Je ne sais pas pour tous, mais au moins un certain nombre de microcontrôleurs AVR et PIC n'ont que des pull-ups.
Dans ce cas, la bonne façon est d'activer les pull-ups internes et d'activer la sortie en la rendant basse . Nous ne contrôlons pas les boutons B et F, mais A et E. Si le bouton A n'est pas enfoncé, le pull-up rendra l'entrée 2 haute. Appuyez sur le bouton A et vous tirez l'entrée vers le bas.
L'algorithme:
IO2 = entrée, pull-up activéIO3 = entrée, pull-up activéIO1 = sortie, lowButton_A = IO2 (bas = enfoncé) Button_E = IO3 (bas = enfoncé) IO1 = entrée, pull-up activé IO2 = sortie, basButton_B = IO1 (bas = enfoncé) Button_C = IO3 (bas = enfoncé) IO2 = entrée, pull-up activéIO3 = sortie, lowButton_F = IO1 (low = pressé) Button_D = IO3 (low = pressé)
Pour autant que je sache, tous les contrôleurs NXP Cortex-M, par exemple, ont les deux pull-up configurables / résistances pull-down. Pour ceux-ci, vous pouvez utiliser une logique positive (high = pressé) si vous utilisez les pull-downs et une sortie haute active. Notez que vous lirez différents boutons pour la même sortie:
IO2 = input, pull-down enabledIO3 = input, pull-down enabledIO1 = output, high
Button_B = IO2 (haut = enfoncé) Button_F = IO3 (haut = enfoncé) IO1 = entrée, pull-down activéIO2 = sortie, hautButton_A = IO1 (bas = enfoncé) Button_D = IO3 (bas = enfoncé) IO2 = entrée, pull-down enabledIO3 = sortie, highButton_E = IO1 (low = pressé) Button_C = IO3 (low = pressé)