LABORATORIO N° 3
Programación
con Display de 7 segmentos
COMPETENCIA ESPECIFICA DE LA SESION
- Conocer el Display de 7 segmentos y su funcionamiento
- Conocer las técnicas de multiplexación
- Programar HMI para juego de encestar.
MARCO TEÓRICO
DISPLAY DE SEGMENTOS
Esta compuesto por 7 dispositivos lumínicos(Led) que forman un “8”, de esta forma controlando el encendido y apagado de cada led, podremos representar el numero o letra que necesitamos.
Existen dos tipos de display de 7 segmentos, su principal diferencia es la conexión que debemos implementar para encenderlos, estos dos tipos se conocen como Anodo común y Catodo común.En los 7 segmentos de Cátodo Común, el punto circuital en común para todos los Led es el Cátodo (Gnd), cero volt, Mientras que el Ánodo común el punto de referencia es Vcc.Teniendo en cuenta estas consideraciones la forma de encender los led debe realizase de diferente manera en función de que elemento tengamos (Ánodo o Cátodo común).Cada Led trabaja con tensiones y corrientes bajas por lo tanto se pueden conectar directamente a compuertas lógicas o pines de salida de un micro controlador, igualmente siempre es recomendable para aumentar la vida util de los mismos, conectarle una resistencia en serie entre el pin de salida del micro controlador y el de entra del 7 segmentos, la intensidad lumínica en este caso dependerá del valor de la resistencia agregada.
EVIDENCIA
#include <16f877a.h>
#use delay (clock=20M)
#fuses HS, NOPROTECT, NOWDT
int tabBCD[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,
0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
int delay=5;
int16 dato=0;
int16 unidades=0, decenas=0, centenas=0;
void descomp_entero(int16 valor)
{
centenas = (int16) valor / 100;
valor -= centenas * 100;
decenas = (int16) valor / 10;
valor -= decenas * 10;
unidades = (int16) valor;
}
void visualizar(void)
{
output_b(tabBCD[centenas]);
output_a(0b00001000);
delay_ms(delay);
output_b(tabBCD[decenas]);
output_a(0b00000100);
delay_ms(delay);
output_b(tabBCD[unidades]);
output_a(0b00000010);
delay_ms(delay);
}
void BIP()
{
for ( int i=0;i<=100;++i)
{
output_high(PIN_E1);
delay_ms(1);
output_low(PIN_E1);
delay_ms(1);
}
}
void main ()
{
dato = 500;
descomp_entero(dato);
visualizar();
while(1)
{
IF ( !input(PIN_D0))
{
dato = dato + 5;
descomp_entero(dato);
BIP();
delay_ms(300);
IF (dato>600)
{
BIP();
BIP();
BIP();
dato=600;
}
}
IF (!input(PIN_D1))
{
for (int x=1;x<=5;++x)
{
dato = dato - 1;
descomp_entero(dato);
BIP();
for (int j=1;j<=66;++j)
visualizar();
}
}
visualizar();
}
}
#use delay (clock=20M)
#fuses HS, NOPROTECT, NOWDT
int tabBCD[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,
0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
int delay=5;
int16 dato=0;
int16 unidades=0, decenas=0, centenas=0;
void descomp_entero(int16 valor)
{
centenas = (int16) valor / 100;
valor -= centenas * 100;
decenas = (int16) valor / 10;
valor -= decenas * 10;
unidades = (int16) valor;
}
void visualizar(void)
{
output_b(tabBCD[centenas]);
output_a(0b00001000);
delay_ms(delay);
output_b(tabBCD[decenas]);
output_a(0b00000100);
delay_ms(delay);
output_b(tabBCD[unidades]);
output_a(0b00000010);
delay_ms(delay);
}
void BIP()
{
for ( int i=0;i<=100;++i)
{
output_high(PIN_E1);
delay_ms(1);
output_low(PIN_E1);
delay_ms(1);
}
}
void main ()
{
dato = 500;
descomp_entero(dato);
visualizar();
while(1)
{
IF ( !input(PIN_D0))
{
dato = dato + 5;
descomp_entero(dato);
BIP();
delay_ms(300);
IF (dato>600)
{
BIP();
BIP();
BIP();
dato=600;
}
}
IF (!input(PIN_D1))
{
for (int x=1;x<=5;++x)
{
dato = dato - 1;
descomp_entero(dato);
BIP();
for (int j=1;j<=66;++j)
visualizar();
}
}
visualizar();
}
}
VÍDEO