LIST P=16F877
#INCLUDE <P16F877.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_ON & _CPD_OFF
CONTADOR EQU 0x20
DATO1H EQU 0x21
DATO1L EQU 0x22
BANCO_0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO_1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO_2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANCO_3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
#DEFINE INT_1 PORTC,5
#DEFINE INT_2 PORTD,7
#DEFINE INT_3 PORTB,4
#DEFINE INT_4 PORTB,5
#DEFINE PUL_1 PORTA,4
#DEFINE PUL_2 PORTC,0
#DEFINE PUL_3 PORTC,1
#DEFINE PUL_4 PORTE,2
#DEFINE DIS_A PORTD,5
#DEFINE DIS_B PORTD,6
#DEFINE DIS_C PORTD,0
#DEFINE DIS_D PORTD,1
#DEFINE DIS_E PORTD,2
#DEFINE DIS_F PORTD,4
#DEFINE DIS_G PORTD,3
#DEFINE DIS_P PORTE,1
#DEFINE LED_1 PORTC,2
#DEFINE AD_EXT1 PORTA,5
CBLOCK 0x070 ; VARIABLES TODOS BLOQUES (max 16)
W_TEMP
STATUS_TEMP
PCLATH_TEMP
ENDC
CBLOCK 0x30 ; VARIABLE BANCO 0 (max 79)
; ----- VARIABLES DE PROGRAMA
ENDC
ORG 0x00
GOTO INICIO
ORG 0X04
MOVWF W_TEMP ; GUARDA W
SWAPF STATUS,W
MOVWF STATUS_TEMP ; GUARDA STATUS
MOVF PCLATH,W
MOVWF PCLATH_TEMP ; GUARDA PCLATH
CLRF PCLATH
; ----- RUTINA DE TRATAMIENTO DE INTERRUPCIÓN
MOVF PCLATH_TEMP,W
MOVWF PCLATH ; RECUPERA PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS ; RECUPERA STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W ; RECUPERA W
RETFIE
INICIO
BANCO_0
MOVLW b'10100001'
MOVWF ADCON0 ;Tad=Fosc/32. Canal 4. go/done#=0. Activa el conversor
BANCO_1
MOVLW b'00000111'
MOVWF OPTION_REG
MOVLW b'10000010'
MOVWF ADCON1
MOVLW b'00000000'
MOVWF TRISD
BSF TRISA,5 ;Entrada analogica
BANCO_0
INICIO_2 ;TIEMPO DE ADQUISICIÓN--> 20us=NºCONTADOR*3*Tciclo instrucción, Fosc=4MHz
MOVLW d'7'
MOVWF CONTADOR
ESPERAR
DECFSZ CONTADOR
GOTO ESPERAR
BSF ADCON0,2 ;Inicia la conversión
FIN_AD
BTFSC ADCON0,2 ;Salta si es cero indicando que la conversión ha terminado
GOTO FIN_AD
MOVF ADRESH,W ;El resultado de la conversión lo almacenamos en dos registros
MOVWF DATO1H
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF DATO1L
CALL MAYOR
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO ES_CERO
CALL MAYOR_1
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO UNO
CALL MAYOR_2
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO DOS
CALL MAYOR_3
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO TRES
CALL MAYOR_4
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO CUATRO
CALL MAYOR_5
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO CINCO
CALL MAYOR_6
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO SEIS
CALL MAYOR_7
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO SIETE
CALL MAYOR_8
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO OCHO
CALL MAYOR_9
SUBWF 0X00,W
BTFSS STATUS,Z
GOTO NUEVE
CALL MAYOR_10
MAYOR
MOVF DATO1H,W
SUBWF 0x00,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x00,W
BTFSS STATUS,C
RETLW .0
RETLW .1 ; si DATO1<CONSTANTE
MAYOR_1
MOVF DATO1H,W
SUBWF 0x00,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x66,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_2
MOVF DATO1H,W
SUBWF 0x00,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0xcc,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_3
MOVF DATO1H,W
SUBWF 0x01,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x33,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_4
MOVF DATO1H,W
SUBWF 0x01,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x99,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_5
MOVF DATO1H,W
SUBWF 0x01,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0xff,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_6
MOVF DATO1H,W
SUBWF 0x02,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x65,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_7
MOVF DATO1H,W
SUBWF 0x02,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0xcc,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_8
MOVF DATO1H,W
SUBWF 0x03,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x32,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_9
MOVF DATO1H,W
SUBWF 0x03,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0x98,W
BTFSS STATUS,C
RETLW .0
RETLW .1
MAYOR_10
MOVF DATO1H,W
SUBWF 0x03,W
BTFSS STATUS,C ; BRINCA SI DATO2H>=DATO1H
RETLW .0 ; DEVUELVE 0 INDICANDO QUE DATO1>DATO2
BTFSS STATUS,Z ; BRINCA SI NULO
RETLW .1 ; DEVUELVE 1 INDICANDO QUE DATO1<DATO2
MOVF DATO1L,W ; COMPARA LA PARTE BAJA CUANDO LAS PARTES ALTAS SON IGUALES
SUBWF 0xff,W
BTFSS STATUS,C
RETLW .0
RETLW .1
ES_CERO
CLRF PORTD
BSF DIS_A
BSF DIS_D
BSF DIS_F
BSF DIS_E
BSF DIS_B
BSF DIS_C
GOTO INICIO
UNO
CLRF PORTD
BSF DIS_B
BSF DIS_C
GOTO INICIO
DOS
CLRF PORTD
BSF DIS_A
BSF DIS_B
BSF DIS_G
BSF DIS_E
BSF DIS_D
GOTO INICIO
TRES
CLRF PORTD
BSF DIS_A
BSF DIS_B
BSF DIS_G
BSF DIS_C
BSF DIS_D
GOTO INICIO
CUATRO
CLRF PORTD
BSF DIS_F
BSF DIS_G
BSF DIS_B
BSF DIS_C
GOTO INICIO
CINCO
CLRF PORTD
BSF DIS_A
BSF DIS_F
BSF DIS_G
BSF DIS_C
BSF DIS_D
GOTO INICIO
SEIS
CLRF PORTD
BSF DIS_A
BSF DIS_F
BSF DIS_G
BSF DIS_E
BSF DIS_C
BSF DIS_D
GOTO INICIO
SIETE
CLRF PORTD
BSF DIS_A
BSF DIS_B
BSF DIS_C
GOTO INICIO
OCHO
CLRF PORTD
BSF DIS_A
BSF DIS_F
BSF DIS_G
BSF DIS_B
BSF DIS_E
BSF DIS_C
BSF DIS_D
GOTO INICIO
NUEVE
CLRF PORTD
BSF DIS_A
BSF DIS_F
BSF DIS_G
BSF DIS_B
BSF DIS_C
GOTO INICIO
END