Saltar al contenido

Display 7 segmentos y Antirebote con PIC

En este post aprenderás que es y como evitar el antirebote o anti-rebote con PIC provocado por sistemas mecánicos en circuitos electrónicos y también vamos a aprender paso a paso como usar un Display de 7 Segmentos con PIC. Y con estos dos conceptos, vamos a hacer un ejemplo práctico usando un microcontrolador PIC.

Antes que nada te hago la invitación para que veas todo el curso completo y gratuito de Microcontroladores PIC.

Y que te suscríbas al canal de YouTube para seguir aprendiendo como programar microcontroladores:

Display de 7 Segmentos con PIC

El display led de 7 segmentos es un componente electrónico que me permite visualizar un valor numerico para una determinada aplicación. Cuando se quiere mostrar datos en el display, existen dos opciones para hacerlo, una utilizar un decodificador BCD a 7 segmentos después del microcontrolador, y otra es generar con el mismo microcontrolador el código 7 segmentos equivalente a cada número de 0 a 9.

Para que el microcontrolador maneje el display de 7 segmentos es necesario hacer la siguiente conexión (Para un display 7 segmentos de cátodo común). La misma conexión puede hacerse para un display led 7 segmentos de anodo común, la diferencia es que el común va a positivo y en la tabla de abajo intercambiar 1 por 0 y 0 por 1.

Display 7 Segmentos
6. Manejo de display 7 segmentos y antirebote

En el siguiente diagrama se muestra como conectar un display de 7 segmentos a un PIC 16F877a o 16F887, pero que sirve como base para conectar un display 7 segmentos en cualquier microcontrolador PIC del mercado.

Conexion display catodo comun con pic

Para lograr este objetivo se necesita entender el manejo de estructuras en C, que funcionan como una tabla donde el programa puede consultar el contenido de cada posición. Lógicamente en cada posición se encuentra el código 7 segmentos de cada número de 0 a 9.

Con esto vamos a programar un Display de 7 Segmentos con CCS C.

Display 7 Segmentos Tabla en Hexadecimal

A continuación te dejo la tabla del Display 7 Segmentos Hexadecimal para Cátodo y Ánodo común:

Cátodo Común

Display 7 Segmentos Catodo Común

Para manejar una estructura en C, lo único que se debe hacer es añadir la estructura al encabezado.

Para Cátodo Común adicionar el siguiente arreglo:

Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

La conexión a cátodo común se realiza a través de transistores NPN llevando el común del display a tierra como se observa en la siguiente ilustración:

Display de 7 Segmentos Catodo común

Ánodo Común

Display 7 Segmentos Anodo Común

Para Ánodo Común adicionar el siguiente arreglo:

