Autor Tema: Cerradura Electrónica PIC16F877A CCS  (Leído 11481 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jorge_vallejos

  • PIC10
  • *
  • Mensajes: 26
Cerradura Electrónica PIC16F877A CCS
« en: 29 de Enero de 2014, 19:00:41 »
Hola a todos, me dirijo a ustedes para hacerles una consulta. Estoy trabajando en una cerradura electrónica, la cual consta de un administrador y 4 usuarios.

Pero, yo necesito que al presionar, uno de los dos botones que estarán ubicados dentro de la habitación, inmediatamente mande a abrir la puerta. Y no se como hacer eso, ya que elaboré una función, pero, al parecer, no la ejecuta como debía, espero sus comentarios y  aportes.

La función que he creado, lleva por nombre boton, y está al final del código.

Adjunto el código y la simulación, además la librería modificada para el teclado 4x4, saludos cordiales,
Jorge David Vallejos

Código: [Seleccionar]

/*       CERRADURA ELECTRÓNICA CON CAPACIDAD DE 5 USUARIOS
                  UNIVERSIDAD NACIONAL DE INGENIERÍA
                FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN
                      INGENIERÍA ELECTRÓNICA
                      
Asignatura: Electrónica Aplicada.
Autor: Br. Jorge David Vallejos Montiel.
e-mail: jorgevallejos94@hotmail.com
Grupo: 3T1-Eo.
Docente: Ing. Alejandro Méndez.
Fecha: 26/01/2014.
*/

#include <16f877a.h>
#use delay(clock= 4M)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#define use_portb_kbd TRUE       //Puerto B, definido para usar con el teclado.
#include <KBD2.c>       //Incluye la librería para manejar el teclado 4x4
#include <lcd.c>   //Librería para menejo del LCD 16x2
#rom 0x2100={'0','0','0','0'}
#rom 0x2101={'0','0','0','0'}
#rom 0x2102={'0','0','0','0'}
#rom 0x2103={'0','0','0','0'}
#rom 0x2104={'0','0','0','0'}

void menu_inicial(void);
void menu_secundario(void);
void seleccion(void);
void administrador(void);
void usuarios(void);
void clave_usuario(int j);
void entrada(void);
void entrada_usuario(int a);
void boton(void);


char tecla1,opcion;
char clave[4];
int i;

void main(void)
{
lcd_init();    //Inicializamos el LCD
kbd_init();    //Inicializamos el teclado
port_b_pullups(TRUE);  //Activamos las resistencias de pull-up del puerto B



while(TRUE)
{
menu_inicial();
//secundario:
boton();
menu_secundario();
boton();
delay_ms(1000);
boton();
//goto secundario;

}
}


//Funcion menu_inicial
void menu_inicial(void)
{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("UNIVERSIDAD");
lcd_gotoxy(4,2);
lcd_putc("NACIONAL");
delay_ms(700);
lcd_putc("\f");
lcd_gotoxy(7,1);
lcd_putc("DE");
lcd_gotoxy(3,2);
lcd_putc("INGENIERIA");
delay_ms(700);
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("Electronica");
lcd_gotoxy(4,2);
lcd_putc("Aplicada");
delay_ms(1000);
}

//Funcion de menu_secundario
void menu_secundario(void)
{
uno:
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("A:Cambiar clave");
lcd_gotoxy(5,2);
lcd_putc("B:Entrar");
delay_ms(200);



while(TRUE)
{
do{opcion=kbd_getc();
     }while(opcion==0);

if(opcion=='A')
{
seleccion();
delay_ms(1000);
goto uno;
break;
}

if(opcion=='B')
{
entrada();
delay_ms(1000);
goto uno;
break;
}

if(opcion!= 'A' || 'B')
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Tecla incorrecta");
lcd_gotoxy(1,2);
lcd_putc("Reintente");
delay_ms(2000);
goto uno;
break;
}
}
}

