Como te habia indicado en el mensaje anterior NO FUNCIONA, porque de Teclado no vuelve con RETURN, esto te dara problemas ya que lo llamas con un CALL y despues retornas con GOTO.
El problema del 50% creo que se soluciona asi, pruebalo a ver si va bien:
DC_50PorCiento ; Potencia del motor a 50%
;bsf PORTB,0 ; Hace un PWN básico prendiendo los motores a la derecha
;bcf PORTB,1 ; Luego ejecuta 5 retardos de 1ms y apaga los motores
;bsf PORTB,2 ; Ejecuta otros 5 retardos y los vuelve a encender.
;bcf PORTB,3
;bcf PORTB,4
;bsf PORTB,5
;bsf PORTB,6
;bcf PORTB,7
movlw 0x65 ;esto hace lo mismo que lo que elimine
movwf PORTB
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
;bcf PORTB,0 ; Pone 0 en cada uno de los bits
;bcf PORTB,1 ; del puerto B
;bcf PORTB,2
;bcf PORTB,3
;bcf PORTB,4
;bcf PORTB,5
;bcf PORTB,6
;bcf PORTB,7
clrf PORTB ;pone a 0 PORTB
[b]call Retardo_1ms
call RS232_Inicializa
call RS232_LeeDato
movwf Apachurrada
movf Apachurrada,w
xorlw Teclal ;si sigue pulsada la misma tecla
btfsc STATUS,Z ;continua en 50%
goto $+5
movf Apachurrada,w
xorlw .0 ;si a traves del terminal llega 0
btfss STATUS,Z ;tambien sigue en 50%
goto Teclado[/b]
call Retardo_1ms
call Retardo_1ms
call Retardo_1ms
goto DC_50PorCiento
goto Fin
Como ves lo que hago es mirar que dato llega por el RS232 y si es el del 50% (.108) sigue ahi y si es .0 tambien (estoy suponiendo que cuando no se pulsa ninguna tecla llega un 0) si es otro numero, con cambiarlo listo.