Se me complicó más el asunto así que mejor les explico desde el principio... Yo quiero hacer una cerradura electrónica, lo estoy simulando en ISIS de Proteus 7.4 y programando con el PCW 4.088. La idea es que si el usuario llegara a presionar el código correcto que yo defino como "123", el LCD desplegara el mensaje "CORRECTO" para confirmar. Suceden 2 problemas:
1) Cuando presiono el número 1 y luego otro número, el que sea, el programa se me devuelve a main, desplegando el mensaje "HOLA MUNDO", cosa que no debería pasar porque según el programa se debería ir a la etiqueta "comparar". Esto no sucede si presiono cualquier otro número primero. Por ejemplo, si digito en el teclado 213, el flujo del programa es el correcto.
2) Y mas importante... Aún si cambio el código correcto a 213 por ejemplo para no tener el problema anterior, no me reconoce que estoy digitando el código correcto, creo que tengo un problema con los IFs anidados.
El programa revisa el código digitado cuando presiono la tecla "=" del teclado en el Proteus, que yo llamo ENTER. Es ahí cuando se inicializa el puntero, se compara si el número digitado es igual al número que debería digitar, si es así, se incrementa el puntero y compara de nuevo hasta que todas las comparaciones sean correctas y se despliegue "CORRECTO" en el LCD.
Les escribo el código aquí y les adjunto el archivo del ISIS para que puedan simular el programa, junto con el "lcd_mod.c" que uso para manejar el LCD en vez del lcd.c
Aquí les va el código para que lo chequeen, igual está en el archivo Cerradura simple.c que les adjunté en el link:
#include <16F877A.h> /// libreria para el manejo del pic16f877a
//#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
//ERROR SOLUCIONADO: *pnum=1; antes de break; en case 0 ocasiona que se devuelva
//a HOLA MUNDO, hay que poner esa linea al principio de case 0
#use delay(clock=4000000) //4MHz
#byte port_a=0X05
#byte port_b=0X06
#byte port_c=0X07
#byte port_d=0X08
#byte port_e=0X09
#org 0x1F00, 0x1FFF {}//para proteger el código
#include <lcd_mod.c> // Librería para el manejo del lcd para ver las conexiones
// abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c
// y ahi les muestra.
// As defined in the following structure the pin connection is as follows:
// D0 unusued
// D1 rw
// D2 rs
// D3 enable
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.
//#define use_portc_lcd TRUE
int num1=0; //tiene la direccion del dato de la tecla presionada
int *pnum=&num1; //puntero que direcciona donde apunta num1
int x=0; //corre el cursor del lcd con cada numero
void data_av(){
while(port_e=4){} // Espere a que se termine de presionar la tecla
while(port_e!=4){} // Espere a que se presione una tecla
return;
}
void main(){
set_tris_a(0xFF);
set_tris_b(0x0);
set_tris_c(0xFF);
set_tris_d(0x0);
set_tris_e(0x4);
port_e=0;
port_b=0;
x=0; //inicializa posicion del cursor del lcd
lcd_init(); // Antes de usar el lcd,hay que inicializarlo
lcd_putc(" HOLA MUNDO");
delay_ms(1000);
lcd_putc("\f"); //Borra el mensaje anterior
comparar:
data_av();
switch(port_c){
case 0:{
// *pnum=1;
x++; //correr cursor
pnum++; //apunto a siguiente direccion
port_b=1; //confirmar que numero se presiona
lcd_putc("1");
*pnum=1;
break;
}
case 1:{
x++;
pnum++;
port_b=2;
lcd_putc("2");
*pnum=2;
break;
}
case 2:{
pnum++;
port_b=3;
lcd_putc("3");
*pnum=3;
break;
}
case 4:{
pnum++;
port_b=4;
lcd_putc("4");
*pnum=4;
break;
}
case 14:{ // caso ENTER
pnum = &num1;
pnum++;
if(*pnum==1){
pnum++;
if(*pnum==2){
pnum++;
if(*pnum==3){ //Si se presiono el codigo
port_b=255; //123, prenda todo el port_b
lcd_putc("\f");
lcd_putc("CORRECTO");
delay_ms(2000);
lcd_putc("\f");
port_b=0;
break;
}
else{
pnum=&num1;
}
}
else{
pnum=&num1;
}
}
else{
pnum=&num1;
}
break;
}
default:
port_b=0;
break;
}
port_e=0;
goto comparar;
} // fin de programa