@ DEVICE pic16F628A
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_Off ' Master Clear Opción interno
@ DEVICE LVP_Off ' Bajo voltaje de programación
@ DEVICE CPD_Off ' Protección del código de memoria OFF
@ DEVICE PROTECT_Off' protección de código OFF
Define Osc 4
CmCon=7
TrisA=%00001111
TrisB=0
EEPROM 0,[5,6,7,8]
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1 'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3 'EN EL BIT B.3
'----------------------
X VAR BYTE
ALMACEN VAR BYTE[4]
EPROM VAR BYTE[4]
SALIDA VAR PORTB.2
Flag var bit
Cont var byte
Var1 var word
'----------------------
COLUMNA1 VAR PORTA.4
COLUMNA2 VAR PORTA.7
COLUMNA3 VAR PORTA.6
FILA1 VAR PORTA.0
FILA2 VAR PORTA.1
FILA3 VAR PORTA.2
FILA4 VAR PORTA.3
'---------------------
x=0
for cont=0 to 3
READ cont,EPROM[cont]
next cont
'---------------------
flag=0
gosub mmenu
low salida
high porta.5
Inicio:
Call Teclado
GOTO INICIO
END
Teclado:
high COLUMNA1 ' Columna 1 = 0
If FILA1 Then VAR1 = 1 :gosub keyc ' tecla "1"
If FILA2 Then VAR1 = 4 :gosub keyc ' tecla "4"
If FILA3 Then VAR1 = 7 :gosub keyc ' tecla "7"
If FILA4 Then VAR1 = 10:gosub keyc ' tecla "*"
low COLUMNA1 ' Columna 1 = 1
high COLUMNA2 ' Columna 2 = 0
If FILA1 Then VAR1 = 2:gosub keyc ' tecla "2"
If FILA2 Then VAR1 = 5:gosub keyc ' tecla "5"
If FILA3 Then VAR1 = 8:gosub keyc ' tecla "8"
If FILA4 Then VAR1 = 11:gosub keyc ' tecla "0"
low COLUMNA2 ' Columna 2 = 1
high COLUMNA3 ' Columna 3 = 0
If FILA1 Then VAR1 = 3 :gosub keyc ' tecla "3"
If FILA2 Then VAR1 = 6 :gosub keyc ' tecla "6"
If FILA3 Then VAR1 = 9 :gosub keyc ' tecla "9"
If FILA4 Then VAR1 = 12:gosub keyc ' tecla "#"
low COLUMNA3
RETURN
keyC:
if var1=12 then
if not salida then toggle flag:x=0:gosub mMenu
else
ALMACEN[X] = VAR1
LCDOUT $FE,$C6+x,"*"
x=x+1
if x=>4 then Gosub verificar
if var1=10 then LCDOut $FE,1,"DIGITE LA CLAVE":X=0
endif
PAUSE 500
Return
mMenu:
if flag then
lcdout $FE,1,"INTRODUCIR CLAVE":
else
lcdout $FE,1,"DIGITE CLAVE":
endif
return
VERIFICAR:
IF FLAG THEN
for cont=0 to 3
WRITE cont,almacen[cont]:pause 10
read cont,eprom[cont]
next cont
LCDOut $FE,1,"CAMBIO CLAVE"
ELSE
X=1
for Cont=0 to 3
if almacen[cont]<>eprom[cont] then x=0
next cont
if x=1 THEN
TOGGLE SALIDA
LCDOut $FE,1,"CAMBIO DE ESTADO"
else
LCDOut $FE,1,"CLAVE INCORRECTA"
ENDIF
ENDIF
pause 500
flag=0
gosub mmenu
X=0
return