list p=16F84A

estado	 equ		0x03
porta	 equ		0x05
portb	 equ		0x06
trisa	 equ		0x85
trisb	 equ		0x86
conta1	 equ		0x0D
conta2	 equ		0x0E
conta3	 equ		0x0F
tiempo   equ        .1
ent      equ        .1
vel      equ        .1
		org		0x00
		goto	Inicio
		org		0x05 

Inicio  clrf porta
        clrf portb
        bsf     estado,5        ; Pasamos de Banco 0 a Banco 1.-
        movlw   b'11111111'     ; portb todo como entrada.-
        movwf   trisb
        movlw   b'000000'       ; Ra0-Ra3 como salida.-
        movwf   trisa
        bcf     estado,5        ;  del Banco 1 al Banco 0
        
arranque    clrf    porta       ; asegurando que las salidad de porta este limpias para no mover el motor
            btfsc   portb,7     ; esperando p1 para iniciar 
            goto arranque
            goto menu 

menu        movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'00000000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 00  es paso ret sino voy para opc2 esperando un 11
            goto    opc2
            goto    pasoretcom
            
opc2        bcf     estado,2
            bcf     estado,0 
            movlw   B'01100000'    
            xorwf   ent,0      ; comparando
            btfss   estado,2   ; si es 11 paso completo hacia adelante y sino vuelvo a leer sw
            goto    menu
            goto    pasoadcom

;******************************************************************************************

pasoadcom    clrf porta
             movlw B'1001'
             movwf porta
             call velocidad	
             call retardo
             clrf porta
              NOP
             NOP
             NOP

              movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'01100000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 11  sigo mi rutina
            goto    menu
             
             movlw B'1100'
             movwf porta
             call velocidad
             call retardo
             clrf porta
              NOP
             NOP
             NOP
              movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'01100000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 11  sigo mi rutina
            goto    menu

             movlw B'0110'
             movwf porta
             call velocidad
             call retardo
             clrf porta
              NOP
             NOP
             NOP

             movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'01100000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 11  sigo mi rutina
            goto    menu

             movlw B'0011'
             movwf porta
             call velocidad
             call retardo
             clrf porta
              NOP
             NOP
             NOP
             goto menu             ;leer sw1

pasoretcom   clrf porta
             movlw B'0011'
             movwf porta
             call velocidad	
             call retardo
             clrf porta
              NOP
             NOP
             NOP

            movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'00000000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 00  sigo mi rutina
            goto    menu
            
             
             movlw B'0110'
             movwf porta
             call velocidad
             call retardo
             clrf porta
              NOP
             NOP
             NOP
             
            movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'00000000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 00  sigo mi rutina
            goto    menu



             movlw B'1100'
             movwf porta
             call velocidad
             call retardo
             clrf porta
             NOP
             NOP
             NOP

            movf    portb,0
            andlw   B'01100000'  
            movwf   ent         ;  enmascaro rb6 y rb5 para comparar guardando en entrada
            bcf     estado,2
            bcf     estado,0 
            movlw   B'00000000'    
            xorwf   ent,0      
            btfss   estado,2   ; si es 00  sigo mi rutina
            goto    menu

             movlw B'1001'
             movwf porta
             call velocidad
             call retardo
             clrf porta
             NOP
             NOP
             NOP
             goto menu             ;leer sw1

;******************************************************************************************

velocidad   movf    portb,0
            andlw   B'00001100'  ; enmascaro rb2 y rb3 para comparar
            movwf   vel         ; guardando entrada
            movlw   B'00001100'    
            xorwf   vel,0     ; comparando
            btfss   estado,2   ; si en el sw2 es 11 retorno a w con .18 para un retardo rapido , sino voy a la otra opc
            goto    vel1
            call retardo
            return

vel1        movlw   B'00000000'    
            xorwf   ent,0     ; comparando
            btfss   estado,2   ; si en el sw2 es 00 retorno a w con .28 para un retardo mas lento , sino voy a la otra opc
            goto    vel2
            call retardo
            call retardo
            return

vel2        nop   ; si es 01 o 11 retorno con el paso mas lento 
            call retardo
            call retardo
            call retardo
            call retardo
            return


;******************************************************************************************

retardo  movlw     .18
         movwf     conta1     ; 1 |
PLoop0   movlw     .70       ; 1 set numero de repeticion  (B)
         movwf     conta2     ; 1 |
PLoop1   movlw     .247      ; 1 set numero de repeticion  (A)
         movwf     conta3     ; 1 |
PLoop2   clrwdt              ; 1 clear watchdog
         decfsz    conta3, 1  ; 1 + (1) es el tiempo 0  ? (A)
         goto      PLoop2    ; 2 no, loop
         decfsz    conta2,  1 ; 1 + (1) es el tiempo 0  ? (B)
         goto      PLoop1    ; 2 no, loop
         decfsz    conta1,  1 ; 1 + (1) es el tiempo 0  ? (C)
         goto      PLoop0    ; 2 no, loop
PDelL1   goto PDelL2         ; 2 ciclos delay
PDelL2   clrwdt              ; 1 ciclo delay
         return              ; 2+2 Fin.

end