Estoy escribiendo un software de microcontrolador para leer un teclado mecánico, que tiene diodos para evitar que las teclas interfieran entre sí.
El teclado tiene las teclas configuradas con salidas de fila y entradas de columna que se pueden escanear; Básicamente, el área encuadrada en este esquema, pero con muchas más claves:
Las filas R0
, R1
y las columnas C0
, C1
son pines GPIO en mi microcontrolador, AT90USB1286 (AVR de 8 bits).
Tengo un conocimiento limitado de la electrónica real y no sé cómo usar los diodos de manera efectiva. Creo que podría escanear las claves utilizando el siguiente proceso (ingenuo):
- Establezca
R0
en salida alta, todos los demás bajos - Lea todos los pines
Cn
para averiguar qué teclasR0
se presionan - Repita para
R1
,R2
, etc.
Para que funcione, entiendo que cada columna debería tener una resistencia desplegable para evitar señales flotantes cuando no se presionan las teclas de columna. Mi microcontrolador tiene pull-ups internos opcionales en cada pin GPIO pero no tiene pull-downs, por lo que necesitaría agregarlos yo mismo. No creo que pueda usar los pull-ups y cambiar la salida de la fila de exploración a baja porque los diodos evitarán que la señal baja llegue a la entrada de la columna.
Sin embargo, me pregunto si podría intercambiar los roles de fila y columna:
- Habilitar dominadas internas en todos los
Rn
- Establezca
C0
en salida baja, todas las demás son altas (o hi-z?) - Lea todos los pines
Rn
para averiguar qué teclasC0
se presionan - Repita desde 2 para
C1
,C2
, etc.
Esto significaría que mi esquema usaría R0
y R1
como entradas con pullups habilitados, y C0
/ C1
como salidas; cada uno saldría bajo al escanearlo.
Mi principal preocupación es que los diodos de alguna manera evitarán que la baja salida anule los pull-ups, o algo así.
¿Este enfoque funciona? ¿Debo mostrar alto en los pines de la columna que no estoy escaneando, o está bien (o mejor) hacerlos hi-z / entradas?