desktop

Codificador para teclado Hexadecimal con un multiplexor.

Buenos días a todos.

Hace un rato publiqué este pequeño aporte en mi blog y lo comparto con ustedes señores. El contenido es el mismo ;)

Muchos han visto el circuito codificador para teclados hexadecimales con el circuito integrado 74LS922. Sí, muy lindo, muy simple, no tienes que hacer mas que ensamblar tu PCB, todo felicidad para algunos, pero no para mí.

Pues donde vivo, únicamente en un lugar lo consigo y bien caro, casi a 100 pesos. Una barbaridad. Más las otras cosas que necesite para adaptarlo a mi sistema donde los quiera usar.... Simplemente bien caro y algo limitado, pues te permite sólo 16 teclas o la expansión a 20, pero, ¿qué tal si necesitas mas de 20 teclas? En mi caso, necesito uno de 16, otro de 32 y otro alfanumérico de 130.

Así que decidí poner mi mente a trabajar para idear un codificador para nuestros teclados para mis proyectos.

Sé que no cualquiera consigue el 74LS922, así que los circuitos que desarrollé emplean circuitos fáciles de conseguir como simples multiplexores, contadores y unas puertas lógicas. Pero lo mejor es que de casi 100 pesos del 74LS922, sólo gastaremos unos 30 pesos por el CD4067 y el CD4040.

DSC02238.jpg


Mientras estaba ideando un codificador sólo para 16 teclas, pude obtener uno simple.

16+key.PNG


Este teclado fue mi primera idea que tuve. Ahora les explicaré como funciona:

El CD4040 recibe la señal de reloj desde el sistema donde esté conectado el teclado e irá seleccionando de forma secuencial cada canal del CD4067.

Las primeras 4 salidas del CD4040 tienen dos usos: para enrutar el CD4067 y como el código de cada tecla, lo que se traduce como el bus de datos del teclado. De esta forma, el código 0101 representa la tecla 5, el código 1001 representa la tecla 9....

Para que el código presente en el bus de datos del teclado tenga validez, la línea #STROBE debe estar en bajo.

Si observan, la línea #STROBE es la salida del CD4067 y el estado de #STROBE depende de las teclas.

16+key+2.PNG


Cuando se presione la tecla 3 y el canal seleccionado en ese momento sea el 10, la tecla debe "esperar" a que sea seleccionada. Una vez sea seleccionada, la línea #STROBE cambiará de estado lógico para alertar al sistema de que una tecla ha sido presionada y el código presente en el bus de datos corresponde a la tecla presionada.

Ahora, ¿Qué pasa si se presiona más de una tecla a la vez?

Si esto sucede, no se altera nada. Partiendo de la lectura del canal 0, supongamos que se presionó la tecla 4 y la tecla 13, primero se enviará la señal de #STROBE de la tecla 4 y después de la tecla 13 cuando ésta sea leída.

En ningún caso sucederá que los códigos de dos o más teclas se fusionen y finalmente el sistema interprete una tecla distinta. De acuerdo a las teclas presionadas al mismo tiempo, las de más bajo valor son leídas primero.

La línea INHIBIT, en estado bajo, el codificador funciona normalmente, si cambia a estado alto, el CD4067 ignorará sus entradas.

Señal de Reloj #CLK

Como este codificador es secuencial, necesita una frecuencia relativamente alta para leer todas las teclas. En mi caso lo usaré con un cristal de una frecuencia inferior al megahertz.

Si usamos una frecuencia de 100KHz, cada tecla será leída 6,250 veces por segundo. Un valor que puede ser bueno para ciertas aplicaciones.

Por otro lado, si usamos una frecuencia de 10KHz, cada tecla será leída 625 veces por segundo, una frecuencia más aceptable para nuestras aplicaciones.

De todas formas, la señal de reloj la proveerá nuestro sistema a donde irá conectado el teclado.

Si bien, el teclado tiene una desventaja, y esa es el famoso rebote que es generado cuando se acciona una tecla. Para que no se generen los molestos rebotes, podemos poner un flip flop en la línea #STROBE para disimularlos.

Podemos solucionar los rebotes con un eliminador de rebotes por tecla, pero aumenta la complejidad y el precio, y es lo que menos buscamos! Por eso dejamos de lado al 74LS922!

También tiene otra desventaja o limitación mejor dicho, no incluye ninguna tecla para alguna función especial, en un teclado común de PC podemos ver la barra espaciadora, entrar, shift y otras. Este teclado no las trae.

Hasta ahora obtuve otras formas para hacer nuestros teclados sin necesidad de microcontroladores o circuitos integrados especializados pero caros y difíciles de conseguir.

La opinión del autor:

Este circuito es una nueva forma de usar un multiplexor cualquiera, que con, su contador binario, puede hacer más, que simplemente seleccionar datos. Un conjunto así es capaz de codificar muchas teclas. En otra versión que saqué hoy, podemos expandir este teclado de 16 a 32 o más teclas, sin apenas modificar el circuito base.

¡Hasta la próxima! ...
 
Última edición:
oye una pequeña modificacion

el cd4040 tiene un pin a reset
ese pin esta a masa

entonces por cada clock que des este seguira contando hasta el pin 12

para no desperdiciar ciclos a lo bestia ese pin 5 podriamos mandarlo al pin reset

ahora solo usariamos 16 ciclos para leer el teclado

otra cosa podriamos omitir este teclado y usar 2 CD4021 en serie y compartir solo un DATA ,CLK y LATCH
asi seria aun mas barato pues no urariamos resistencias y nadamas utilizariamos 3 lineas del microcontrolador
 
Última edición:
Puede no ser necesario lo que sugieres, pues al contar 16 estaría así el conteo: Q0-4: 00001, de Q0 a Q3 están en ceros, por lo que el CD4067 seleccionará el canal 0.

En la simulación al contar más de 16, las salidas del 4040 (Q4, 5...) obviamente cambian de estado pero no importan, pues de Q0 hasta Q3 se dividirá entre 16 todo el tiempo.

En esta versión es en paralelo, pues lo quiero para programar unas RAM no volátiles, pero voy a diseñar uno que sea I2C ;)
 
Estaba desarrollando otro mejor, con el CD4067 pero de 32 teclas expandible a 64, una belleza! y con apenas unas 10 líneas para reloj, estrobo y datos y toda la cosa.

Y con apenas el mismo contador, un CD4067, unas puertas AND y NOT y dos diodos, lo llamo "teclado de doble rastreo", pues usa un método similar al barrido de una pantalla.
 
Atrás
Arriba