@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
CMCON=7 ; Conversión de análogo a digital del puerto A
NUMERO VAR BYTE
R VAR BYTE
BIP VAR PORTA.0
LED VAR PORTA.1
DOOR VAR PORTA.2
A VAR PORTB.0 ; Nombre para los pines de las columnas de la matriz
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3
UNO VAR PORTB.4 ; Nombre para los pines de las filas de la matriz
DOS var PORTB.5
TRES VAR PORTB.6
CUATRO VAR PORTB.7
SETPRIME VAR BYTE ; Variable para almacenar la primera clave
SETSEGUN VAR BYTE ; Variable para almacenar la segunda clave
SETERCER VAR BYTE
SETCUART VAR BYTE
INICIANDO:
FOR R=1 TO 3 ; Programa del led para saber si está funcionando
high LED: HIGH BIP
PAUSE 1000
LOW LED: LOW BIP
pause 150
next
'*********** GUARDA LA CLAVE DE FABRICA ************
EEPROM 0,[1,2,3,4] ' Cargar la memoria eeprom desde cero en adelante
RESET:
FOR R=1 TO 3
high LED: HIGH BIP
PAUSE 50
LOW LED: LOW BIP
pause 50
IF (CUATRO=0) AND (UNO=0) THEN RESET; Corresponden a teclas 7 y C
next
read 0,SETPRIME ; Leer el dato de la eemprom 0 y gardar en setprime
read 1,SETSEGUN
READ 2,SETERCER
READ 3,SETCUART
GOTO TECLAUNO ; Ir a comparar claves
GRABAUNO: ; Programa para cambiar la clave
GOSUB PTECLA: HIGH LED ; Espera a que suelte las teclas
GOSUB BARRIDO: GOSUB PTECLA ; Ir a BARRIDO y retorna a un antirrebote
HIGH LED
WRITE 0, NUMERO ; Guardar en la eemprom 0 el valor de número
GRABADOS:
GOSUB BARRIDO:GOSUB PTECLA
HIGH LED
WRITE 1, NUMERO ; Guardar en la eemprom 1 el valor de número
GRABATRES:
GOSUB BARRIDO:GOSUB PTECLA
HIGH LED
WRITE 2, NUMERO ; Guardar en la eemprom 2 el valor de número
GRABACUATRO:
GOSUB BARRIDO: GOSUB PTECLA
HIGH LED
WRITE 3, NUMERO ; Guardar en la eemprom 3 el valor de número
GOTO RESET
BARRIDO:
LOW A ; Sensar fila A
IF UNO=0 THEN NUMERO=1:RETURN ; Si pulsó la tecla uno devuelvala cargada con 1
if dos=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
IF CUATRO=0 THEN NUMERO=10:RETURN
HIGH a
LOW B ; sensar la fila B
IF UNO=0 THEN NUMERO=4:RETURN
if dos=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
IF CUATRO=0 THEN NUMERO=11:RETURN
HIGH B
LOW C ; sensar la fila C
IF UNO=0 THEN NUMERO=7:RETURN
if dos=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
IF CUATRO=0 THEN NUMERO=12:RETURN
HIGH C
LOW D ; sensar la fila D
IF UNO=0 THEN NUMERO=14:RETURN
if dos=0 THEN NUMERO=0:RETURN
IF TRES=0 THEN NUMERO=15:RETURN
IF CUATRO=0 THEN NUMERO=13:RETURN
HIGH D
PAUSE 10
GOTO BARRIDO
'*** PROGRAMA ANTIRREBOTE***
PTECLA:
HIGH LED:HIGH BIP ; Genera sonido cada que se pulsa una tecla
PAUSE 100
LOW LED:LOW BIP
ESPACIO:
IF UNO=0 THEN ESPACIO ; Si la tecla sigue pulsada ir a ESPACIO
IF DOS=0 THEN ESPACIO
IF TRES=0 THEN ESPACIO
IF CUATRO=0 THEN ESPACIO
PAUSE 25 ; Retorna si se sueltan las teclas
RETURN
'*** COMPARACION DE CLAVES ***
TECLAUNO:
GOSUB BARRIDO ; Ir abarrido y retornar con un valor
GOSUB PTECLA ; Envía a ANTIRREBOTE para soltar tecla
IF NUMERO=SETPRIME THEN TECLADOS
GOTO FALSO
TECLADOS:
GOSUB BARRIDO:GOSUB PTECLA
IF NUMERO=SETSEGUN THEN TECLATRES
GOTO FALSO1
TECLATRES:
GOSUB BARRIDO:GOSUB PTECLA
IF NUMERO=SETERCER THEN TECLACUATRO
GOTO FALSO2
TECLACUATRO:
GOSUB BARRIDO:GOSUB PTECLA
IF NUMERO=SETCUART THEN OPENGE
GOTO FALSO3
OPENGE:
FOR R=1 TO 2
PAUSE 100
HIGH LED:HIGH BIP
PAUSE 100
LOW LED:LOW BIP
NEXT
HIGH DOOR ; Se conecta el relé
PAUSE 1000
LOW DOOR
HIGH A:HIGH B:HIGH C:LOW D ; Sensar solo la fila D
if CUATRO=0 THEN GRABAUNO ; Corresponde tecla D grabar
GOTO TECLAUNO
'*** LAZOS FALSOS-TECLAS ERRÓNEAS ***
FALSO:
GOSUB BARRIDO:GOSUB PTECLA
FALSO1:
GOSUB BARRIDO: GOSUB PTECLA
FALSO2:
GOSUB BARRIDO:GOSUB PTECLA
FALSO3:
FOR R=1 TO 30
PAUSE 150
HIGH LED:HIGH BIP
PAUSE 150
HIGH A:HIGH B:HIGH D:LOW C ; Sensar solo la fila C
if (cuatro=0) and (UNO=0) THEN RESET
NEXT
PANICO:
HIGH LED
PAUSE 500
LOW LED
PAUSE 500
HIGH A:HIGH B:HIGH D:LOW C
if (cuatro=0) and (UNO=0) THEN RESET
GOTO PANICO
END