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
/* 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;
}
}