jaja que suerte justo me preguntaba cuando me pongo hacer el proyectito de la cerradura con clave y aparecio batman , me ahorrastes cerebro batman y bueno me gusto la forma como tratas tu codigo bueno pude llegar a no sobrepasar los 1k de codigdel 84 con el teclado de 4*4 (key calc del proteus ) y con 5 digitos de clave le queria poner seis pero no me daba la memoria del chip ni la mia pero se podria hacer algo con la rutina data creo pues eso lo grava al inicio de el grabado y de repente u contador para llenar la eeprom del pic bueno la idea ya esta puesta aunque espero comprendas mi codigo y creo que si pues simule el que modifique del tuyo y funciona en proteus y deberia de funcionar si lo implemento ya luego te cuento pero te dejo el codigo para que lo mastiques
DEFINE LCD_DREG PORTB " Setea el puertos de datos del LCD por el puerto B
DEFINE LCD_DBIT 0 " Setea el bit de comienzo de datos (0 o 4) si el bus es de 4-bit
DEFINE LCD_RSREG PORTA " Setea el port LCD Register Select
DEFINE LCD_RSBIT 1 " Setea el bit LCD Register Select
DEFINE LCD_EREG PORTA " Setea el port LCD Enable
DEFINE LCD_EBIT 0 " Setea el bit LCD Enable
DEFINE LCD_BITS 4 " Setea el tamaño del bus LCD (4 o 8 bits)
DEFINE LCD_LINES 2 " Setea el numero de lineas en el LCD
a var word " definicion de variables
tecla var word
n1 var byte
n2 var byte
n3 var byte
n4 var byte
n5 var byte
eprom1 var byte
i var byte
R VAR BYTE
n var byte
j var byte
M var byte
FILA_0 VAR BYTE
FILA_1 VAR BYTE
FILA_2 VAR BYTE
FILA_3 VAR BYTE
n1 = "1" " asigno valor a las variables
n2 = "5" " el valor es equivalente en asccII
n3 = "9"
n4 = "7"
n5 = "/"
eprom1 = "0"
pause 100 " inicio el programa
read 0, eprom1
If eprom1 = 255 Then gravar_clave
GoTo publicidad
gravar_clave:
WRITe 0, n1
WRITe 1, n2
WRITe 2, n3
WRITe 3, n4
write 4, n5
LCDOUT $FE,1," CLAVE GRAVADA "
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
"GOTO publicidad
publicidad: " CICLO INICAL DEL LCD MUESTRA
GoSub tiempo_05 " MENSAJE DE BIENVENIDA
LCDOUT $FE,1," ACCESO à NANDO"
GoSub tiempo_05 " aqui hay que poner una rutina
OPTION_REG = 0
TRISB = %11111110 "Activamos Pull-up
IF portb= $7e then goto clave
LCDOUT $FE,$C0," Electronica "
GoSub tiempo_05 " LEE EL TECLADO A VER SI ES "*"
" SI NO ES CONTINUA MOSTRANDO MENSAJE
OPTION_REG = 0
TRISB = %11111110 "Activamos Pull-up
if portb=$7e then goto clave
LCDOUT $FE,1," "
GoTo publicidad
teclado:
COLUMNA_0:
R = 0
TRISB = %11111110
portb 0# = 0
GoTo PREGUNTA
COLUMNA_1:
R = R + 1
TRISB = %11111101
portb 0.1 = 0
GoTo PREGUNTA
COLUMNA_2:
R = R + 1
TRISB = %11111011
portb 0.2 = 0
GoTo PREGUNTA
COLUMNA_3:
R = R + 1
TRISB = %11110111
portb 0.3 = 0
GoTo PREGUNTA
GoTo teclado
suelta:
if (portb&%11110000)=$f0 then visualiza
GoTo suelta
visualiza:
lookup j, ["741C8520963=/*-+"], tecla
Return
clave:
LCDOUT $FE,1," Digite su Clave"
GoSub tiempo_05
GoSub tiempo_05
GoSub teclado
SWAP tecla, n1
i = 0
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n2
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n3
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n4
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n5
GoSub lcd_sal
GoSub tiempo_05
read 0, eprom1
If eprom1 = n1 Then miro_dos
incorrecto:
LCDOUT $FE,1,"Clave Incorrecta"
GoSub tiempo_05
GoTo publicidad
miro_dos:
read 1, eprom1
If eprom1 = n2 Then miro_tres
GoTo incorrecto
miro_tres:
read 2, eprom1
If eprom1 = n3 Then miro_cuatro
GoTo incorrecto
miro_cuatro:
read 3, eprom1
If eprom1 = n4 Then miro_cinco
GoTo incorrecto
miro_cinco:
read 4, eprom1
If eprom1 = n5 Then menu
menu:
LCDOUT $FE,1," Selecione "
GoSub tiempo_05
GoSub tiempo_05
LCDOUT $FE,1,"1_Abrir Puerta"
GoSub tiempo_05
LCDOUT $FE,$C0,"2_Cambiar Clave"
GoSub teclado
If tecla = "1" Then GoTo abrir
If tecla = "2" Then GoTo nueva_clave
"if tecla != "1" and tecla!= "2" then LCDOUT $FE,1,"TECLA INCORRECTA "
LCDOUT $FE,1,"TECLA INCORRECTA "
GoSub tiempo_05
GoSub tiempo_05
GoTo menu
abrir:
high porta.3
LCDOUT $FE,1," Bienvenido "
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
GoSub tiempo_05
low porta.3
GoTo publicidad
nueva_clave
LCDOUT $FE,1," Digite su Nueva"
LCDOUT $FE,$C0,"Clave:"
GoSub tiempo_05
i = 2
GoSub teclado
SWAP tecla, n1
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n2
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n3
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n4
GoSub lcd_sal
GoSub tiempo_05
GoSub teclado
SWAP tecla, n5
GoSub lcd_sal
GoSub tiempo_05
GoTo gravar_clave
tiempo_05:
pause 500
Return
lcd_sal:
LCDOUT $FE,$C5+i,"X"
i = i + 1
Return
PREGUNTA:
M = 4 * R
FILA_0=($E0 +(portb&%00001111))
FILA_1=($D0 +(portb&%00001111))
FILA_2=($B0 +(portb&%00001111))
FILA_3=($70 +(portb&%00001111))
If portb = FILA_0 Then j = M
M = M + 1
If portb = FILA_1 Then j = M
M = M + 1
If portb = FILA_2 Then j = M
M = M + 1
If portb = FILA_3 Then j = M
if (portb&%11110000)<>$f0 then suelta
If R = 0 Then COLUMNA_1
If R = 1 Then COLUMNA_2
If R = 2 Then COLUMNA_3
GoTo teclado