no te seria mejor ocupar un pic mas pequeñito como el 16f84a? tiene pines suficientes para controlar el 7447, los displays, y los botones, el compilador que yo uso es CCS, y de hecho tengo una libreria para controlar 4 displays con un solo puerto, debo modificarla un poquito porque enviaba los datos el 7447 y luego a un flipflop d, para no tener que refrescar tan seguido si el numero no cambiaba.
cabe destacar que saque varias cosas de esta libreria ya que como mencione anteriormente, usaba flipflop's para mantener el valor del display.
// definimos los pines de activacion de los display de siete segmentos
#ifndef DSP_1
#define DSP_1 PIN_B4
#endif
#ifndef DSP_2
#define DSP_2 PIN_B5
#endif
#ifndef DSP_3
#define DSP_3 PIN_B6
#endif
#ifndef DSP_4
#define DSP_4 PIN_B7
#endif
// definimos funciones recortadas
#define ACT output_high
#define DES output_low
// envia los 7 bits del display
void dsp_putc(BYTE a, BYTE d){
output_b(d);
if(a==0){ACT(DSP_1);}
if(a==1){ACT(DSP_2);}
if(a==2){ACT(DSP_3);}
if(a==3){ACT(DSP_4);}
delay_us(10);
DES(DSP_1);
DES(DSP_2);
DES(DSP_3);
DES(DSP_4);
}
eso saca el numero binario, y la activacion de los displays, por el puerto b. B0-3=numero binario, B4-7=displays, esto lo puedes portar al c de mplab, no creo que sea muy dificil, espero te sirva esta ayuda,
para los consejos que pides, para los botones, puedes usar un flag, que se compruebe cada vez que presionas un boton
para que el display titile, puedes usar un 555, o puedes hacer el pic envie no todas las veces en numero al display, me explico?, imagine en tu mente un lapso de tiempo aleatorio, ahi va un tren de pulsos, el cual le dice al display, que el dato que hay en los pines compartidos, es de el, entonces, en ves de enviar todos esos pulsos, suprimes la mitad, de 50 pulsos, envias 25, y 25 los suprimes, de 5 en 5, para que se cree el efecto que deseas, ahi ya puedes ir probando cual te genera un mejor efecto,
respecto a los displays en el proteus, es normal que se note el cambio, en la vida real no se nota ese efecto, pero tienes que reducir ese delay, a unos 500 us, ya que 20ms es mucho, bueno eso basicamente puedo aportar,
Saludos! y suerte!