ok.pues aqui te dejo tambien un trozo de codigo de un programa que realize para un 16f84.creo que no hay ningun problema para ese pic.en todo caso igual puedes optimizar algo mas el codigo.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>
ENVIO bsf PORTB,1 ;establecer la salida a 1(evitar errores primer caracter)
ENVIO2 clrf CONTADOR ;borra el registro CONTADOR de bits
bcf PORTB,1 ;bit START
call RETARDO
ENV_1 btfsc DATO,0 ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
call UNOS ;salta a UNOS si el bit leido es 1
btfss DATO,0 ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
call CEROS ;salta a CEROS si el bit leido es 0
ENV_2 rrf DATO,F ;rota a la derecha el registro DATO
incf CONTADOR,F ;incrementa CONTADOR (registro contador de bits)
movlw 0x08 ;valor de bits a leer
xorwf CONTADOR,W ;comprueva si son 8
btfss STATUS,Z ;si no es 8 repite la comprovacion del siguiente bit
goto ENV_1 ;comprueva de nuevo
bsf PORTB,1 ;establecer a 1 la salida
return ;retorna
UNOS bsf PORTB,1 ;saca valor 1 por pin 1 de PORTB
call RETARDO ;tiempo de un bit
return ;retorna
CEROS bcf PORTB,1 ;saca valor 0 por pin 1 de PORTB
call RETARDO ;tiempo de un bit
return ;retorna