// Funcion seleccion
void seleccion(void)
{

lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("A:Administrador");
lcd_gotoxy(1,2);
lcd_putc("B:Usuarios");

while(TRUE)
{

do{opcion=kbd_getc();
     }while(opcion==0);

if(opcion=='A')
{
administrador();
delay_ms(1000);
break;
}
    
if(opcion=='B')
{
usuarios();
delay_ms(1000);
break;
}


if(tecla1!='A'||'B')
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Error de Tecla");
lcd_gotoxy(1,2);
lcd_putc("Reintente");
delay_ms(1000);
break;
}
}
}

//Funcion de clave del administrador.
void administrador(void)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Bienvenido");
lcd_gotoxy(1,2);
lcd_putc("Administrador");
delay_ms(1000);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Clave anterior");

while(TRUE)
{
 
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      
      }
    
if(read_eeprom(0x2100)==read_eeprom(0x2105))

{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("Nueva clave");
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}
for (i=0;i<=3;i++) {
write_eeprom(0x2106,clave[i]);

      }


lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Reingrese clave");
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      }

if(read_eeprom(0x2106)==read_eeprom(0x2105))
{
for (i=0;i<=3;i++) {
write_eeprom(0x2100,clave[i]);
      }
lcd_putc("\f");
lcd_gotoxy(4,1);
lcd_putc("GUARDADO");
}
else
{
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("No coinciden");
lcd_gotoxy(4,2);
lcd_putc("Reintente");
}


}
else
{
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("No coinciden");
lcd_gotoxy(4,2);
lcd_putc("Reintente");
}
delay_ms(1000);
break;

}
}

//Función de clave del Usuario
void clave_usuario(int j)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Bienvenido");
lcd_gotoxy(1,2);
printf(lcd_putc,"Usuario %d",j);
delay_ms(1000);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Clave de Admon.");

i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      
      }
    
if(read_eeprom(0x2100)==read_eeprom(0x2105))
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Clave anterior:");
}
else
{
goto error;
}

while(TRUE)
{
j=(0x2100 + j);
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      
      }

if(read_eeprom(j)==read_eeprom(0x2105))

{
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("Nueva clave");
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}
for (i=0;i<=3;i++) {
write_eeprom(0x2106,clave[i]);

      }


lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Reingrese clave");
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      }

if(read_eeprom(0x2106)==read_eeprom(0x2105))
{
for (i=0;i<=3;i++) {
write_eeprom(j,clave[i]);
      }
lcd_putc("\f");
lcd_gotoxy(4,1);
lcd_putc("GUARDADO");
}
else
{
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("No coinciden");
lcd_gotoxy(4,2);
lcd_putc("Reintente");
}


}
else
{
error:
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("No coinciden");
lcd_gotoxy(4,2);
lcd_putc("Reintente");
}
delay_ms(1000);
break;

}
}

//Función de Usuarios
void usuarios(void)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Ingrese Numero");
lcd_gotoxy(1,2);
lcd_putc("de su usuario");

while(TRUE)
{
do{opcion=kbd_getc();
     }while(opcion==0);

if(opcion=='1')
{
clave_usuario(1);
delay_ms(1000);
break;
}
if(opcion=='2')
{
clave_usuario(2);
delay_ms(1000);
break;
}
if(opcion=='3')
{
clave_usuario(3);
delay_ms(1000);
break;
}
if(opcion=='4')
{
clave_usuario(4);
delay_ms(1000);
break;
}
if(opcion!='1'||'2'||'3'||'4')
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Error de Tecla");
lcd_gotoxy(1,2);
lcd_putc("Reintente");
delay_ms(1000);
break;
}
}
}

//Funcion de entrada
void entrada(void)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Ingrese numero");
lcd_gotoxy(1,2);
lcd_putc("de usuario");

while(TRUE)
{
do{opcion=kbd_getc();
     }while(opcion==0);

if(opcion=='0')
{
entrada_usuario(0);
delay_ms(1000);
break;
}
if(opcion=='1')
{
entrada_usuario(1);
delay_ms(1000);
break;
}
if(opcion=='2')
{
entrada_usuario(2);
delay_ms(1000);
break;
}
if(opcion=='3')
{
entrada_usuario(3);
delay_ms(1000);
break;
}
if(opcion=='4')
{
entrada_usuario(4);
delay_ms(1000);
break;
}
if(opcion!='0'||'1'||'2'||'3'||'4')
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Error de Tecla");
lcd_gotoxy(1,2);
lcd_putc("Reintente");
delay_ms(1000);
break;
}
}
}

