Gran solución por jippie . Me gustaría elaborar un poco sobre ello.
El esquema:
La idea es hacer que una de las salidas de E / S y las otras dos entradas le permitan leer el estado de dos botones. Tres veces la salida \ $ \ veces \ $ dos entradas es válida para 6 botones, como se muestra en el esquema.
¿Cómo activo la salida? ¿Hacerlo alto? Hagámoslo para el pin 1, luego los diodos B y F están polarizados hacia delante, por lo que esperamos poder leer esos botones. Para muchos microcontroladores esto no funcionará. Presionar el botón B hará que la entrada 2 sea alta, pero ¿qué sucede si no se presiona el botón? La entrada sería flotante, y entonces no puedes leer nada significativo en ella. Una resistencia desplegable ayudaría, pero muchos microcontroladores solo tienen resistencias elevadoras y nunca leerá un nivel bajo. No conozco a todos, pero al menos un número de microcontroladores AVR y PIC solo tienen dominadas.
En ese caso, la forma correcta es activar los pull-ups internos y activar la salida haciéndolo bajo . No controlamos los botones B y F, sino A y E. Si no se presiona el botón A, el pull-up hará que la entrada 2 sea alta. Presiona el botón A y obtienes 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)
Por lo que sé, todos los controladores NXP Cortex-M, por ejemplo, tienen ambas resistencias configurables de pull-up / pull-down. Para aquellos puede usar la lógica positiva (alta = presionada) si usa los menús desplegables y una salida alta activa. Tenga en cuenta que leerá diferentes botones 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)