Eso te vas a enfrentar en todos los lenguajes de alto nivel, es la abstraccion que tenes.
Por eso mismo yo prefiero XC8 , por que XC8 tiene una forma mas parecida al ASM, es decir tenes que modificar registro por registro para configurar algo. y es en C.
Pero tampoco puedo negar la facilidad del CCS, en el que con una linea ya definis una UART por HW o SOft y la tenes lista para trabajar, al igual que enviar caracteres, mientras que en XC8 tenes que construir tus funciones. Pero al menos sabse que son tuyas y sabes lo que hacen, si usas ASM y estas acostumbrado no creo que tengas problemas de hacerlas.