Ya funciona con 1 caracter nada mas, ademas de hacerle algun arreglillo mas:
Te pego el 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 <16f877.h>
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT
#use fast_io(B)
#use fast_io(D)
#use delay (clock=40000000)
visualizar_display(int32 x)
{
int n=0;
int tiempo =1;
char cadena[11];
char cadena8[2];
char cadena7[2];
char cadena6[2];
char cadena5[2];
char cadena4[2];
char cadena3[2];
char cadena2[2];
char cadena1[2];
char cadena0[2];
// tabla de salidas de excitacion de siete segmentos
// para hacer el barrido de los 8 displays
int muestra_digito[9]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Seleccion del display a visualizar
// 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
// pasa el entero a cadena
itoa(x,10,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];
// pone el caracter en la salida
// activa 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, este se tiene que imprimir el primero para que no salga 7 al empezar ¿?
output_d(muestra_digito[n-8]);
delay_ms(tiempo);
if (n==7)
return;
}
int32 y=0;
#int_RTCC
pulse()
{
visualizar_display(y);
visualizar_display(y);
visualizar_display(y);
set_rtcc(220);
}
main()
{
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_rtcc(220);
set_tris_b(0x00);
set_tris_d(0x00);
// ejemplo de funcionamiento
delay_ms(100);
y++;
delay_ms(100);
y++;
delay_ms(100);
y=y+2;
delay_ms(100);
y=y+2;
delay_ms(100);
y=y+23;
do{
y=y+33;
delay_ms(100);
}while(1);
}
De todas formas veras que lo hice funcionar por interrupcion asi el display se refresca cada cierto tiempo independientemente del programa.
Otra cuestion es que la primera vez que se ejecuta la rutina dibuija un 7
¿¿¿¿¿??????? no tengo ni P I del porque
Tambien me dan problemas el tamaño de las cadenas y no encuentro la forma de eliminar las intermedias con redireccionamiento de punteros tipo &cadena o algo asi
No me gusta usar muchas variables
UNa cosa mas, el siguiente paso es FLOATS que es lo que realmente queria yo hacer, asi que seguire y si me ayudas te estare muy agradecido
Sigo en lo mismo, si necesitas tu algo no dudes en decirlo