Bueno veo algunos errores. Y otras cosas que te va a servir.
Errores:
1- La muestra de cada digito se hace MUY MUY MUY rapido, cada numero, es decir 00 -> 01 -> 02 se debe estar realizando cada unos 71ms, solucion simple pero no muy linda es agregarle un for
2- Estas multiplexando mal, no estas apagando los displays
3- Aunque no es un error, si vas a mostrar en el puerto la misma representacion binaria de lo que esta, no es necesario el conversor BCD7Seg que tenes, ya que un 9 en binario es 1001 y es lo que va a salir del puerto, distinto es si tenes que convertir el binario ese en los 7 segmentos, es decir que por ejemplo el 8 ( 0x08 o 0000 1000) sea representado por ( 0111 1111 ) en el que cada bit es un segmento pero vos estas sacando un 1000 asi que no es necesario.
4- Tenes un error en tu logica, si necesitas contar hasta 63 lo mismo ocupas solo 4bits, ya que ese 63 se pasa a "decimal" y queda 6 y 3, es decir solo necesitas representar de 0 a 9 y por lo tanto solo basta 4 bits
Consejos:
1- Utiliza un identado, es decir utiliza el boton TAB (el que esta arriba del bloq mayuscula) para ubicar el codigo, se vuelve mas legible de esa forma. Ya vas a ver el ejemplo abajo
Y con respecto a que te cambia los bits eso es por que estas cambiando TODO el port.
Para cambiar solo un pedacito del port deberias leerlo y luego cambiar lo que quieras, ejemplo
valorport = input_c();
valorport &= 0b11110000); // aca hago valorport AND 0xF0 , lo que me deja los bits 7,6,5,4 sin modificarse, por que no se usan, luego le tengo que agregar lo del BCD7seg
output_c(valorport | BCD7seg[dec]);
Otra cosa que por ahi molesta del CCS es que por ejemplo vos queres que el bit 6 y 7 sean entradas y no salidas. Si vos haces
output_c(0x0F);
CCS las va a poner a TODAS como salida.
Esto es un tema que no me gusta de CCS pero que se puede arreglar. Si se usa la directiva:
#use fast_io(c)
Y luego en el main hacemos:
set_tris_c(0xF0); // 1111 0000 , es decir de 0 a 3 como salidas y de 4 a 7 como entradas.
La proxima ves que hagas:
output_c(0xFF);
Vas a modificar UNICAMENTE las salidas (es decir bits 0 a 3), esto es por que CCS comienza con todos los puerto donde lo define como standard_io , eso hace que CADA ves que vos pongas algo en el puerto (lectura o escritura), ya sea que le digas a un bit o a todo el puerto, se agregue codigo para cambiar la direccion del pin
input_pin(PIN_A0); // Aca lo pone como entrada
output_pin(PIN_A0); // Aca lo pone como salida , a pesar que antes lo use como entrada antes. Y podria hacer un hermoso cortocircuito al pasar de una alta impedancia a GND cuando tal ves en la entrada tengo VCC, Y requiere atencion.
Como dije esto NO ocurre si usas fast_io, ya que ahi no modifica mas los TRISx , tris que definiste al comienzo de tu programa. Ademas el fast_io al no agregar codigo y solo modificar el registro que necesita se termina ejecutando mas rapido.
Aca tenes un ejemplo y tal ves el codigo que necesitas, no se que tan bien ande, y a esto me refiero con "identado"
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use fast_io(c)
#USE delay(clock=4m)
void main(){
set_tris_C(0b11000000); //Ejemplo de como es el TRIS de un puerto, deje unicamente como entrada bit 6 y 7
int8 j; // Por lo tanto no va a cambiar cuando uses output_c , aunque solo usas los bits de 0 a 3, por lo que podria haber puesto 0xF0 en el TRIS
int unit=0, dec=0, unidaz=0, valor;
while(TRUE)
{
valor=input_b();
if (valor<100)
{
valor++;
for (unit=0;valor>unit;unit++)
{
dec=valor/10; //Como dec es un entero, se va a guardar unicamente el entero
unidaz= valor%10; //El resto de la division de 10
for(j=0;j<10;j++) // For para que tarde un poco mas de tiempo
{
output_low(PIN_d0); // Apago ANTES del cambio del puerto, asi se cambia cuando esta apagado
output_low(PIN_d1);
output_c(dec); // Como valor esta limitado a 99 , si divido por 10 solo me queda un maximo de 9, es decir va de 0 a 9 (0x00 a 0x09)
output_high(PIN_d1);
delay_ms(50);
output_low(PIN_d1); // Apago ANTES del cambio del puerto
output_c(unidaz); // El modulo de 10, me deja con el resto de la division, es decir las unidades, por lo tanto va de 0 a 9
output_high(PIN_d0);
delay_ms(49);
}
}
}
else
{
output_high(PIN_d0); // Mayor a 100, por lo tanto pones 00 en ambos, como ambos son iguales no es necesario la multiplexacion
output_high(PIN_d1);
output_c(0b0000);
delay_ms(5);
}
}
}