Hola a todos, estoy en periodo de aprendizaje de MikroC, estudiándolo en el libro “DISEÑO Y SIMULACIÓN DE SISTEMAS MICROCONTROLADOS EN LENGUAJE C” de Juan Ricardo Clavijo Mendoza, he realizado el contador de 0 a 9999, con un display dinámico de 7 segmentos, con 4 dígitos, prácticamente como está en el libro, solo que en vez del PIC 16F84A, lo hago con el 16F887 y cambio el puerto que alimenta, los pines a, b, c, d, e, f, g del puerto B como el libro, al puerto C y para los cuatro cátodos del display uso el puerto A (RA0, RA1, RA2 y RA3) mediante inversores 7404 o transistores 2N2222 como se indica en el libro mencionado. compilo el programa sin ningún problema y al simularlo en Proteus, si utilizo inversores, se muestran el conteo adecuadamente, pero no ocurre lo mismo, si empleo los transistores mencionados y tampoco si empleo el ULN2803 (arreglo con Darlington), al cual modifique agregándole el pin 9 GND, pues si lo hago sin esto como viene originalmente en Proteus, no se muestra nada, ojalá alguno de ustedes, me pueda indicar mi error o cual es el problema y como solucionarlo, mil gracias de antemano por su ayuda y saludos para todos, les anexo el código.
********************************************************************************
Código:
//Declara las constantes para el display.
const unsigned short DIGITOS[] =
{
0x3F,//Código del dígito 0
0x06,//Código del dígito 1
0x5B,//Código del dígito 2
0x4F,//Código del dígito 3
0x66,//Código del dígito 4
0x6D,//Código del dígito 5
0x7D,//Código del dígito 6
0x07,//Código del dígito 7
0x7F,//Código del dígito 8
0x6F //Código del dígito 9
};
//Función para visualizar el display dinámico
void VerDisplay(int Numero)
{
unsigned short U;//Variable para guardar las unidades
unsigned short D;//Variable para guardar las decenas
unsigned short C;//Variable para guardar las centenas
unsigned short UM;// Variable para guardar las unidades de mil
UM = Numero/1000; //Cálculo de las unidades de mil
C = (Numero-UM*1000)/100; //Cálculo de las centenas
D = (Numero-UM*1000-C*100)/10; //Cálculo de las decenas
U = (Numero-UM*1000-C*100-D*10); //Cálculo de las unidades
PORTC = DIGITOS; // Visualiza las unidades
PORTA.F0 = 1; // Activa en alto el primer display
delay_ms(10); //Retardo de 10 milisegundos
PORTA = 0; //Desactiva todos los displays
PORTC = DIGITOS[D]; // Visualiza las decenas
PORTA.F1 = 1; // Activa en alto el segundo display
delay_ms(10); //Retardo de 10 milisegundos
PORTA = 0; //Desactiva todos los displays
PORTC = DIGITOS[C]; // Visualiza las centenas
PORTA.F2 = 1; // Activa en alto el tercer display
delay_ms(10); //Retardo de 10 milisegundos
PORTA = 0; //Desactiva todos los displays
PORTC = DIGITOS[UM]; // Visualiza las unidades de
PORTA.F3 = 1; // Activa en alto el cuarto display
delay_ms(10); //Retardo de 10 milisegundos
PORTA = 0; //Desactiva todos los displays
}
void main(void)
{
unsigned short N = 0;//Variable de contéo
int Numero = 0;
TRISC = 0; //Configura el puerto C como salida
TRISA = 0; //Configura el puerto A como salida
PORTA = 0; //Se desactivan todos los displays
while(1) //Bucle infinito
{
//Se visualiza el valor de Número.
VerDisplay(Numero);//Esta función dura aproximadamente 40 milisegundos
//Se cuentan 12 incrementos en N para hacer un incremento en NÚMERO
//aproximadamente cada 500 milisegundos.
N++;
if (N==12)
{
N = 0; //Se reinicia el cont{eo de N.
Numero++; //Se incrementa el valor de N{umero.
if (Numero==10000) //Se evalúa si Numero vale 10000
Numero = 0; // y se reinicia en 0 si es 10000.
}
}
}