Gran solución por jippie. Me gustaría explicar un poco en ella.
El esquema:
La idea es hacer uno de los I/Os de salida y los otros dos de entrada que permite leer el estado de los dos botones. Tres veces la salida de \$\times\$ dos entradas es bueno para los 6 botones como el esquema muestra.
¿Cómo puedo activar la salida? Hacen de alto? Vamos a hacerlo para pin 1, entonces diodos B y F son en diagonal hacia adelante, por lo que esperamos ser capaces de leer los botones. Para muchos microcontroladores esto no va a funcionar. Pulsar el botón B hará que la entrada 2 de alta, pero ¿y si el botón no está presionado? La entrada sería flotantes y, a continuación, usted no puede leer nada significativo. Una resistencia pull-down podría ayudar, pero muchos de los microcontroladores sólo tienen resistencias pull-up, y entonces nunca vas a leer un nivel bajo. Yo no sé acerca de todos ellos, pero, al menos, un número de AVR y microcontroladores PIC sólo pull-ups.
En ese caso, la forma correcta es activar la interna de pull-ups y activar la salida por lo que es baja. No estamos controlando los botones B y F, pero Una y E. Si el botón no está pulsado el pull-up va a hacer la entrada 2 de alto. Presione Un botón y tire de la entrada baja.
El algoritmo:
IO2 = input, pull-up enabled
IO3 = input, pull-up enabled
IO1 = output, low
Button_A = IO2 (low = pressed)
Button_E = IO3 (low = pressed)
IO1 = input, pull-up enabled
IO2 = output, low
Button_B = IO1 (low = pressed)
Button_C = IO3 (low = pressed)
IO2 = input, pull-up enabled
IO3 = output, low
Button_F = IO1 (low = pressed)
Button_D = IO3 (low = pressed)
Que yo sepa todos los NXP Cortex-M de los controladores, por ejemplo, tienen ambos configurables pull-up/pull-down resistencias. Para los que se puede utilizar en lógica positiva (alta = presionado) si se utiliza el pull-downs, y un activo de alto rendimiento. Tenga en cuenta que usted va a leer botones diferentes para la misma salida:
IO2 = input, pull-down enabled
IO3 = input, pull-down enabled
IO1 = output, high
Button_B = IO2 (high = pressed)
Button_F = IO3 (high = pressed)
IO1 = input, pull-down enabled
IO2 = output, high
Button_A = IO1 (low = pressed)
Button_D = IO3 (low = pressed)
IO2 = input, pull-down enabled
IO3 = output, high
Button_E = IO1 (low = pressed)
Button_C = IO3 (low = pressed)