Saludos cordiales a todos mis estimados lectores, de nuevo tengo la dicha de escribir para todos ustedes.
En el artículo pasado vimos alguna teoría sobre el Display 7SEGMENTESO al que a partir de ahora llamaremos 7SEG, si deseas consultar dicha información lo puedes hacer dando click aquí o revisando mi blog.
Hoy vamos a controlar no uno sino 4 7SEG al mismo tiempo usando un PIC16F877a programado en lenguaje C, vamos a generar un problema, un análisis del problema, determinar los componentes del circuito, crear el programa para el microcontrolador en lenguaje C combinando las instrucciones while, if y for con una explicación paso a paso bien y finalmente haremos la simulación cuyo resultado subiré en formato gif.

EL PROBLEMA |
---|
Se requiere controlar 4 7SEG con un PIC16F877a que permita contar los números del 0 al 9 alternando al cuenta entre cada 7SEG, solo uno de los Displays debe estar encendido y nunca más de uno de forma simultánea, además cada display mostrará 1 número cada 4 cuentas lo que hace una cuenta en colectivo, si el primero cuenta 0 el 1 aparecerá en el seguno, el 2 en el tercero y así consecutivamente. Cuando se llegue a 0 la cuenta debe reiniciarse y continuar de forma indefinida.
ANÁLISIS DEL PROBLEMA |
---|
Lo primero que debemos notar es que no existen entradas de datos, los 7SEG son considerados como salidas. Vamos a manejar 4 7SEG y lo haremos usando el mismo puerto pero debemos evitar que la señal enviada se muestre en todos los Displays a la vez.
Para evitar esto nos apoyaremos en el terminal común de los 7SEG conmutando a masa solo el que deseamos que se muestre, la conmutación la haremos mediante transistores BJT y enviarémos una señal de activación desde el microcontrolador para mantener la sincronización, dado que son 4 7SEG se requeriran 4 salidas adicionales a parte de las 7 que conforman la señal de imagen.
Usaremos el PORTB en los pines B0 al B6 para generar los números y el PORTD en los pines D0 al D3 para controlar que 7SEG se enciende.
Como usaremos cátodo común necesitamos tener un valor alto en los terminales asociados a los 7SEG para esto usaremos 4 resistencias de 1k conectadas a una fuente de 5v, los pines conmutan a tierra por medio de transistores cuya base será limentada desde el microcontrolador, en este caso colocaremos resistencias para limitar la corriente y no dañar el micro o el transistor, todo esto además de las 7 resistencias para los leds de los 7seg. Todo esto genera el siguiente circuito electrónico.

CÓDIGO DEL PROGRAMA EN C |
---|
#include <16f877a.h>
#fuses HS,NOWDT,NOPUT,NOLVP,NOPROTECT,BROWNOUT
#use delay(clock=20M)
Luego definimos los puertos que vamos a usar
Ahora vamos a crear algunas variables que nos serán de utilidad durante el programa.
int display[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int contador, x;
El uso de estás variables es el siguiente:
- Display es una variable tipo vector, esto significa que es una variable que puede almacenar una cantidad de valores [especificados] de forma simultánea, en nuestro caso usamos [10] valores que se corresponden a los códigos necesarios para representar los números del 0 al 9 en nuestro 7SEG.
De manera que si necesitamos mostrar un número específico llamamos a display[numero que contiene el código correcto].
Contador será la variable que usaremos para controlar las veces que se ejecutará el bucle for.
x es una variable que he creado para generar una condición if que me permita alternar la activación de los Displays.
Lo siguiente será iniciar el programa principal y en él configurar los puertos como salida, limpiar las salidas para evitar que aparezcan valores no deseados y establecemos la variable x en el valor 0.
void main()
{
set_tris_b(0x00);
set_tris_d(0x00);
output_b(0x00);
output_d(0x00);
x=0;
ahora creamos el bucle while para que se ejecute de forma infinita por conveniencias obvias y dentro de él estructuramos un bucle for
while(true)
{
for(contador=0; contador<10; contador++)
Como son 4 Displays estableceremos 4 condicionales if (uno para cada display) cuya ejecución está condicionada por la variable x, x=0 encenderá el primer Display, =1 el segundo, =2 el tercero e igual 3 el cuarto, dentro de la condición if asociada a los Displays 1,2,3 se incrementa x para que a la siguiente vuelta pase al siguiente, cuando x=3 enciende el 4to Display y en esa condición se hace x=0 para reiniciar el ciclo.
if(x == 0)
{
output_d(0b00000001);
output_b(display[contador]);
delay_ms(500);
x++;
}
else if(x == 1)
{
output_d(0b00000010);
output_b(display[contador]);
delay_ms(500);
x++;
}
else if(x == 2)
{
output_d(0b00000100);
output_b(display[contador]);
delay_ms(500);
x++;
}
else if(x == 3)
{
output_d(0b00001000);
output_b(display[contador]);
delay_ms(500);
x=0;
}
Ahora miremos detenidamente lo que ocurre dentro de la condición if a parte de lo descrito sobre la variable x.
lo primero que ejecutamos es output_d(VALOR), aquí colocamos un valor en binario para hacer 0 todas las salidas de D excepto aquella que necesitamos para excitar la base del transistor y encender el Display correspondiente, de esa forma encendemos solo uno y en orden.
output_b(display[contador]); recordemos que display es una variable tipo vector y el valor que queremos tomar de los disponibles depende del valor dentro de [], en ese sentido contador es otra variable que es modificada por el bucle for cada vez que se ejecuta un ciclo, esto hace que contador vaya aumentando de 0 a 9 y en el proceso display[contador] pedirá el numero de display que se corresponda con contador.
El resultado es que se obtendrá display[0]... hasta display[9] porque son los valores que irá tomando la variable contador en cada ejecución. Esto a su vez ejecutará los códigos que imprimen el número deseado.
Luego de cada encendido creamos un retardo de 500ms para dar tiempo a que se muestre el valor.
Si deseamos imprimir 4 dígitos a la vez se puede hacer reduciendo los tiempos para que conmute tan rápido que el ojo no pueda detectar la variación y se muestren cuatro números fíjos de forma simultánea.
Ahora vamos a cargar el programa en nuestro circuito y simularlo para ver el resultado.

simulación de todo lo expuesto en el artículo. Fuente: @electronico
Así culminamos otro artículo que espero hayas disfutado y sea de utilidad para ti.
Me despido no sin antes agradecerte por haberte tomado el tiempo de leer.!!
