#INCLUDE <P16F84.INC>
LIST P=16F84A
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 0

CBLOCK 0X0C
D1
D2
D3
D4
ENDC


INICIO
BSF STATUS, RP0
CLRF TRISB
MOVLW 0xFF
MOVWF TRISA
BCF STATUS, RP0

COMIENZA
CALL DELAY_INICIO
MOVLW B'00001111'
MOVWF PORTB  ;;ENCENDEMOS LOS MOTOR



;-----DETECCION DE SENSORES-----

DETECCIONIZQ
BTFSS PORTA,0 ;;SI EL SENSOR IZQ ES 1 EL MOTOR SE DETIENE
GOTO DETECCIONDER
GOTO STOP ;;DETIENE LOS MOTORES
GOTO RETRO ;;SALTA A RETROCER
GOTO GIRO_DER ;GIRA EL MOTOR DERECHO
GOTO COMIENZA
RETURN

DETECCIONDER
BTFSS PORTA,1 ;SI EL SENSOR DER ES 1 EL MOTOR SE DETIENE
GOTO DETECCIONIZQ
GOTO STOP; DETIENE LOS MOTORES
GOTO RETRO ;SALTA A RETROCEDER
GOTO GIRO_IZQ ;GIRA EL MOTOR IZQUIERDO
GOTO COMIENZA
RETURN

;;------DETENCION DE MOTORES ------
STOP
MOVLW B'00001100'
MOVWF PORTB ;DETIENE LOS MOTORES
CALL RETARDG ;LLAMA AL RETARDO
RETURN
;;--------RETROCESO-----

RETRO
MOVLW B'00000000'
MOVWF PORTB ;INVERTIMOS LOS POLOS DEL MOTOR 
CALL RETARDG; LLAMA AL RETARDO
RETURN



;------SUBRUTINAS DE GIRO ----
GIRO_DER
MOVLW B'00000101'
MOVWF PORTB ; PONE A FUNCIONAR EL MOTOR DERECHO
CALL RETARDR; LLAMA AL RETARDO DE GIRO
RETURN

GIRO_IZQ
MOVLW B'00001010'
MOVWF PORTB ;PONE A FUNCIONAR EL MOTOR IZQUIERDO
CALL RETARDR ; LLAMA AL RETARDO DE GIRO
RETURN  

;;------RETARDO GENERAL-----

;----- REGISTROS---

RETARDG
MOVLW 0X01
MOVWF D1
MOVLW 0X01
MOVWF D2
DELAY_0
DECFSZ D1
GOTO $+2
DECFSZ D2
GOTO DELAY_0
GOTO $+1
NOP
RETURN


;----RETARDO DE GIRO-----

;----- REGISTROS---

RETARDR
MOVLW 0X02
MOVWF D3
MOVLW 0X02
MOVWF D4
DELAY_1
DECFSZ D1,F
GOTO $+2
DECFSZ D2,F
GOTO DELAY_1
RETURN

DELAY_INICIO
MOVLW 0X2C
MOVWF D1
MOVLW 0XE7
MOVWF D2
MOVLW 0X0B
MOVWF D3

DELAY_I
DECFSZ D1,F
GOTO $+2
DECFSZ D2,F
GOTO $+2
DECFSZ D3,F
GOTO DELAY_I
;3 CICLOS
GOTO $+1
NOP
;4 CICLOS
RETURN

END