La solución que propone Potcher para la interrupción de cambio de estado en [RB4;RB7] no es del 100% correcta en mi opinión.
Deberíamos intentar no recurrir al ASM dentro del compilador, debido a que movf port_b,0 es una instrucción que depende de la página actual donde se encuentre actualmente trabajando el programa. Si por algún motivo el programa está en otra página, podemos leer en lugar del PORTB el TRISB u otro dependiendo del uC en cuestión, fracasando en ese caso en la intención original de refrescar el latch interno del PORTB asociado a dicha interrupción.
Podríamos entonces, antes de hacer el movf, forzar el código al banco 0, pero si bien sirve para efectuar correctamente el movf, entramos ahora con un potencial problema, debido a que le hemos cambiado el banco al CCS, quien seguramente no contemple ésto, y cuando continúe con su código compilado puede afectar a las variables incorrectas debido al cambio de banco no contemplado por él. Entonces, completamente seguro sería guardar el banco que está usando el CCS en una variable auxiliar, pasar al banco0, leer el puerto y restaurar el banco antes de devolverle el control al compilador...
Personalmente yo uso:
input_b();
y el mirando el código ensamblado hace precisamente éso. Lee el PORTB.
Un saludo.