El ejemplo que aquí propongo es la utilización de los registros para controlar 8 displais de 7 segmentos, como ya vimos anteriormente en este artículo, pero con el agregado de la implementación de un teclado; Pero aquí les proporciono el ejemplo completo con el código fuente en CCS C y su respectivo .HEX para que puedan grabarlo en el PIC y probarlo.
He aquí el diagrama de conexión:
El diagrama es bastante sencillo, solo hace falta conectar cada segmento de cada display a las salidas (Q0-Q7) del shift register encargado de "dibujar" los números y el ánodo común de cada display a cada una de las salidas del segundo integrado. También este diseño es válido si los displais son de cátodo común la única diferencia está en que habría que hacer una pequeña modificación en el código.
Para probar el código que les propongo, al diagrama anterior hay que agregarle algunas cosas como por ejemplo 10 pulsadores, 10 diodos 1N4001-7 y 2 resistencias de unos 10KΩ, como se ve en el siguiente diagrama.
Cada ánodo de los diodos se conecta a una salida diferente del shift register encargado de seleccionar el display que se iluminará, de esta forma multiplexámos el teclado de modo que a cada iteración del bucle encargado de encender un display comprobamos una tecla, como esto nos da la posibilidad de conectar solo 8 pulsadores, se agrega otra entrada para comprobar una segunda línea.
A continuación les dejo el código:
/************************************************************************* ** ** ** Ejemplo para controlar 8 display de 7 segmentos ** ** y un teclado con dos shift register y un PIC. ** ** ** ** (c) 2010 Gerardo Ariel Ramírez ** ** picblog@hotmail.com ** ** http://picrobot.blogspot.com/ ** ** ** ************************************************************************** ** ** ** Microcontrolador: PIC16F88 Oscilador: Interno - 8 MHz ** ** Lenguaje: CCS C ** ** ** *************************************************************************/ #include <16f88.h> // Tipo de microcontrolador #fuses INTRC_IO,MCLR,NOPUT,NOBROWNOUT // Fuses #use fast_io(all) #use delay(clock=8M) #define Load PIN_B0 // Load (STCP ambos integrados) B0 #define Clk PIN_B1 // Clock (SHCP ambos integrados) B1 #define dDsp PIN_B2 // Data para seleccionar display (DS integrado 1) B2 #define dSeg PIN_B3 // Data para activar segmentos (DS integrado 2) B3 #define Teclado1 PIN_B4 // Entrada de teclas 0-7 #define Teclado2 PIN_B5 // Entrada de teclas 8 y 9 #define Seg_A 0x01 #define Seg_B 0x02 #define Seg_C 0x04 #define Seg_D 0x08 #define Seg_E 0x10 #define Seg_F 0x20 // Los bits correspondientes a cada segmento de cada display. #define Seg_G 0x40 // Estos bits se comparan mediante la máscara Mask. int Digit[8]; int Numero[10]={ Seg_A + Seg_B + Seg_C + Seg_D + Seg_E + Seg_F, Seg_B + Seg_C, Seg_A + Seg_B + Seg_D + Seg_E + Seg_G, Seg_A + Seg_B + Seg_C + Seg_D + Seg_G, Seg_B + Seg_C + Seg_F + Seg_G, Seg_A + Seg_C + Seg_D + Seg_F + Seg_G, Seg_A + Seg_C + Seg_D + Seg_E + Seg_F + Seg_G, Seg_A + Seg_B + Seg_C Seg_A + Seg_B + Seg_C + Seg_D + Seg_E + Seg_F + Seg_G, Seg_A + Seg_B + Seg_C + Seg_D + Seg_F + Seg_G }; // Establece Numero[0-9] con los datos correspondientes a cada segmento que deberá encender. void CargaMem(char Ascii); void GuardaClm(char c); void main(){ int d; int b; int Mask; int Tecla; int anTecla; setup_ccp1(CCP_OFF); set_tris_a(0); // Puerto A como salida set_tris_b(0b00110000); // Puerto B como salida excepto B4:B5 como entradas setup_oscillator(OSC_8MHZ); d=0; anTecla=10; do{ Mask=0x80; // Carga la mascara, solo el MSB en high for (b=0;b<8;b++){ // Un bucle de 8 pasos (0-7) output_bit(dSeg,!(Mask&Numero[Digit[d]])); // Le envía los bits al shift // register encargado de encender // los segmentos. if (b==d) output_high(dDsp); else output_low(dDsp);// Pone en alto el bit corres- // pondiente al display que se va a // encender en esta iteración. Mask>>=1; // Divide la mascara por 2 : 128, 64, 32... output_low(Clk); // Low-to-High en el Clk output_high(Clk); // hace que la memoria del shift register rote } output_low(Load); // Low-to-High en Load hace que la memoria output_high(Load); // del shift register se represente en sus salidas if (input(Teclado2)) Tecla=d+9; // Comprueba que se haya detectado la pulsación en las if (input(Teclado1)) Tecla=d+1; // entradas de teclado y lo guarda en la variable Tecla. if (++d>7){ // Incrementa el display a mostrar // si se pasa de 7 vuelve a 0- if (Tecla!=0 && AnTecla==0){ // Si Tecla es diferente a 0 (se ha pulsado una tecla) for (b=7;b>0;b--){ Digit[b]=Digit[b-1]; // Hace un scroll en los display } Digit[0]=Tecla-1; // y guarda la tecla pulsada en el ultimo display. } AnTecla=Tecla; // Guarda la tecla pulsada y Tecla=0; // pone Tecla a 0 para comprobar la proxima vez. d=0; // d a 0 para encender el primer display y comenzar } // otra vez. }while (true); // Bucle infinito }
Espero que les haya gustado y lo próximo que les entregaré será un artículo sobre el control de un array de 8x8 LED con el mismo sistema.
Desde este link se puede bajar el código y el .HEX
todo me parece muy bien, el problema que veo es que no hay ninguna simulacion, no estaria mal tener un .DNS (simulacion ejecutable en proteus)
ResponderEliminartu de seguro tienes la idea de como armar esta practica, pero los demas no.
Si, es verdad que a veces faltarían simulaciones, pero soy de la idea de que la mejor forma de demostrar una teoría es por medio de la práctica, y este ejemplo en concreto no tendría sentido simularlo ya que esta completo para armar.
ResponderEliminarDe todos modos podría poner alguna simulación pero de alguna otra cosa, gracias por la sugerencia.
Saludos.
esta bien el ejemplo, no coloques simulaciones, la gente tambien quiere todo listo, dejalos que se rompan la cabeza al menos que piensen no
ResponderEliminarMe parece muy interesante se podría utilizar para un reloj de ajedrez la programación seria otra pero seria un excelente avance???
ResponderEliminarHola a todos, gracias por compartir estos proyectos, los que estamos empezando nos viene muy bien.
ResponderEliminarHe montado el circuito y funciona perfectamente, se visualizan los números en los display del 0 al 9, siguiendo la secuencia que hayamos pulsado.
He utilizado un pic 16F871 y un cristal de 4 MHz. con un marco que tengo preparado configurado con los fuses correctamente.
Ahora modificaré el programa con permiso del autor, para conseguir otras funciones.
Funcionara el circuito para arduino¿?
ResponderEliminardisplays anodo o catodo comun?
ResponderEliminar