LIST P=16F877A
#INCLUDE <P16F877A.INC>
__CONFIG _HS_OSC&_WDT_OFF&_PWRTE_OFF&_BODEN_OFF&_LVP_OFF&_CPD_OFF&_WRT_OFF&_DEBUG_OFF&_CP_OFF
;---------------------------------------------------------------------------------------------------------
; Definición de la RAM
cblock 0x20
TIM1
TIM2
TIM3
CNT
CNT2
endc
;---------------------------------------------------------------------------------------------------------
; Definición de vectores de inicio e interrupciones
ORG 0
clrwdt
bcf STATUS,RP0 ;Selecciono el banco 0
bcf STATUS,RP1
goto PRINCIPIO
ORG 4
clrf INTCON ; En el caso de no usar las interrupciones
return
;---------------------------------------------------------------------------------------------------------
;Tabla
BCD7SEG
ADDWF PCL,1 ; SE INCREMENTA EL CONTADOR
RETLW B'00000000' ; 0
RETLW B'00000001' ; 1
RETLW B'00000010' ; 2
RETLW B'00000011' ; 3
RETLW B'00000100' ; 4
RETLW B'00000101' ; 5
RETLW B'00000110' ; 6
RETLW B'00000111' ; 7
RETLW B'00001000' ; 8
RETLW B'00001001' ; 9
CLRF CNT ; SI LLEGA A 10 EL CONTADOR SE RESETEA
RETLW B'0000000' ; 0
;---------------------------------------------------------------------------------------------------------
; Inicio del programa principal
PRINCIPIO
CLRF PORTA ; LIMPIA PUERTO A
CLRF PORTB ; LIMPIA PUERTO B
CLRF PORTC ; LIMPIA PUERTO C
BSF STATUS,RP0 ; BANCO 1
MOVLW 0X06
MOVWF ADCON1 ; CONFIGURA TODOS LOS PINES COMO SALIDAS DIGITALES
MOVLW B'00111111'
MOVWF TRISA ; PUERTO A ENTRADAS
MOVLW B'00000000'
MOVWF TRISB ; PUERTO B SALIDAS
MOVLW B'00000000'
MOVWF TRISC ; PUERTO C SALIDAS
BCF STATUS,RP0 ; BANCO 0
GOTO INICIO
;---------------------------------------------------------------------------------------------------------
INICIO
MOVLW 0X00
MOVWF CNT ; CONTADOR = 0
MOVLW 0X0A
MOVWF CNT2
TEST
BTFSS PORTA,0 ; PULSAR BOTON PARA INICIAR
GOTO TEST ; TESTEAR BOTON
REBOT
BTFSC PORTA,0
GOTO REBOT ; ANTIREBOTE
DERECHA
MOVLW B'00110011'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01100110'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11001100'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10011001'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,1 ; SENSOR 1 INTERRUMPIDO?
GOTO DERECHA ; REPITE CICLO
IZQUIERDA
MOVLW B'00111001'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01101100'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11000110'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10010011'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,2 ; SENSOR 2 INTERRUMPIDO?
GOTO IZQUIERDA ; REPITE CICLO
DERECHA2
MOVLW B'00110000'
MOVWF PORTB ; PASO 1
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'01100000'
MOVWF PORTB ; PASO 2
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'11000000'
MOVWF PORTB ; PASO 3
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
MOVLW B'10010000'
MOVWF PORTB ; PASO 4
CALL DEMORA ; 0.1 SEGUNDOS
CLRF PORTB
BTFSC PORTA,3 ; SENSOR 3 INTERRUMPIDO?
GOTO DERECHA2 ; REPITE CICLO
INCF CNT,f ; INCREMENTAMOS CONTADOR
MOVFW CNT ;
CALL BCD7SEG ; LLAMAMOS A LA TABLA
MOVWF PORTC ; CARGAMOS TABLA EN PORTB
DECFSZ CNT2,f ; CNT2 = 0 ?
GOTO DERECHA ; NO, SE REPITE EL CICLO
GOTO INICIO ; SI, SE RESETEA EL PROGRAMA
;---------------------------------------------------------------------------------------------------------
DEMORA
MOVLW 0x3F ; RETARDO DE 0.1 SEGUNDOS
MOVWF TIM1
MOVLW 0x90
MOVWF TIM2
Delay_0
DECFSZ TIM1,f
GOTO $+2
DECFSZ TIM2,f
GOTO Delay_0
GOTO $+1
RETURN
;---------------------------------------------------------------------------------------------------------
END