tengo un pequeño problemin con este programa escrito en PBP, el programa lo saque de una pagina en internet y consiste en un candado electronico con clave
lo raro es que lo simulo en proteus y me va de maravilla

estoy usando un pic 16f877a, una botonera simple montada en un protoboard con resistencias de 10k (ver proteus para ver como lo tengo) y un display lcd de 16x2.
todo funciona bien ecepto cuando apreto por primera ves la tecla numero 1, ya que me aparece el mensaje PROCESSING... y luego WRONG PASSWORD
y segun la secuencia de este programa deberia decir ENTER THE FIRST NUMBER
esto solo sucede la primera ves ya que al segundo intento el programa corre de maravilla.
aqui les dejo el codigo
DEFINE LCD_DREG PORTA 'Comunicación con el LCD por el puerto A
DEFINE LCD_DBIT 0 'El bus de datos del LCD comienza en el bit 0
DEFINE LCD_BITS 4 'Bus del LCD en modo de 4 bits
DEFINE LCD_LINES 2 ' LCD de dos lineas
DEFINE LCD_EREG PORTB ' Setea el portb para LCD Enable
DEFINE LCD_EBIT 0 ' Setea el bit 0 para LCD Enable
DEFINE OSC 20 ' 4 MHz del Oscilador
NUM var byte ' Variable para almacenar el numero leido del teclado
FKY var byte ' Flag para identificar el metodo que invoca la lectura
cont var byte ' variable para contar los errores
TRISB = %01110000 ' RB7, RB3 - RB1 como salidas, (0 = output y 1 = input)
TRISA = $0 ' Todo el puerto A como salidas
PORTB.7 = 0
pause 500 'Inicialización
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "IPN-INFORMATICS" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "ENGINEERING" ' Despliega mensaje
pause 2000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " ELECTRONIC " ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout " LOCK " ' Despliega mensaje
pause 1500
INICIO: Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " PUSH 1 TO " ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "ENTER PASSWORD"
pause 500
MSG: PORTB = $2 ' Se energiza el primer renglon
IF PORTB = $12 then ' ¿Se presionó el numero 1?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 1000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE FIRST" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
goto KEY1
Endif
goto MSG
KEY1: FKY = 1 ' Estamos en el primer numero
IF NUM = 5 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY2
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY2: FKY = 2 ' Estamos en el segundo numero
IF NUM = 7 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY3
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY3: FKY = 3 ' Estamos en el segundo numero
IF NUM = 3 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY4
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY4: FKY = 4 ' Estamos en el segundo numero
IF NUM = 9 then ' ¿se presionó el numero correcto?
pause 500
goto EXITO
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
LEER: PORTB = $2 ' Se energiza el primer renglon
NUM = 0 ' Suponemos que no se ha presionado ningun numero
IF PORTB = $12 THEN NUM = 1 ' ¿Se presionó el numero 1?
IF PORTB = $22 THEN NUM = 2 ' ¿Se presionó el numero 2?
IF PORTB = $42 THEN NUM = 3 ' ¿Se presionó el numero 3?
PORTB = $4 ' Se energiza el segundo renglon
IF PORTB = $14 THEN NUM = 4 ' ¿Se presionó el numero 4?
IF PORTB = $24 THEN NUM = 5 ' ¿Se presionó el numero 5?
IF PORTB = $44 THEN NUM = 6 ' ¿Se presionó el numero 6?
PORTB = $8 ' Se energiza el tercer renglon
IF PORTB = $18 then NUM = 7 ' ¿se presionó el numero 7?
IF PORTB = $28 THEN NUM = 8 ' ¿Se presionó el numero 8?
IF PORTB = $48 THEN NUM = 9 ' ¿Se presionó el numero 9?
IF FKY = 1 then goto KEY1
IF FKY = 2 then goto KEY2
IF FKY = 3 then goto KEY3
IF FKY = 4 then goto KEY4
EXITO: Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " OPEN LOCK :-) " ' Despliega mensaje
pause 5000
cont = 0
Lcdout $fe, 1 ' Limpia pantalla LCD
goto INICIO
ERROR: cont = cont + 1
num=0
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "WRONG PASSWORD" ' Despliega mensaje
if cont => 4 then goto ALARMA
pause 1000
goto INICIO
ALARMA: PORTB.7 = 0
Lcdout $fe, 1 ' Limpia pantalla LCD
PAUSE 200
Lcdout "! ALARM !"
PORTB.7 = 1
Pause 200
goto ALARMA
ENDbueno tambien dejare los archivos con la simulacion en proteus en
http://rapidshare.de/files/38984314/ElectronicLockPIC16F877A.rar.htmldesde ya muchas gracias por cualquier sugerencia y/o ayuda.