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
}