Vos estas programando en C y no te pregunté con cual compilador. Yo hice poco en Pic y en Assembler allá por el 2002 y hace años que no hago nada, así que no me acuerdo mucho...
Por el tema de los Timers 555 en si, estos generan una buena onda cuadrada a su salida así que no precisarían ningún tipo de antirrebote (esto se usa en botones mecánicos porque los contactos SI rebotan a nivel microscopico).
Se supone que los pulsos llegan al Pic con la amplitud requerida de 5V, no sea que estés tomando señal entre una resistencia y un led y esté llagado 3 voltios y el Pic no pueda distinguir si es pulso alto o bajo. También puede que haya interferencia de algún tipo, une bien las masas de todos los integrados y setea como salida TODOS los pines que NO USES para que no actúen como antenas que puedan corromper los registros internos.
Ese tipo de entradas normalmente se resuelve mejor por interrupciones, creo que se podía configurar el puerto B4 a B7 para que atiendan interrupciones
https://www.teachmemicro.com/pic-interrupt-pic16f84a/ fijate en "RB Change" de esta manera cuando hay un cambio de flanco, o sea el pulso sube o baja se genera una interrupción que la resolves rápidamente en un código corto. No se como se maneja eso en tu compilador.
El problema que veo al hacer Pooling es que mientras un timer tiene un pulso alto te quedas dando vuelta en el while y no atiendes lo que ha pasado con el otro timer.
Por ejemplo mientras el timer 1 estuvo con el pulso alto, estuviste dentro del while y tal vez no viste 10 pulsos que ocurrieron en el timer 2. Este es el tipo de problemas que ocurren con el pooling, es la razón por la cual si tienes un boton apretado y aprietas otro no lo reconoce es como que el pic se cuelga mientras tengas apretado uno de los botones.
En el caso de hacerlo con interrupciones la idea básica es que si hubo un cambio (subió o bajó el pulso) en alguno de los pines B4 a B7 se llama a interrupción, sospecho que el código quedaría algo así (solo la idea no es código funcional):
En el programa principal tenes que tener guardado el estado del pin.
(variables ValB4, ValB5, etc)
Rutina ISR {
//Revisas uno por uno en cual de los pines hubo cambio (ves el valor almacenado de B4 contra inputB4) y ves que hacer si discrepa, si hubo cambio almaceno el nuevo valor y veo si el nuevo valor es 0 (flanco descendente) entonces aumento el contador.
If input(PIN_B4) != ValB4) { ValB4=Input(PIN_B4); If ValB4==0 {ContadorB4 ++;} ;}
If input(PIN_B5) != ValB5) { ValB5=Input(PIN_B5); If ValB5==0 {ContadorB5 ++;} ;}
}//cerras la rutina así el programa continua.
Como te dije no se que compilador usas, estoy re-oxidado al respecto y no tengo forma alguna de probar nada de esto, así que solo te tiro un par de ideas. Espero te sirvan.
Saludos