El codigo esta bien, y si te das cuenta cual es el error vas a pegar cabezasos en la mesa

Hay algo que te tenes que acostumbrar.
Cada modulo/programa/etc podes pensarlo como una cajita que tiene sus "entradas" y "salidas"
Ejemplo si hago un programita que me convierte de binario a BCD de 2 digitos, le paso el dato por W y me lo devuelve tambien por W.
Entonces
Entrada: W
Salida: W
Ejemplo una subrutina que encienda y apague una salida RB0, dependiendo de la entrada RB1
Entrada: RB1
Salida: RB0
Dependiendo de mi entrada va a responder mi codigo y me va a dar una salida.
-------------------------------------------------
Volviendo a algo mas parecido a lo tuyo
Por ejemplo el modulo del timer posee como entradas:
El/Los registros de configuracion del Timer (entrada)
T1CON
El/Los registros que mantienen el valor (entrada)
TMR1H:TMR1L
De acuerdo a como esten estas "entradas" el modulo va a funcionar de una u otra forma. ( Va a tomar clocks 1 de cada 4 clocks, o 1 de cada 8, tomo elvalor del reloj interno o externo, etc )
Y como salida puede ser un pin, o un flag. supongamos que nomas tenes el flag:
PIR1,TMR1IF
El hardware del timer cuando ocurre un overflow pone a uno ese flag. Pero esto lo hace el modulo.
Separa por un momento mentalmente el Nucleo del PIC (el que ejecuta las instruccion, esta a la espera de las interrupcion, es el que lleva el Contador de programa) y cada modulo (Como si fueran 2 cajitas, cada uno con su entradas y salidas). Es decir tenes el nucleo por un lado y el modulo por el otro. Como le dice el modulo este que debe entrar a una interrupcion al Nucleo? Lo hace con esa bandera.
Pero si fuera solo eso cada ves que pongo a funcionar un modulo y cada ves que se cumple la condicion de la bandera de ese modulo se va a poner a 1. y por ende va a entrar a la interrupcion.
Ejemplo interrumpiria por que hubo un pulso ascendente en RB0 (yo no lo active, pero la bandera se pone a 1 igual)
o un cambio en RB4:RB7
O el timer0 que no se puede parar, cada ves que se produce el overflow estaria entrando a la interrupcion por que se pone a 1 la bandera, ya que es esa la funcion de ese modulo.
ETC.
Yo necesito un control de cuales banderas quiero que pasen a mi Nucleo.
(Si no te diste cuenta aca en un rato te vas a dar cuenta)
(Si no te diste cuenta)Solucion: No habilitaste las interrupciones en INTCON (globales GIE y de perifericos PEIE) y PIE1.CCP1IE (del periferico CCP1 y en ves de terminar IF, interrupt flag, termina en IE, interrupt enable )
(te dije que te ibas a dar cuenta en un "rato")
Activalos luego de configurar el timer y el CCP1, previamente antes de activarlo borra el flag del CCP1 por las dudas que este en alto, es solo una precaucion.
Por que te lo explico de esta manera? Por que me sucedio algo cuando empeze a trabajar con un ARM en el que hacer funcionar una interrupcion no es lo mismo que aca que es poner 2 bits a 1, sino que cada modulo tiene SU habilitacion, como 3/4 registros solo para la interrupcion xD y luego el nucleo tambien tiene su habilitacion!! . Al igual que los micros PIC32 con nucleo MIPS en el que el nucleo es de un fabricante y lo que hacen microchip es ponerle los perifericos, si tenes una imagen clara que el nucleo esta separado fisicamente del modulo es mas facil de entenderlo, son como 2 circuitos totalmente independientes uno de otro y que se deben comunicar entre ellos con esas señales, en nuestro caso son las flags