list p = 12F675
#include P12F675.inc
ERRORLEVEL -302
__CONFIG ( _PWRTE_OFF & _BODEN_OFF & _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT )
PDEL1 EQU 0x20
PDEL2 EQU 0x21
PDEL3 EQU 0x22
DEL1 EQU 0x23
DEL2 EQU 0x24
LFE EQU 0x25
RFE EQU 0x26
LFEC EQU 0x27
RFEC EQU 0x28
RETARDO EQU 0x29
;-------------------------------------------------------------------
start
ORG 0x00
bcf STATUS,RP0 ;Bank 0
bcf INTCON,GIE ;Desabilita INTs
movlw 07h ; GP<2:0>
movwf CMCON ;digital IO
bsf STATUS,RP0 ;Bank 1
clrf ANSEL ;Digital I/O
movlw B'00111000' ;GP<0,1,2> salidas GP<3,4,5> entradas
movwf TRISIO ;se carga la configuracion
bcf STATUS,RP0 ;Bank 0
clrf GPIO ;limpia el puerto
clrf LFE
clrf RFE
INICIO
call ENCODER ;llama a checar el encoder
call REGRESA ;en regresa vuelve al estado normal
goto INICIO ;bucle
REGRESA
bcf GPIO,0 ;apaga el led
bcf GPIO,2 ;apaga el led
bsf GPIO,1 ;enciende el led de enmedio
RETURN ;regresa
DER bcf GPIO,1 ;apaga el led
bcf GPIO,0 ;apaga el led
bsf GPIO,2 ;enciende el led del pin 5
call DEMORA ;llama a un retardo
RETURN ;regresa
IZQ bcf GPIO,1 ;apaga el led
bcf GPIO,2 ;apaga el led
bsf GPIO,0 ;enciende el led del pin 7
call DEMORA ;llama un retardo
RETURN ;regresa
ENCODER
movfw LFE ;el valor previo se carga a w
movwf LFEC ;y se guarda para compararlo
movfw RFE ;el valor previo se carga a w
movwf RFEC ;y se guarda para compararlo
bcf RFE,0 ;se pone en 0 el bit
btfsc GPIO,4 ;si se detecta lo contrario se cambia
bsf RFE,0 ;a uno
bcf LFE,0 ;se pone en 0 el bit
btfsc GPIO,3 ;si se detecta lo contrario se cambia
bsf LFE,0 ;a uno
movfw RFE ;se carga a w el registro nuevo detectado
xorwf LFE,0 ;se hace una operacion or exlusica buscando un cambio
btfsc STATUS,Z ;si esto no ocurre se regresa al llamado
RETURN
movfw LFE ;si ocurre se carga a w el registro recien ingresado
xorwf LFEC,0 ;y se compara con el anterior
btfss STATUS,Z ;si son diferentes llama a una funcion
goto IZQ ;en este caso IZQ
movfw RFE ;si ocurre se carga a w el registro recien ingresado
xorwf RFEC,0 ;y se compara con el anterior
btfss STATUS,Z ;si son diferentes llama a una funcion
goto DER ;en este caso DER
RETURN
;-------------------------------------------------------------
;RETARDOS
;-------------------------------------------------------------
DEMORA
movlw .3 ;Carga un numero para la DEMORA
movwf PDEL3 ;en este Registro
movlw .150 ;Obtiene el valor del retardo
movwf PDEL2 ;en este Registro
movlw .255 ;Carga un numero para la DEMORA
movwf PDEL1 ;en este Registro
decfsz PDEL1,1 ;Decremente el segistro
goto $-1 ;hasta que llega a 0 y salta esta instruccion
decfsz PDEL2,1 ;Decremente el registro
goto $-5 ;hasta que llega a 0 y salta esta instruccion
decfsz PDEL3,1 ;Decremente el registro
goto $-9 ;hasta que llega a 0 y salta esta instruccion
RETURN
END