Buenas.
Tus rutinas estan bien, pero ocupan mucha memoria de programa, en comparación con estas:
;RETARDO: Retardo de 10us = (3*2+4)*1us = 10us
retardo_10micros
movlw d'2'
movwf contador1
b10u decfsz contador1,f
goto b10u
return
Te explico: El bucle 'b10u' tarda en ejecutarse 3 instrucciones, es decir, 1 para el 'decfsz' y 2 para el 'goto'. Este bucle se repite tantas veces como valor tenga el registro 'contador1'. En este caso, contdor1 vale 2, pues tenemos 2*3 instrucciones. El 4 final se suma por las 2 instrucciones que se ejecutan al cargar el valor del contador y las otras 2 del return. EL resto es igual:
;RETARDO: Retardo de 20us = (3*5+4+1)*1us = 20us
retardo_20micros
movlw d'5'
movwf contador1
nop
b20u decfsz contador1,f
goto b20u
return
Aqui se le pone un nop para que exactamente sean 20 microsegundos.
;RETARDO: Retardo de 50us = (3*15+4+1)*1us = 50us
retardo_50micros
movlw d'15'
movwf contador1
nop
b50u decfsz contador1,f
goto b50u
return
;RETARDO: Retardo de 500us = (3*165+4+1)*1us = 500us
retardo_500micros
movlw d'165'
movwf contador1
nop
b500u decfsz contador1,f
goto b500u
return
Espero que te sirva. Todo esto es suponiendo un cristal de 4MHz. Para otro cristal ya no se multiplica por 1us si no por el que corresponda, y habría que modificar los valores que se cargan en el contador.