void entrada_usuario(int a)
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Ingrese su Clave");
a=(0x2100 + a);
i=0;
while(i<=3)
{
tecla1=kbd_getc();
if(tecla1!=0)
{
clave[i]=tecla1;
i++;
lcd_gotoxy(i,2);
lcd_putc("*");
}
}

for (i=0;i<=3;i++) {
write_eeprom(0x2105,clave[i]);
      
      }
    
if(read_eeprom(a)==read_eeprom(0x2105))
{
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("ABRA LA PUERTA");
output_high(Pin_A0);
delay_ms(2000);
output_low(Pin_A0);
}
else
{
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("CLAVE INCORRECTA");
lcd_gotoxy(4,2);
lcd_putc("REINTENTE");
delay_ms(2000);
}
}

//Función abrir puerta por botón
void boton(void)
{
while(TRUE)
{
if(input(PIN_C0)==0 ||input(PIN_C1)==0)
{
lcd_putc("\f");
lcd_gotoxy(2,1);
lcd_putc("ABRA LA PUERTA");
output_high(Pin_A0);
delay_ms(2000);
output_low(Pin_A0);
break;
}
else
break;
}
}
« Última modificación: 29 de Enero de 2014, 19:09:35 por jorge_vallejos »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Cerradura Electrónica PIC16F877A CCS
« Respuesta #1 en: 29 de Enero de 2014, 21:22:15 »
Por lo que puedo entender, en la funcion menu_secundario(), al leer el teclado matricial, es donde el do-while nunca termina hasta que aprietes alguna tecla. Por ello, las funciones de boton no se pueden leer continuamente y no se ejecutara su codigo a menos que mantengas apretado una tecla y un boton al mismo tiempo.

Desconectado jorge_vallejos

  • PIC10
  • *
  • Mensajes: 26
Re: Cerradura Electrónica PIC16F877A CCS
« Respuesta #2 en: 29 de Enero de 2014, 23:07:22 »
El problema es que si quito el do while tengo problemas con el teclado más adelante. He estado pensando en hacer una interrupción, pero por el momento, nunca me he puesto a probar como hacer una. Según, he escuchado comentarios de que se necesita tener todo el puerto B libre para poder hacer dichas interrupciones.

Alguna idea para poder solucionar el problema? Son las interrupciones la única salida o es posible hacer lo que quiero de otra manera?

Muchas gracias por sus aportes.

Saludos cordiales!!!   :-/

Desconectado jorge_vallejos

  • PIC10
  • *
  • Mensajes: 26
Re: Cerradura Electrónica PIC16F877A CCS
« Respuesta #3 en: 06 de Febrero de 2014, 00:28:33 »
Siguiendo con el tema de la cerradura, no me daba cuenta que solo guarda el último dato de la contraseña, es decir, si yo le guardo al administrador la contraseña 0294, al momento de entrar si pongo 0124 entra también, todo es que lleve el último dígito.

No se como solucionarlo, ya hasta dolor de cabeza me dio de estar pensando, también, quisiera que por medio de un botón resetear todas las contraseñas a 0000 pero tampoco tengo idea de como hacerlo.

¿Algún comentario o ayuda al respecto?
Muchas gracias!!!

Desconectado el_greg

  • PIC10
  • *
  • Mensajes: 15
Re: Cerradura Electrónica PIC16F877A CCS
« Respuesta #4 en: 01 de Abril de 2015, 21:58:55 »
hola amigo, ya culminastes este proyecto?? saludos
lo que sabemos es una gota de agua, lo que ignoramos el oceano
a medida que aprendo mas, me doy cuenta que menos se

Desconectado jorge_vallejos

  • PIC10
  • *
  • Mensajes: 26
Re: Cerradura Electrónica PIC16F877A CCS
« Respuesta #5 en: 03 de Abril de 2015, 00:36:06 »
Hola amigo, dejé de trabajar en el proyecto por falta de tiempo, saludos!!!