cambiar matriz con contador de anillo

0

Hola, estoy creando un pequeño dispositivo, que tiene un total de 30 interruptores táctiles dispuestos en una matriz con 3 filas y 10 columnas. Mi problema es que solo me quedan 5 pines IO en mi microcontrolador AVR. Por lo general, escanearía mi matriz de conmutadores, habilitando solo una de las 10 columnas a la vez, y luego leería la entrada de las tres filas. Esto es, cómo determiné el interruptor presionado, pero esto necesitaría 13 pines IO.

Mi primer enfoque, para encontrar una solución, era usar un contador de anillo, pero estaba un poco confundido, en lo que realmente hace y cómo funciona. También pude encontrar solo los llamados mostradores Johnson en mi tienda de electrónica preferida. ¿Puede alguien ayudarme con esto?

EDITAR: Lo siento, olvidé mencionar que también debo detectar si se presionan varias teclas. Estoy usando diodos en cada interruptor para evitar cortocircuitos (espero poder llamarlo así, no tengo tanta experiencia en inglés).

    
pregunta ruabmbua

2 respuestas

1

Le sugeriré que aprenda sobre los registros de turnos. 4 unidades de un registro de desplazamiento paralelo a serie de 8 bits funcionarán muy bien para usted y necesitarían un máximo de 3 líneas a su controlador. Algunas de esas líneas pueden incluso compartirse con otras funciones si eres inteligente.

El CD4021 es una buena parte que uso en muchos de mis diseños. Necesitará una resistencia de pull-up para cada entrada. Utilizo redes de resistencias de bus SIP: el paquete de 10 pines le ofrece 9 resistencias de extracción en un espacio muy pequeño.

También puede montar los registros de desplazamiento muy cerca de sus interruptores para minimizar el número de cables al controlador.

    
respondido por el Dwayne Reid
0

Como usted tiene el lujo de 5 pines de E / S, aquí le ofrecemos una sugerencia basada en el contador de anillos Johnson (4017) (uno de cada 10). El circuito completo usaría tres circuitos integrados 4017 con las líneas CLOCK y RESET en líneas de DATA comunes y separadas para cada chip (data1, data2, data3) que se leerían en paralelo .

Esto permite que los 30 conmutadores se lean en 10 ciclos de lectura y también permite múltiples operaciones de conmutación. Los diodos utilizados son tipos de propósito general, como un 1N4148. Su función es evitar que una salida BAJA se conecte a una salida ALTA y se ponga en cortocircuito (sacándola BAJA). R1 es una resistencia desplegable. El valor no es crítico, por lo que cualquier cosa entre unos pocos cientos de ohmios y unos pocos 10K estaría bien. Solo UNA salida es ALTA en cualquier momento y esta salida es la única que puede producir una ALTA en la línea de datos (entrada al controlador) SI el interruptor está cerrado.

Circuito básico. (1 de 10)

Estomuestralaconfiguraciónparaunasolalecturade10interruptores.Lalíneadedatos(entrada)semantendráBAJAporR1(valornocrítico).Paraescanearlosinterruptores,elcontadoresprimerorestablecer,porloquelasalida0vaenALTO.Sisepresionaelinterruptor'0',secolocaráunvoltajeatravésdeR1ylalíneadedatosiráALTAsinosepresionaelinterruptor,lalíneadedatosseráBAJA.Estopuedeserleídoporelcontrolador.Elcontroladorentoncesproduceunpulsoderelojylasalida1pasaaALTO.Sielinterruptor1estácerrado,lalíneadedatosestaráALTA.Sielinterruptorestáabierto,lalíneadedatosseráBAJAyasísucesivamente.Alregistrartodaslassalidas,sepuedeprobarcadainterruptor,loquepermite"ver" varias pulsaciones de teclas al almacenar cada valor por separado.

Meta Code.

Clockcount == 0; // a counter to identify which 4017 output (bit position)
lastpress == thispress ; // remember last keypress pattern (16 bit) - useful for monitoring changes and debouncing etc.
thispress == 0; set up new keypress variable (bit pattern of switches)
Toggle(Resetpin); // reset 4017 for '0' output HIGH
inputupdate(datapin); // get the value of the data line (HIGH = keypress, LOW = no keypress)

// and store new value in thispress (16 bit switch image)
Loop until Clockcount = 10 ; {
  Clockcount++ // increment clock counter (1,2,3,4,5,6,7,8,9)
  Toggle(clockpin); // increment 4017 counter for next output 
  inputupdate(datapin); // get the value of the data line (HIGH = keypress, LOW = no keypress)

  // and store new value in thispress
}
    
respondido por el JIm Dearden

Lea otras preguntas en las etiquetas