Luego de mirar un poquito mas el codigo, no veo el por que no te pueden funcionar ambos. Lo que si tenes un "orden" para enviar las cosas.
RS232_EsperaBitStart
btfsc RS232_Entrada ; Lee la entrada y espera a que sea "0".
goto RS232_EsperaBitStart ; No, pues espera el nivel bajo.
Ya que eso se queda para siempre alli esperando que la entrada se ponga en 0, primero tenes que enviar al PORTD,0 un byte,finalizado ese byte es el turno del PORTC,0 el cual recibira otro byte entero y volver al PORTD,0 , mientras este uno esperando el dato el otro no va a funcionar jamas.
Intentaria quitar lo de enviar datos por ahora, y dejar las salidas con leds para saber cuando es que se activa o no.
Otro tema
Otra cosa mas que no le preste atencion es tu programa, por que dijiste que independientemente funcionaban, entonces no le preste atencion, pero ahora si:
movlw 7
movwf CMCON ; CMCON=7 inhibir los comparadores
eso es del banco1 y lo estas haciendo al comienzo apuntando al banco 0.
Aunque funciona vos no estas modificando los PORTx sino los TRISx, por suerte MCHP los puso en el mismo lugar si tomas los 8bits mas bajos:
bsf STATUS,RP0 ; Ir banco 1
movlw b'00000000' ; valor portA
movwf PORTA
movlw b'00000000' ; valor portB 0 SALIDA---1 ENTRADA
movwf PORTB
movlw b'00000001' ; valor portC
movwf PORTC
movlw b'00000001' ; valor portD
movwf PORTD
movlw b'00000000' ; valor portE
movwf PORTE
Por
bsf STATUS,RP0 ; Ir banco 1
movlw b'00000000' ; valor portA
movwf TRISA
movlw b'00000000' ; valor portB 0 SALIDA---1 ENTRADA
movwf TRISB
movlw b'00000001' ; valor portC
movwf TRISC
movlw b'00000001' ; valor portD
movwf TRISD
movlw b'00000000' ; valor portE
movwf TRISE
Aunque funciona es un concepto equivocado.