Codigo:
// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
///////////////////////////////////
#include <16f877a.h>
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)
visualizar_display(int32 x)
{
int n=5,a;
char cadena[9];
//char *pcadena;
//char *psal=cadena;
char cadena7[2]={0};
char cadena6[2]={0};
char cadena5[2]={0};
char cadena4[2]={0};
char cadena3[2]={0};
char cadena2[2]={0};
char cadena1[2]={0};
char cadena0[2]={0};
// tabla de salidas de excitacion de siete segmentos
// int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 7seg hex 0-9 catodo comun
int tab7seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98}; // 7seg hex 0-9 anodo comun
// para hacer el barrido de los 8 displays
int muestra_digito[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Seleccion del display a visualizar
// pasa el entero a cadena
itoa(x,10,cadena);
//sprintf(cadena,"%lu",x);
//pcadena=cadena; //O también pcadena=&cadena[0];
// Pasa cada cada caracter del número a entero, empleando punteros:
*cadena7=cadena[7];
*cadena6=cadena[6];
*cadena5=cadena[5];
*cadena4=cadena[4];
*cadena3=cadena[3];
*cadena2=cadena[2];
*cadena1=cadena[1];
*cadena0=cadena[0];
// pone el caracter en la salida
// activa el display correspondiente
output_b(tab7seg[atoi(cadena0)]);
output_d(muestra_digito[n-1]);
delay_ms(1);
if (n==1)
return;
output_b(tab7seg[atoi(cadena1)]);
output_d(muestra_digito[n-2]);
delay_ms(1);
if (n==2)
return;
output_b(tab7seg[atoi(cadena2)]);
output_d(muestra_digito[n-3]);
delay_ms(1);
if (n==3)
return;
output_b(tab7seg[atoi(cadena3)]);
output_d(muestra_digito[n-4]);
delay_ms(1);
if (n==4)
return;
output_b(tab7seg[atoi(cadena4)]);
output_d(muestra_digito[n-5]);
delay_ms(1);
if (n==5)
return;
output_b(tab7seg[atoi(cadena5)]);
output_d(muestra_digito[n-6]);
delay_ms(1);
if (n==6)
return;
output_b(tab7seg[atoi(cadena6)]); //Decenas
output_d(muestra_digito[n-7]);
delay_ms(1);
if (n==7)
return;
output_b(tab7seg[atoi(cadena7)]); //Unidades
output_d(muestra_digito[n-8]);
delay_ms(1);
if (n==8)
return;
/*
for(a=1;a<=n;a++)
{
//output_b(tab7seg[atoi(*pcadena)]);
//output_b(tab7seg[atoi(psal)]);
output_d(muestra_digito[n-a]);
delay_ms(1);
}
*/
}
main()
{
int32 y=76543210;
set_tris_b(0x00);
set_tris_d(0x00);
do{
visualizar_display(y);
//y++;
}while(1);
}
Codigo:
Codigo:--------------------------------------------------------------------------------
// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
// · RB7 -> Punto 7seg
///////////////////////////////////
#include <16f877.h>
#include <stdlib.h>
#include <math.h>
#fuses XT,NOWDT,NOPROTECT
#use fast_io(B)
#use fast_io(D)
#use delay (clock=1000000)
visualizar_display(float f, int numero_total_digitos, int numero_de_decimales)
{
int32 x=0;
float f1;
int n=0;
int c=0;
int tiempo =10;
char cadena[10];
char cadena8[4];
char cadena7[4];
char cadena6[4];
char cadena5[4];
char cadena4[4];
char cadena3[4];
char cadena2[4];
char cadena1[4];
char cadena0[4];
// para hacer el barrido de los 8 displays
int muestra_digito[9]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Selecciona el display a visualizar
// tabla de salidas de excitacion de siete segmentos
// Cambiar la tabla segun se vaya a usar uno u otro tipo de display
//(0,1,2,3,4,5,6,7,8,9,Punto,E.)
// int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 7seg hex 0-9 catodo comun
int tab7seg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98,0x7f}; // 7seg hex 0-9 anodo comun
// en funcion del numero de decimales que queremos visualizar lo va a convertir
// en entero y para no perder la parte decimal lo multiplica antes por el valor
// correspondiente
if(numero_de_decimales ==1)
f1=f*10;
if(numero_de_decimales ==2)
f1=f*100;
if(numero_de_decimales ==3)
f1=f*1000;
if(numero_de_decimales ==4)
f1=f*10000;
if(numero_de_decimales ==5)
f1=f*100000;
if(numero_de_decimales ==6)
f1=f*1000000;
if(numero_de_decimales ==7)
f1=f*10000000;
// redondea por arriba el float una vez multiplicado
x=ceil(f1);
// Si el tamaño del numero a visualizar excede de la longitud del display visualiza E.
// pasa el entero a cadena
itoa(x,10,cadena);
// calcula la longitud de la cadena
n=strlen(cadena);
// Pasa cada cada caracter del número a entero, empleando punteros:
*cadena7=cadena[7]; // Unidades
*cadena6=cadena[6]; // Decenas
*cadena5=cadena[5]; // Centenas
*cadena4=cadena[4]; //.....
*cadena3=cadena[3];
*cadena2=cadena[2];
*cadena1=cadena[1];
*cadena0=cadena[0];
// si excede el numero de digitos del visualizador dibuja una E. en este
if(n>numero_total_digitos)
{
output_b(tab7seg[10]); // Visualiza E. en el display si se produce saturacion y sale de la rutina
output_d(muestra_digito[0]);
delay_ms(tiempo);
return;
}
// Si el valor es menor que 1, para que visualice el cero anterior y los posteriores a la coma
if(f<1)
{
// Visualiza 0. en el display en su lugar correspondiente
output_b(tab7seg[0]);
output_d(muestra_digito[numero_de_decimales]);
delay_ms(tiempo);
// Visualiza tantos ceros como sean necesarios en el display en su
// lugar correspondiente despues de la coma
for(c=numero_total_digitos-n;c>n;c--)
{
output_b(tab7seg[0]);
output_d(muestra_digito[c-1]);
delay_ms(tiempo);
}
}
// coloca el punto decimal en su lugar
output_b(0x7f);
output_d(muestra_digito[numero_de_decimales]);
delay_ms(tiempo);
// las siguientes lineas ponen cada caracter en la salida
// y activan el display correspondiente
output_b(tab7seg[atoi(cadena0)]);
output_d(muestra_digito[n-1]);
delay_ms(tiempo);
if (n==0)
return;
output_b(tab7seg[atoi(cadena1)]);
output_d(muestra_digito[n-2]);
delay_ms(tiempo);
if (n==1)
return;
output_b(tab7seg[atoi(cadena2)]);
output_d(muestra_digito[n-3]);
delay_ms(tiempo);
if (n==2)
return;
output_b(tab7seg[atoi(cadena3)]);
output_d(muestra_digito[n-4]);
delay_ms(tiempo);
if (n==3)
return;
output_b(tab7seg[atoi(cadena4)]);
output_d(muestra_digito[n-5]);
delay_ms(tiempo);
if (n==4)
return;
output_b(tab7seg[atoi(cadena5)]); // Centenas
output_d(muestra_digito[n-6]);
delay_ms(tiempo);
if (n==5)
return;
output_b(tab7seg[atoi(cadena6)]); //Decenas
output_d(muestra_digito[n-7]);
delay_ms(tiempo);
if (n==6)
return;
output_b(tab7seg[atoi(cadena7)]); //Unidades
output_d(muestra_digito[n-8]);
delay_ms(tiempo);
if (n==7)
return;
}
float y=0;
// rutina de interrupcion por desbordamiento
#int_RTCC
pulse()
{
visualizar_display(y,6,3);
set_rtcc(256);
}
// Programa Principal
main()
{
setup_counters(RTCC_INTERNAL, RTCC_DIV_8);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_rtcc(256);
set_tris_b(0x00);
set_tris_d(0x00);
// necesario inicializar las salidas para que en el primer barrido no salgan caracteres raros
output_b(0x00);
output_d(0x00);
// ejemplo de funcionamiento
do{
y=0;
delay_ms(5000);
y=14.023;
delay_ms(5000);
y=104.23;
delay_ms(5000);
y=104.3;
delay_ms(5000);
for(y=0;y<10;y=y+0.005)
delay_ms(100);
for(y=0;y<50;y=y+1)
delay_ms(100);
for(y=0;y<500;y=y+10)
delay_ms(100);
for(y=0;y<9999;y=y+100)
delay_ms(100);
}while(1);
}
--------------------------------------------------------------------------------
Codigo:
for(c=numero_total_digitos-n;c>n;c--)
{
output_b(tab7seg[0]);
output_d(muestra_digito[c-1]);
delay_ms(tiempo);
}
Escrito originalmente por Algec
Como parece que hay problemas con el proteus para depurar la rutina totalmente usare un equipo real, asi que tardare un poco ya que voy a hacer la placa de los displays.
Ya comentare como va y el resultado final por si le interesara a alguien.
Codigo:
////////////////////////////////////////////////////////////////////////
// Rutina de visualizacion de Float en displays de 7 seg
// Funciona con una maximo de 8 displays de anodo comun
// Representa Floats por lo que el numero de decimales no puede ser inferior a uno
//
// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
//
// se conecta los pines RD mediante un transistor BC557 y una resistencia de base
// ya que la corriente total de los 7 seg supera la capacidad de salida de la RD del pic
//
// · RC0 -> a 7seg
// · RC1 -> b 7seg
// · RC2 -> c 7seg
// · RC3 -> d 7seg
// · RC4 -> e 7seg
// · RC5 -> f 7seg
// · RC6 -> g 7seg
// · RC7 -> Punto 7seg
//
// Se conectan las salidas RC al display a traves de una resistencia de un valor adecuado a la corriente
// exijida por el display para su correcto encendido
// Puede ser un valor aproximado entre 10 mAmp y 20 mAmp
// por lo que la resistencia debe ser de entre 100 y 330 Ohmios aproximadamente
//////////////////////////////////////////////////////////////////////
#include <16f877.h>
#include <stdlib.h>
#include <math.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=4000000)
#USE FAST_IO (C)
#USE FAST_IO (D)
// para hacer el barrido de los 8 displays
int muestra_digito[9]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; // Selecciona el display a visualizar
// tabla de salidas de excitacion de siete segmentos
// digitos a mostrar (0,1,2,3,4,5,6,7,8,9,Punto,E)
int tab7seg[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98,0x7f,0x86}; // 7seg hex 0-9 anodo comun
// ajuste del tiempo que se queda encendido cada diodo de el display
// con este ajuste y el valor de tiempo de la interrupcion se quita el parpadeo
int tiempo =2;
visualizar_display(float f, int numero_total_digitos, int numero_de_decimales)
{
int32 x=0;
float f1;
int n=0;
int ceros=0;
char cadena[10];
char cadena8[4];
char cadena7[4];
char cadena6[4];
char cadena5[4];
char cadena4[4];
char cadena3[4];
char cadena2[4];
char cadena1[4];
char cadena0[4];
// en funcion del numero de decimales que queremos visualizar lo va a convertir
// en entero y para no perder la parte decimal lo multiplica antes por el valor
// correspondiente
if(numero_de_decimales ==1)
f1=f*10;
if(numero_de_decimales ==2)
f1=f*100;
if(numero_de_decimales ==3)
f1=f*1000;
if(numero_de_decimales ==4)
f1=f*10000;
if(numero_de_decimales ==5)
f1=f*100000;
if(numero_de_decimales ==6)
f1=f*1000000;
if(numero_de_decimales ==7)
f1=f*10000000;
// redondea por arriba el float una vez multiplicado
x=ceil(f1);
// pasa el entero a cadena
itoa(x,10,cadena);
// calcula la longitud de la cadena
n=strlen(cadena);
// Pasa cada cada caracter del número a entero, empleando punteros:
*cadena7=cadena[7]; // Unidades
*cadena6=cadena[6]; // Decenas
*cadena5=cadena[5]; // Centenas
*cadena4=cadena[4]; //.....
*cadena3=cadena[3];
*cadena2=cadena[2];
*cadena1=cadena[1];
*cadena0=cadena[0];
// si excede el numero de digitos del visualizador lo señaliza con E
if(n > numero_total_digitos)
{
output_c(tab7seg[11]); // Visualiza E en el display si se produce saturacion y sale de la rutina
output_d(muestra_digito[0]);
delay_ms(tiempo);
output_c(0xff);
return;
}
// muestra el punto decimal
if(numero_de_decimales > 0)
{
output_c(tab7seg[10]);
output_d(muestra_digito[numero_de_decimales]);
delay_ms(tiempo);
output_c(0xff);
}
// Si el valor es menor que 1, para que visualice el cero anterior a la coma
// y los posteriores
ceros = numero_de_decimales - n + 1;
/* truco para ver valor de variables
output_c(tab7seg[ceros]);
output_d(muestra_digito[7]); // se muestra en el ultimo digito
delay_ms(tiempo);
output_c(0xff);*/
if(ceros > 0 && f <1)
{
do{
output_c(tab7seg[0]);
output_d(muestra_digito[numero_de_decimales-ceros+1]); // posicion del cero anterior al punto
delay_ms(tiempo);
ceros--;
output_c(0xff);
}While(ceros != 0);
}
// las siguientes lineas ponen cada caracter en la salida
// y activan el display correspondiente
output_c(tab7seg[atoi(cadena0)]);
output_d(muestra_digito[n-1]); // digito de menor peso
delay_ms(tiempo);
output_c(0xff);
If(n==1)
return;
output_c(tab7seg[atoi(cadena1)]);
output_d(muestra_digito[n-2]);
delay_ms(tiempo);
output_c(0xff);
If(n==2)
return;
output_c(tab7seg[atoi(cadena2)]);
output_d(muestra_digito[n-3]);
delay_ms(tiempo);
output_c(0xff);
If(n==3)
return;
output_c(tab7seg[atoi(cadena3)]);
output_d(muestra_digito[n-4]);
delay_ms(tiempo);
output_c(0xff);
If(n==4)
return;
output_c(tab7seg[atoi(cadena4)]);
output_d(muestra_digito[n-5]);
delay_ms(tiempo);
output_c(0xff);
If(n==5)
return;
output_c(tab7seg[atoi(cadena5)]);
output_d(muestra_digito[n-6]);
delay_ms(tiempo);
output_c(0xff);
If(n==6)
return;
output_c(tab7seg[atoi(cadena6)]);
output_d(muestra_digito[n-7]);
delay_ms(tiempo);
output_c(0xff);
If(n==7)
return;
output_c(tab7seg[atoi(cadena7)]);
output_d(muestra_digito[n-8]);
delay_ms(tiempo);
output_c(0xff);
}
float y=0;
// rutina de interrupcion por desbordamiento
#int_RTCC
pulse()
{
visualizar_display(y,5,2);
set_rtcc(256);
}
// Programa Principal
main()
{
setup_counters(RTCC_INTERNAL, 0);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_rtcc(256);
set_tris_c(0x00);
set_tris_d(0x00);
// ejemplo de funcionamiento
y=0;
do{
y=y+0.1;
// para hacer pruebas considero que es el tiempo de ejecucion
// del programa de uso es de 10 mseg
// y simulo el programa asi
delay_ms(10);
}while(1);
}
Codigo:
*cadena5=cadena[5];
Codigo:
output_b(tab7seg[atoi(cadena5)]);
Codigo:
output_b(tab7seg[atoi(&cadena[5])]);
Hola, colegas! ¿Hay alguna manera de que se puedan mostrar los ceros a la izquierda? Hago esto, pero en el LCD no los muestra.