Controlando 4 Dispalys 7SEG con PIC16F877a Usando lenguaje C.
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.!!
Dear @electronico,
Your support for the current HiveBuzz proposal (#199) is much appreciated but the proposal will expire soon!
May we ask you to review and support the new proposal so our team can continue its work?
You can support the new proposal (#248) on Peakd, Ecency, Hive.blog or using HiveSigner.
Thank you!
Thanks for your contribution to the STEMsocial community. Feel free to join us on discord to get to know the rest of us!
Please consider delegating to the @stemsocial account (85% of the curation rewards are returned).
Thanks for including @stemsocial as a beneficiary, which gives you stronger support.