Tenho 3 displays de 7 segmentos, eles estão multiplexados, mas demoram cerca de 20 segundos para trocar de um display para o outro, mas quando coloco um resistor de 10Mohm entre os terminais do cristal (4MHz), aumenta a velocidade, mas ainda fica muito lento, caso eu coloque junto ao resistor, meus dedos nos terminais do cristal, a velocidade fica perfeita, ou seja, nem parece que é multiplexado.
Percebi também que a uma variação repentina de velocidade, acredito que o cristal não esteja oscilando constantemente.
Já aterrei a carcaça do cristal mas não ouve diferença na velocidade de multiplexagem.
Tentei aumentar a velocidade para microsegundos mas não ficou legal.
Por favor, preciso de ajuda.
O programa que fiz está abaixo.
#include <16F877a.h>
#device ADC=10
#use delay(clock=4000000)
#fuses NOCPD,NOWDT,BROWNOUT,PUT,XT,NOWRT,NOLVP,NODEBUG,NOPROTECT //0x3F71
//****************************************************************
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#DEFINE Q1 PIN_D1 // transistor 1
#DEFINE Q2 PIN_D0 // transistor 2
#DEFINE Q3 PIN_E2 // transistor 3
#DEFINE punto PIN_E1 // punto decimal
#BYTE salida=7
//****************************************************************
struct digitos_separados // variables en bcd de unidad,decena,centena
{ int unidad, decena, centena;
}
digito;
//****************************************************************
void separar_digitos() // separa resultado en unidad, decena y centena
{ digito.unidad=3;
digito.decena=2;
digito.centena=1;
}
//****************************************************************
void mostrar()
{ int const bcd_7seg[10]= {0x6f,0x05,0x7c,0x3d,0x17,0x3b,0x7b,0x0d,0x7f,0x3f};
int contador;
output_low(Q1);
output_low(Q2);
output_low(Q3);
output_low(punto);
for(contador=0;contador<11000;contador++)
{ salida=bcd_7seg[digito.unidad];
output_high(Q1);
delay_us(500);
output_low(Q1);
delay_cycles(4);
salida=bcd_7seg[digito.decena];
output_high(Q2);
output_high(punto);
delay_us(500);
output_low(Q2);
output_low(punto);
delay_cycles(4);
salida=bcd_7seg[digito.centena];
output_high(Q3);
delay_us(500);
output_low(Q3);
delay_cycles(4);
}
}
void main()
{ set_tris_b(0x0); // puertob=entrada
set_tris_c(0x0); // puertoc=salida
set_tris_d(0x0);
set_tris_e(0x0);
separar_digitos();
mostrar();
}