LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT
CBLOCK 0x0C
CONTADOR
CONTADOR_1
PDel0
PDel1
PDel2
PDel3
PDel4
REG_1
FLAG
ENDC
#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES
ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados
clrf CONTADOR
clrf FLAG
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
TABLA ;esta tabla nos dira que hay que hacer
addwf PCL,1
goto ESPERA ; aqui nunc vendra, pero por si acaso....
goto DERECHA
goto IZQUIERDA
goto LOS_DOS
MAIN
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
call TABLA
goto ESPERA
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
btfss FLAG,0
goto ACTIVAR_I
DESACTIVAR_I
bcf FLAG,0
bcf LED_I
clrf CONTADOR
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1
ACTIVAR_I
bsf FLAG,0
btfsc PUL_I
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DERECHA
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
call DEMORA ;esta un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ACTIVAR_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
btfss FLAG,1
goto ACTIVAR_D
DESACTIVAR_D
bcf FLAG,1
bcf LED_D
clrf CONTADOR
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vuelve a MAIN; FLAG estaba a 1
ACTIVAR_D
bsf FLAG,1
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
bsf LED_D ; enciende intermitente izquierda
ENCIENDE_D
call DEMORA ; está un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ACTIVAR_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
btfss FLAG,2 ; flag para saber si apagamos o encendemos
goto ACTIVAR_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
bcf FLAG,2 ;apagamos intermitentes y borramos flag, ya que estaba a 1
clrf PORTB ; apagamos intermitentes
return
ACTIVAR_LOSDOS
bsf FLAG,2 ; el flag estaba a 0 lo activamos
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
movlw 0x18
movwf PORTB ; ponemos a 1 bits 3 y 4 del puerto B
ENCIENDE_LOSDOS
call DEMORA ; tiempo encendidos
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf PORTB ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
call DEMORA
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .50 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ACTIVAR_LOSDOS
ANTIRREBOTES ; 300ms, aparte de servir de antirrebotes, tambien compensara
; si no se pulsan exactamente al mismo tiempo los dos botones
movlw .154 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .243 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
PDelL8 goto PDelL9 ; 2 ciclos delay
PDelL9 goto PDelL10 ; 2 ciclos delay
PDelL10
decfsz PDel3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL11 goto PDelL12 ; 2 ciclos delay
PDelL12 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-----------------------------------------------
DEMORA ; retardo de 50ms que se repetira las veces que sea necesario
; para completar el tiempo adecuado para las intermitencias
movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
return ; 2+2 Fin.
END LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT
CBLOCK 0x0C
CONTADOR
CONTADOR_1
PDel0
PDel1
PDel2
PDel3
PDel4
REG_1
FLAG
ENDC
#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES
ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados
clrf CONTADOR
clrf FLAG
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
MAIN
clrf REG_1 ;
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
movlw .3
subwf REG_1,0 ; miramos si REG_1 vale 3, serian los dos botones pulsados
btfsc STATUS,Z
goto LOS_DOS ; vale 3 encendemos los dos intermitentes
movlw .2
subwf REG_1,0 ; miramos si REG_1 vale 2, seria boton derecha
btfsc STATUS,Z
goto IZQUIERDA ; vale 2 encendemos intermitente derecha
movlw .1
subwf REG_1,0 ; miramos si REG_1 vale 1, seria boton izquierda
btfsc STATUS,Z
goto DERECHA ; vale 1 encendemos intermitente izquierda
goto ESPERA ; no es ninguno fueron rebotes, va a esperar pulsacion
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
goto ENCIENDE_I
DESACTIVAR_I
bcf LED_I
clrf CONTADOR
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
goto ESPERA ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
call DEMORA ;esta un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
clrf CONTADOR
goto ENCIENDE_D
DESACTIVAR_D
bcf LED_D
clrf CONTADOR
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
goto ESPERA ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1
ENCIENDE_D
bsf LED_D
call DEMORA ; está un tiempo encendido
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
call DEMORA
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto IZQUIERDA
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
goto ACTIVAR_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
bcf FLAG,2 ;apagamos intermitentes y borramos flag, ya que estaba a 1
clrf PORTB ; apagamos intermitentes
goto ESPERA ; apaga flag e intermitente y vueleve a ESPERA, FLAG estaba a 1
ACTIVAR_LOSDOS
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
movlw 0x18
movwf PORTB ; ponemos a 1 bits 3 y 4 del puerto B
ENCIENDE_LOSDOS
call DEMORA ; tiempo encendidos
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf PORTB ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
call DEMORA
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
incf CONTADOR_1,1
movlw .30 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ACTIVAR_LOSDOS
ANTIRREBOTES ; 300ms, aparte de servir de antirrebotes, tambien compensara
; si no se pulsan exactamente al mismo tiempo los dos botones
movlw .154 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .243 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
PDelL8 goto PDelL9 ; 2 ciclos delay
PDelL9 goto PDelL10 ; 2 ciclos delay
PDelL10
decfsz PDel3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL11 goto PDelL12 ; 2 ciclos delay
PDelL12 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-----------------------------------------------
DEMORA ; retardo de 50ms que se repetira las veces que sea necesario
; para completar el tiempo adecuado para las intermitencias
movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
return ; 2+2 Fin.
END
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT
ERRORLEVEL -302
CBLOCK 0x0C
CONTADOR
CONTADOR_1
REG_1
PDel0
PDel1
PDel2
PDel3
ENDC
#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES
ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
movlw 0X07 ; TIMER con preedcaler de 256, para 50ms
movwf OPTION_REG
movlw 0X20 ; habilitamos desborde de TIMER. pero sin interrupcion
movwf INTCON ; cada 50ms nos seteara el flag TOIF de INTCON
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados
clrf CONTADOR
clrf CONTADOR
clrf REG_1
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
TABLA ;esta tabla nos dira que hay que hacer
addwf PCL,1
goto ESPERA ; aqui nunc vendra, pero por si acaso....
goto DERECHA
goto IZQUIERDA
goto LOS_DOS
MAIN
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
call TABLA
goto ESPERA
CAMBIA_I ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
; y haga algo indeseado
call ANTIRREBOTES_1
btfss PUL_I ; comprueba que realmente se pulso
goto ENCIENDE_D ; falsa alarma va a donde estaba
btfsc PUL_D ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_I
DESACTIVAR_I
bcf LED_I
clrf CONTADOR
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_D
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
CAMBIA_D ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
; y haga algo indeseado
call ANTIRREBOTES_1
btfss PUL_D ; comprueba que realmente se pulso
goto ENCIENDE_I ; falsa alarma va a donde estaba
btfsc PUL_I ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DESACTIVAR_D
bcf LED_D
clrf CONTADOR
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vuelve a MAIN; FLAG estaba a 1
ENCIENDE_D
bsf LED_D ; enciende intermitente
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf CONTADOR_1
bcf INTCON,2
goto ENCIENDE_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf PORTB ; apagamos intermitentes
return
ENCIENDE_LOSDOS
movlw 0x18
movwf PORTB ; ponemos a 1 bits 3 y 4 del puerto B
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf PORTB ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ENCIENDE_LOSDOS
ANTIRREBOTES ;
DEMORA movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
ANTIRREBOTES_1 ; antirrebotes de 20ms solo cuando esta funcionando un
; y se cambia para el otro, sin pasar por MAIN
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
decfsz PDel3, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT
ERRORLEVEL -302
CBLOCK 0x0C
CONTADOR
CONTADOR_1
REG_1
PDel0
PDel1
PDel2
PDel3
ENDC
#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCIONES
ORG 0X05
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas aunque este puerto no se va a usar
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
movlw 0X07 ; TIMER con preedcaler de 256, para 50ms
movwf OPTION_REG
movlw 0X20 ; habilitamos desborde de TIMER. pero sin interrupcion
movwf INTCON ; cada 50ms nos seteara el flag TOIF de INTCON
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; todos los LEDs apagados
clrf CONTADOR
clrf CONTADOR
clrf REG_1
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
TABLA ;esta tabla nos dira que hay que hacer
addwf PCL,1
goto ESPERA ; aqui nunc vendra, pero por si acaso....
goto DERECHA
goto IZQUIERDA
goto LOS_DOS
MAIN
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
call TABLA
goto ESPERA
CAMBIA_I ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_D
call ANTIRREBOTES_1
btfss PUL_I ; comprueba que realmente se pulso
goto ENCIENDE_D ; falsa alarma va a donde estaba
btfsc PUL_D ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_I
DESACTIVAR_I
bcf LED_I
clrf CONTADOR
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
CAMBIA_D ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_I ;
call ANTIRREBOTES_1
btfss PUL_D ; comprueba que realmente se pulso
goto ENCIENDE_I ; falsa alarma va a donde estaba
btfsc PUL_I ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DESACTIVAR_D
bcf LED_D
clrf CONTADOR
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
return ; apaga flag e intermitente y vuelve a MAIN; FLAG estaba a 1
ENCIENDE_D
bsf LED_D ; enciende intermitente
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf CONTADOR_1
bcf INTCON,2
goto ENCIENDE_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf PORTB ; apagamos intermitentes
return
ENCIENDE_LOSDOS
movlw 0x18
movwf PORTB ; ponemos a 1 bits 3 y 4 del puerto B
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf PORTB ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ENCIENDE_LOSDOS
ANTIRREBOTES ;
DEMORA movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
ANTIRREBOTES_1 ; antirrebotes de 20ms solo cuando esta funcionando un
; y se cambia para el otro, sin pasar por MAIN
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
decfsz PDel3,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; oscilador XT
ERRORLEVEL -302
CBLOCK 0x20 ; ponemos 0x20 para que valga para todos
; incluido 12f629
CONTADOR
CONTADOR_1
REG_1
PDel0
PDel1
PDel2
PDel3
ENDC
#DEFINE LED_I PORTB,3
#DEFINE LED_D PORTB,4
#DEFINE PUL_I PORTA,2
#DEFINE PUL_D PORTA,1
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCION
INICIO
bsf STATUS,5 ; activa la pagina 1
movlw 0XFF ; carga FF en W
movwf TRISA ; puerto A todos entradas
movlw 0X00 ; carga 00000000 en W
movwf TRISB ; mueve W a puerto B (todos salidaS)
movlw 0X07 ; TIMER con preedcaler de 256, para 50ms
movwf OPTION_REG
movlw 0X20 ; habilitamos desborde de TIMER. pero sin interrupcion
movwf INTCON ; cada 50ms nos seteara el flag TOIF de INTCON
bcf STATUS,5 ; volvemos a la pagina 0
clrf PORTB ; ponemos a cero el puerto B para empezar con
; los intermitentes apagados
clrf CONTADOR
clrf CONTADOR_1
clrf REG_1
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
TABLA ;esta tabla nos dira que hay que hacer
addwf PCL,1
goto ESPERA ; aqui nunc vendra, pero por si acaso....
goto DERECHA
goto IZQUIERDA
goto LOS_DOS
MAIN
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
call TABLA
goto ESPERA
CAMBIA_I ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_D
call ANTIRREBOTES_1
btfss PUL_I ; comprueba que realmente se pulso
goto ENCIENDE_D ; falsa alarma va a donde estaba
btfsc PUL_I ; se espera hasta que se suelte
goto $-1
call ANTIRREBOTES_1 ; llama antirrebotes para confirmar
btfsc PUL_I ; se mira si de verdad se solto
return ; paso algo raro vuelve a MAIN
btfsc PUL_D ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_I
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
call ANTIRREBOTES_1 ; para comprobar si hay rebotes al soltar
btfsc PUL_I ; se confirma que se solto pulsador
return ; falsa alarma va a MAIN
bcf INTCON,2 ; se solto y no hay rebotes
clrf CONTADOR ; pone contadores a 0 e inicia secuencia
clrf CONTADOR_1
goto ENCIENDE_I
DESACTIVAR_I
bcf LED_I
clrf CONTADOR
clrf CONTADOR_1
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
call ANTIRREBOTES_1
btfsc PUL_I ; despues de antirrebotes confirma se solto
goto $-4 ; fueron rebotes va a primer chequeo
return ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
CAMBIA_D ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_I ;
call ANTIRREBOTES_1
btfss PUL_D ; comprueba que realmente se pulso
goto ENCIENDE_I ; falsa alarma va a donde estaba
btfsc PUL_D ; se espera hasta que se suelte
goto $-1
call ANTIRREBOTES_1 ; llama antirrebotes para confirmar
btfsc PUL_D ; se mira si de verdad se solto
return ; paso algo raro vuelve a MAIN
btfsc PUL_I ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
call ANTIRREBOTES_1 ; para comprobar si hay rebotes al soltar
btfsc PUL_D ; se confirma que se solto pulsador
return ; falsa alarma va a MAIN
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DESACTIVAR_D
bcf LED_D
clrf CONTADOR
clrf CONTADOR_1
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
call ANTIRREBOTES_1
btfsc PUL_D ; despues de antirrebotes confirma se solto
goto $-4 ; fueron rebotes va a primer chequeo
return ; apaga intermitente y vuelve a MAIN
ENCIENDE_D
bsf LED_D ; enciende intermitente
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
call ANTIRREBOTES_1
movf PORTA,0 ; movemos PORTA a W para comprobar que vale 0
btfss STATUS,Z ; encendio FLAG de 0?
goto LOS_DOS ; fueron rebotes vuelve a comprobar despulsacion
clrf CONTADOR
clrf CONTADOR_1
bcf INTCON,2
goto ENCIENDE_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
call ANTIRREBOTES_1
movf PORTA,0 ; para confirmar que se soltaron
btfss STATUS,Z ; comprobamos que el valor de PORTA es 0, no pulsados
goto ENCIENDE_LOSDOS ; no se soltaron, vuelve a encender los dos
clrf PORTB ; apagamos intermitentes
clrf CONTADOR
clrf CONTADOR_1
return
ENCIENDE_LOSDOS
bcf INTCON,2
movlw 0x18
movwf PORTB ; ponemos a 1 bits 3 y 4 del puerto B
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf PORTB ; lo hago asi porque supongo que no tienes mas cosas coectadas en PORTB
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ENCIENDE_LOSDOS
ANTIRREBOTES ;
DEMORA movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
ANTIRREBOTES_1 ; antirrebotes de 20ms solo cuando esta funcionando uno
; y se cambia para el otro, sin pasar por MAIN
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
decfsz PDel3,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
Si pulso ambos botones durante 1 segundo (o al mismo tiempo) parpadean los 4 indicadores sin fin (estado emergencia o avería) hasta que pulso los dos de nuevo.
LIST P=12F629, ; usar PIC 12F629
#include <p12F629.inc>
__CONFIG _CP_OFF& _WDT_OFF&_PWRTE_ON&_BODEN_OFF&_INTRC_OSC_NOCLKOUT&_MCLRE_OFF
ERRORLEVEL -302
CBLOCK 0x20 ; ponemos 0x20 para que valga para todos
; incluido 12f629
CONTADOR
CONTADOR_1
REG_1
PDel0
PDel1
PDel2
PDel3
ENDC
#DEFINE LED_I GPIO,1
#DEFINE LED_D GPIO,0
#DEFINE PUL_I GPIO,4
#DEFINE PUL_D GPIO,5
ORG 0X00 ; VECTOR DE RESET
goto INICIO ; va a inicio
ORG 0x04 ; VECTOR DE INTERRUPCION
INICIO
clrf GPIO
movlw 07h
movwf CMCON ; todos los pines en modo digital.
bsf STATUS,5 ; activa la página 1
movlw b'111100' ; GP0 y 1 salidas 2, 3, 4 y 5 entradas.
movwf TRISIO
call 0X3FF
movwf OSCCAL
clrf INTCON ; deshabilitar interrupciones.
movlw 0X07 ; TIMER con prescaler de 256, para 50ms
movwf OPTION_REG
movlw 0X20 ; habilitamos desborde de TIMER pero sin interrupción
movwf INTCON ; cada 50ms nos seteara el flag TOIF de INTCON
bcf STATUS,5 ; volvemos a la página 0
bcf GPIO,0 ; apagamos led D
bcf GPIO,1
clrf CONTADOR
clrf CONTADOR_1
clrf REG_1
ESPERA
btfss PUL_I
goto $+3 ; va tres posiciones para delante
call ANTIRREBOTES
goto MAIN
btfss PUL_D
goto ESPERA
call ANTIRREBOTES
goto MAIN
TABLA ;esta tabla nos dira que hay que hacer
addwf PCL,1
goto ESPERA ; aqui nunc vendra, pero por si acaso....
goto DERECHA
goto IZQUIERDA
goto LOS_DOS
MAIN
btfss PUL_D ; miramos si en PUL_D hay un 1 o un 0
bcf REG_1,0 ; y escribimos en un registro lo que haya
btfsc PUL_D ; en el bit 0
bsf REG_1,0
btfss PUL_I ; hacemos lo mismo con el otro pulsador
bcf REG_1,1 ;este lo escribimos en el bit 1
btfsc PUL_I
bsf REG_1,1 ; aqui ya tenemos los dos pulsadores leidos y anotados en un registro
movf REG_1,0 ; lo movemos a W
call TABLA
goto ESPERA
CAMBIA_I ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_D
call ANTIRREBOTES_1
btfss PUL_I ; comprueba que realmente se pulso
goto ENCIENDE_D ; falsa alarma va a donde estaba
btfsc PUL_I ; se espera hasta que se suelte
goto $-1
call ANTIRREBOTES_1 ; llama antirrebotes para confirmar
btfsc PUL_I ; se mira si de verdad se solto
return ; paso algo raro vuelve a MAIN
btfsc PUL_D ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_I
IZQUIERDA
btfsc PUL_I ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
call ANTIRREBOTES_1 ; para comprobar si hay rebotes al soltar
btfsc PUL_I ; se confirma que se solto pulsador
return ; falsa alarma va a MAIN
bcf INTCON,2 ; se solto y no hay rebotes
clrf CONTADOR ; pone contadores a 0 e inicia secuencia
clrf CONTADOR_1
goto ENCIENDE_I
DESACTIVAR_I
bcf LED_I
clrf CONTADOR
clrf CONTADOR_1
btfsc PUL_I ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
call ANTIRREBOTES_1
btfsc PUL_I ; despues de antirrebotes confirma se solto
goto $-4 ; fueron rebotes va a primer chequeo
return ; apaga flag e intermitente y vueleve a MAIN, FLAG estaba a 1
ENCIENDE_I
bsf LED_I ; enciende intermitente izquierda
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_I
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_I
bcf LED_I ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto CAMBIA_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto DESACTIVAR_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_I
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para numero de veces que encendera
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_I ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_I
CAMBIA_D ; esta rutina se ejecutara solo cuando cambie de un intermitente
; y hara un antirrebotes de 20ms para asegurarse de que no fue un rebote
bcf LED_I ;
call ANTIRREBOTES_1
btfss PUL_D ; comprueba que realmente se pulso
goto ENCIENDE_I ; falsa alarma va a donde estaba
btfsc PUL_D ; se espera hasta que se suelte
goto $-1
call ANTIRREBOTES_1 ; llama antirrebotes para confirmar
btfsc PUL_D ; se mira si de verdad se solto
return ; paso algo raro vuelve a MAIN
btfsc PUL_I ; y que el otro boton esta desactivado
return ; se pulsaron los dos va a main a iniciar secuencia
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DERECHA
btfsc PUL_D ; Aqui espera hasta que se suelte pulsador
goto $-1 ; va una posicion para atras
call ANTIRREBOTES_1 ; para comprobar si hay rebotes al soltar
btfsc PUL_D ; se confirma que se solto pulsador
return ; falsa alarma va a MAIN
bcf INTCON,2
clrf CONTADOR
clrf CONTADOR_1
goto ENCIENDE_D
DESACTIVAR_D
bcf LED_D
clrf CONTADOR
clrf CONTADOR_1
btfsc PUL_D ; espera hasta que se suelte pulsador
goto $-1 ; porque si retornara sin esperar volveria a secuencia
call ANTIRREBOTES_1
btfsc PUL_D ; despues de antirrebotes confirma se solto
goto $-4 ; fueron rebotes va a primer chequeo
return ; apaga intermitente y vuelve a MAIN
ENCIENDE_D
bsf LED_D ; enciende intermitente
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_D
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_D
bcf LED_D ; apaga
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_D
goto DESACTIVAR_D ; si mientras esta ejecutando una secuencia; se pulsa un boton empiezade nuevo
btfsc PUL_I
goto CAMBIA_I
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; se desbordo, borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_D
clrf CONTADOR_1 ; ponemos a 0 contador
incf CONTADOR,1 ; para número de veces que encenderá
movlw .10 ; le pongo 10 pero pueden ser las que tu quieras
subwf CONTADOR,0
btfss STATUS,Z ; van 10 veces?
goto ENCIENDE_D ; no, vuelve a repetir secuencia
clrf CONTADOR
goto DESACTIVAR_D
LOS_DOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
call ANTIRREBOTES_1
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf CONTADOR
clrf CONTADOR_1
bcf INTCON,2
goto ENCIENDE_LOSDOS
DESACTIVAR_LOSDOS
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
call ANTIRREBOTES_1
btfsc PUL_I
goto $-1
btfsc PUL_D ; miramos si estan sin pulsar ambos botones
goto $-3
clrf GPIO ; apagamos intermitentes
clrf CONTADOR
clrf CONTADOR_1
return
ENCIENDE_LOSDOS
bcf INTCON,2
movlw 0x03
movwf GPIO ; ponemos a 1 bits 0 y 1 del puerto
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .1 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto ENCIENDE_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
APAGA_LOSDOS
clrf GPIO ; apagamos intermitentes
movlw .61 ; cargamos TIMER0 con 61 para que nos cuente 50ms
movwf TMR0 ; porque si empezara de 0 contaria 65536
btfsc PUL_I
goto DESACTIVAR_LOSDOS ; si mientras esta ejecutando una secuencia se pulsa un boton empiezade nuevo
btfsc PUL_D
goto DESACTIVAR_LOSDOS
btfss INTCON,2 ; pasaron 50ms? se desbordo TIMER?
goto $-5 ; no seguimos esperando y chequeando pulsadores
bcf INTCON,2 ; borramos flag para la proxima vez
incf CONTADOR_1,1
movlw .20 ; numero de veces que se repite el retardo de 50ms
subwf CONTADOR_1,0 ; modificando este numero se aumentara o reducira en 50ms el tiempo
btfss STATUS,Z
goto APAGA_LOSDOS
clrf CONTADOR_1 ; ponemos a 0 contador
goto ENCIENDE_LOSDOS
ANTIRREBOTES ;
DEMORA movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
ANTIRREBOTES_1 ; antirrebotes de 20ms solo cuando esta funcionando uno
; y se cambia para el otro, sin pasar por MAIN
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel2 ; 1 |
PLoop3 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel3 ; 1 |
PLoop4 clrwdt ; 1 clear watchdog
decfsz PDel3,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop4 ; 2 no, loop
decfsz PDel2,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop3 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
ENDhttp://www.foroharley.com/f44/
Intenté pasar la ITV con ella y me la tirarón 'patrás' porque no se notaba el cambio al frenar, apenas iluminaba un poco mas.