LIST P=16F628A, R=HEX, W=-302
#INCLUDE P16F628A.INC
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT
#DEFINE vref_bajo B'11000000' ; 1.25v - RA2 VREF OUTPUT
#DEFINE vref_alto B'11001111' ; 3.6v - RA2 VREF OUTPUT
#DEFINE ARRIBA 1
#DEFINE ABAJO 5
#DEFINE IZQ 3
#DEFINE DER 7
#DEFINE UPL 2
#DEFINE UPR 0
#DEFINE DOWNL 4
#DEFINE DOWNR 6
CBLOCK 20
SALIDA
ENDC
;========================================================================
ORG 0
GOTO inicio
ORG 5
inicio
MOVLW B'00000111'
MOVWF CMCON ; COMP OFF
CLRF PORTB
BSF STATUS,RP0
MOVLW 0xFF
MOVWF TRISA ; PORTA SOLO ENTRADAS
CLRF TRISB ; PORTB SOLO SALIDAS
MOVLW vref_alto
MOVWF VRCON ; VREF ENABLE - ALTO
BCF STATUS,RP0
CALL ret_vref
MOVLW B'00110011' ; 2 COMPARADORES CON REFERENCIA COMUN RA2->(+)
MOVWF CMCON ; Y SALIDAS INVERTIDAS
CLRF SALIDA
;========================================================================
main
; ENCIENDE/APAGA LOS BITS CORRESPONDIENTES DE ARRIBA Y DERECHA:
BTFSC CMCON,C1OUT
BSF SALIDA,ARRIBA
BTFSC CMCON,C2OUT
BSF SALIDA,DER
BSF STATUS,RP0
MOVLW vref_bajo
MOVWF VRCON ; VREF BAJO
BCF STATUS,RP0
CALL ret_vref
; ENCIENDE/APAGA LOS BITS CORRESPONDIENTES DE ABAJO E IZQUIERDA:
BTFSS CMCON,C1OUT
BSF SALIDA,ABAJO
BTFSS CMCON,C2OUT
BSF SALIDA,IZQ
BSF STATUS,RP0
MOVLW vref_alto
MOVWF VRCON ; VREF ALTO
BCF STATUS,RP0
;========================================================================
; IDENTIFICA DIAGONALES:
MOVLW B'10000010' ; ARRIBA-DERECHA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,UPR
GOTO salir
MOVLW B'00001010' ; ARRIBA-IZQUIERDA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,UPL
GOTO salir
MOVLW B'10100000' ; ABAJO-DERECHA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,DOWNR
GOTO salir
MOVLW B'00101000' ; ABAJO-IZQUIERDA
XORWF SALIDA,W
BTFSS STATUS,Z
GOTO $+4
CLRF SALIDA
BSF SALIDA,DOWNL
GOTO salir
;========================================================================
salir
; PASA LOS DATOS AL PUERTO B:
MOVF SALIDA,W
CLRF PORTB
MOVWF PORTB
CLRF SALIDA
GOTO main
;========================================================================
ret_vref
FILL (GOTO $+1), 5 ; RETARDO 14us
RETURN
END