Byte CONST display[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

El número 10 indica la cantidad de posiciones de la estructura, los códigos 7 segmentos están en hexadecimal.

La conexión a ánodo común se realiza a través de transistores PNP llevando el común del display a VCC como se observa en la siguiente ilustración:

Display 7 Segmentos Anodo Común

Es importante destacar que para la construcción de nuestros proyectos electrónicos con microcontroladores podemos comprarlos también desde la comodidad de nuestra casa en Amazon que tiene envios para cualquier lugar de latinoamerica y para europa:

ANTIREBOTE PIC o ANTI-REBOTE con PIC

Cuando se trabaja con pulsadores o suiches o elementos mecánicos parecidos, en el momento en que estos cambian de estado se genera una señal conocida como REBOTE como la que se muestra en la figura:

Antirebote PIC Microcontrolador

Es decir, el suiche o pulsador genera unos y ceros (ruído) hasta que finalmente se estabiliza.

El microcontrolador con su velocidad de trabajo (la cual es muy rápida) se da cuenta de estas variaciones provocadas por los dispositivos electromecánicos y puede pensar, por ejemplo, que el pulsador fue presionado várias veces, cuando en realidad no fue asi.

Para evitar errores en la detección de pulsadores y suiches al momento de programar los microcontroladores PIC, se utiliza un código conocido como el ANTIREBOTE PIC.

El antirebote pic es simplemente la utilización de retardos de 150 a 200ms aproximadamente, en el momento en que se detecta que un pulsador o suiche cambió de estado. Este tiempo es suficiente para que se estabilice la señal proveniente del sistema mecánico para posteriormente preguntar por el estado del suiche o pulsador.

Vamos a ver los siguientes ejemplos, con sus respectivos códigos, para que aprendas a programar el display 7 segmentos y el anti rebote en un microcontrolador PIC.

Como Usar Display led 7 Segmentos y el AntiRebote con PIC

Para aprender a usar todo lo que vimos en este post, vamos a hacer un Ejemplo poderoso que coloque en práctica todo lo aprendido hoy y de esa manera conseguir que tus habilidades aumenten:

Temporizador con PIC usando CCS C Compiler

Realizar un temporizador con PIC de 0 a 9 utilizando un display de 7 segmentos que incremente cada segundo.

Display 7 segmentos + PIC

 El código de implementación del temporizador PIC usando la instrucción de retardo o delay se muestra a continuación.

#INCLUDE <16F887.H>
//#USE DELAY(CLOCK=4000000) //Cristal interno 4MHz
#USE DELAY(CLOCK=4000000,CRYSTAL) //Cristal externo 4MHz
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP

BYTE CONST DISPLAY[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB=6
INT TEMPORIZADOR;

MAIN()
{
   SET_TRIS_B(0B00000000);             //Configura el puerto B
   WHILE(TRUE)                         // Haga por siempre
   {
      TEMPORIZADOR  = 0;                    // Inicializa temporizador en cero
      WHILE(TEMPORIZADOR <10)               // Mientras contador < 10
      {
         PORTB= DISPLAY[TEMPORIZADOR ];     // Muestre el valor en el display
         TEMPORIZADOR ++;                   //Incrementa TEMPORIZADOR
         DELAY_MS(1000);                    // Retardo de 1 segundo
      }
   }
}

De esa forma podremos implementar un temporizador PIC usando el CCS C PIC C Compiler, sin embargo también podríamos hacer temporizadores con PIC usando los Timers del microcontrolador, como el TIMER1 o el TIMER0, eso lo detallamos en la entrada de TIMER CON PIC.

Contador + Temporizador con PIC usando Display 7 Segementos y AntiRebote

Diseñar un temporizador con PIC decremental cada segundo. Pero vamos a combinar esta práctica también con un contador con PIC.

Vamos realizar un contador con PIC usando el pulsador conectado a RC0 (contador ascendente con push button pic), con el cual vamos a contar el número inicial con el que queremos que comience el temporizador decremental.

Usaremos otro pulsador en RC1 para darle la orden al microcontrolador de iniciar la temporizacion.

(Tratar el problema de antirrebote con PIC generado por ambos pulsadores).

Por ultimo colocar un Led en el pin RC2 que se active en el momento que el temporizador decremental está funcionando.

Microcontrolador con display 7 segmentos

(De forma similar puede hacerse un contador de display de 7 segmentos. Con lo aprendido en esta entrada, tú mismo estás en la capacidad de programar tu propio contador de 0 a 9 usando el display led de 7 segmentos)

A continuación se presenta el código del temporizador + contador con PIC para que lo copies y lo pegues en tu compilador y puedas reproducirlo. Recuerda que para ver el código debes compartir el contenido de este blog para que más personas se beneficien de esta información.

#INCLUDE <16F887.H>
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
BYTE CONST DISPLAY[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
#BYTE PORTB=6
#BYTE PORTC=7
#DEFINE SW1 PORTC,0
#DEFINE SW2 PORTC,1
#DEFINE LED PORTC,2
INT CONTADOR;

MAIN()
{
   SET_TRIS_B(0B00000000);             //Configura el puerto B
   SET_TRIS_C(0B00000011);             //Configura el puerto B
   CONTADOR = 0;                       // Inicializa contador en cero
   WHILE(TRUE)                         // Haga por siempre
   {
      PORTB= DISPLAY[CONTADOR];
      BIT_CLEAR(LED);
      IF (BIT_TEST(SW1))
      {
         DELAY_MS(200);                // Antirrebote
         while (BIT_TEST(SW1));
         CONTADOR++;
         PORTB= DISPLAY[CONTADOR];
         IF(CONTADOR==10)
         {
            CONTADOR=0;
         }
      }
      IF (BIT_TEST(SW2))
      {
         DELAY_MS(200);             //Antirrebote
         BIT_SET(LED);
         WHILE (CONTADOR>0)
         {
            PORTB= DISPLAY[CONTADOR];
            DELAY_MS(1000);
            CONTADOR--;
         }
         BIT_CLEAR(LED);
      }
   }
}

Eso es todo por el día de hoy queridos controleros y controleras, espero hayan aprendido como programar un display 7 segmentos utilizando un microcontrolador PIC y que hayan aprendido a lidiar con el problema del REBOTE generado por los componentes mecánicos.

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (14)

Buenas tardes profe, necesito orientación para llevar a cabo este ejercicio en un ensamblador :
Diseñe un contador hexadecimal de un dígito con un microprocesador. El mismo se pudiera visualizar en un display de 7 segmentos en puerto P1. Se requiere una tabla de conversión BIN a 7 SEGTS. El contador avanza con la tecla PB conectada al puerto Px. Use el registro interno B como un contador binario.

Responder

Buenas tardes profe muchas gracias por sus tutoriales le escribo por que tengo la necesidad de hacer un retardo de una hora con pic 16f628a o con el propio pic16f887 en un pin determinado, servira el uso del dalay ms o habra que usar el time0 realmante no soy un experto estoy en mi inicios la otra cosa que me gustaria saber si se podra utilizar un display de 160×32 este ultimo caso es para usarlo en un proyecto independiente.

Responder

Hola Osmel, no uses la instrucción delay_ms, para controlar tiempos, pues vas a dejar tu microcontrolador sin la posibilidad de hacer nada durante ese tiempo. Debes usar el timer0 junto con un contador. Configuras que el timer se active cada segundo y dentro de la rutina de interrupción incrementas un contador. Cuando el contador llegue a 3600, indica que ya ha pasado 1 hora y puedes realizar tu lógica, haciendo un if-else dentro del principal. Y claro puedes utilizar el display que desees.

Responder

Buenas tardes señor una pregunta ¿para que sirve la linea «byte port b = 6 y byte portc=7? he visto que la usa en varios proyectos.

Responder

Son las direcciones de memoria del microcontrolador donde se encuentra el registro del puerto B y Puerto C, para poder usar dentro del código la sentencia «portb» o «portc». Esas direcciones se encuentran dentro del datasheet y pueden variar dependiendo del tipo de microcontrolador que uses. Por ejemplo para el microcontrolador 18F4550, la dirección del puerto B escrito en números hexadecimales sería (portb = 0xf81)

Responder

Buenas Tardes, estoy iniciando en programacion en C para Pic, y me gustaria si me puedes ayudar a adaptar este programa de display 7 segmentos en un PIC 16f628a

Responder

estaba realizando una simulacion en proteus con un display de catodo comun, y al poner los hexadecimales para los numeros de 0 al 9 que hay en tu pagina me di cuenta que los segmentos estaban al revez, se veia el numero con los segmentos apagados, cuando coloque los otros ex que pones para anodo me funciono bien

Responder

Que extraño. Lo importante es que te funcionó. Em mi caso me funciona bien con el arreglo que tengo ahi en la pagina y nadie relató tener problema con ello.

Responder

Hola que fortuna encontrar esta pagina.
De un Colombiano a otro.
Gracias y lo felicito, por su labor

Cesar Alvarez

Responder

Gracias Cesar, que bueno que te ha ayudado. Saludos.

Responder

Hola sergio, no entiendo esta parte:
IF (BIT_TEST(SW1))
{
DELAY_MS(200); // Antirrebote
while (BIT_TEST(SW1)); <<<<<<<<<< porque se queda en "stop" el programa y cuando se suelta sube un digito el display?

Responder

Daniel, esa linea esta puesta ahi, justamente para hacer eso, para esperar hasta que el usuario deje de pulsar el botón para poder subir un digito. Simplemente se hace un while y se pregunta si el boton esta presionado. Si esto es verdad (es decir si el botón esta presionado) la instrucción BIT_TEST(SW1) siempre entregará un 1, entonces será como tener while(1); osea se quedara en esa instrucción quieto hasta que sea falsa, cuando sueltes el boton la instrucción BIT_TEST(SW1) entregara un 0, entonces será como tener while(0); y puede continuar haciendo su rutina.

Responder

muchas gracias sergio, fue muy clara la respuesta ! seguire con el siguiente tutorial

Responder

[…] 6. Manejo de display 7 segmentos y antirebote […]

Responder