Autor Tema: Duda con Cerradura Electronicaa  (Leído 1766 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Duda con Cerradura Electronicaa
« en: 30 de Diciembre de 2013, 20:47:43 »
Hola compañeros, acabo de terminar una simulacion de una Cerradura Electronica con su respectivo codigo en CCS, la cerradura permite 6 usuarios donde cada uno tiene una contraseña diferente, la simulacion permite cambiar la contraseña de cada usuario siempre y cuando hallan ingresado su contraseña anterior. Mi duda es la siguiente: El sistema posee un menu de ingreso de contraseña y de cambio de contraseña, cuando un usuario accede a esas opciones no tiene retorno al menu principal, la unica manera para retornar es presionando el MCLR del microcontrolador, he aqui mi duda, es bueno usar el master clear como retorno?? si no es buena practica usarlo me podrian dar consejos de como hacer un retorno sin usar el master clear. Les agradeceria su apoyo, les dejo mi codigo a continucacion y en adjunto la simulacion.

Código: [Seleccionar]
#include <16f877a.h>
#fuses xt, nowdt
#use delay (clock=4M)

#include <lcd.c>
#include <kbd2.c>
#rom 0x2100={1,2,3,4}
#rom 0x2104={5,6,7,8}
#rom 0x2108={9,0,1,2}
#rom 0x210C={3,4,5,6}
#rom 0x2110={7,8,9,0}
#rom 0x2114={0,1,2,3}

void cambiar_cont();       //Funcion para cambiar contraseña
void ingreso_cont();       //Funcion para ingresar contraseña
void detectar_usuario();   //Funcion para detectar usuarios

char k,clave_key[4],memoria[4],press_key[4];
int usuario,i,j,l,pass;

void main()
{
   usuario=0;
   i=0;
   k=0;
   pass=0;
   j=0;
   l=0;
   lcd_init();
   kbd_init();
   port_b_pullups(true);
      uno:
      lcd_gotoxy(1,1);
      lcd_putc("Ingresa Cont-->A");
      lcd_gotoxy(1,2);
      lcd_putc("Cambiar Cont-->B");
   while (true)
   {       
      do{
         k=kbd_getc();
      }while(k=='\0');

         if(k=='A')                       //Ingreso de Contraseña
         {
            detectar_usuario();
            lcd_gotoxy(1,2);
            printf(lcd_putc,"%u",usuario);
            delay_ms(500);
            lcd_putc("\f");
            ingreso_cont();
            if(pass==1)                   //Si en la funcion ingreso_cont() paso la comprobacion, entonces dara acceso total
            {
               lcd_putc("\f");
               lcd_gotoxy(2,1);
               printf(lcd_putc,"Puerta Abierta");
               output_high(PIN_C0);
            }
        break;
        }
         
        if (k=='B')                      //Cambio de Contraseña
        {
            detectar_usuario();
            lcd_gotoxy(1,2);
            printf(lcd_putc,"%u",usuario);
            delay_ms(500);
            lcd_putc("\f");
            cambiar_cont();
            if(pass==0)
            {
               lcd_putc("\f");
               lcd_gotoxy(2,1);
               printf(lcd_putc,"Puerta Cerrada");   //Si en la funcion ingreso_cont() no paso la comprobacion, entonces denegara el acceso     
               delay_ms(1000);
            }       
       break;
       }
     
       if(k!='A' && k!='B')
       {
            lcd_putc("\fTecla incorrecta\ncorrija x favor.");
            delay_ms(2000);
            goto uno;
       }
   }
}
 
void detectar_usuario()          //Funcion para detectar el Numero de usuario antes de ingresar o cambiar contraseña
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   printf(lcd_putc,"N%c de Usuario",0xDF);   
   delay_ms(500);
   do{
   k=kbd_getc();
   }while(k=='\0');

   switch(k)                     //La variable i es utilizada en el arreglo de lectura de la memoria eeprom
   {                             //La variable l es utilizada en el arreglo para la escritura de la memoria eeprom
   case '1':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 1");
      usuario=1;
      i=0;
      l=0;
   break;
   
   case '2':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 2");
      usuario=2;
      i=4;
      l=4;
   break;
   
   case '3':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 3");
      usuario=3;
      i=8;
      l=8;
   break;
   
   case '4':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 4");
      usuario=4;
      i=12;
      l=12;
   break;
   
   case '5':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 5");
      usuario=5;
      i=16;
      l=16;
   break;
   
   case '6':
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Usuario 6");
      usuario=6;
      i=20;
      l=20;
   break;
   
   default:
      lcd_putc("\f");
      lcd_gotoxy(1,1);
      lcd_putc("Usuario Invalido");
   }
}

void ingreso_cont()

   lcd_gotoxy(4,1);
   printf(lcd_putc,"Contrase%ca",0xEE);
   j=0;
   while(j<=3)                         //Ingreso de la Contraseña mediante el teclado 4x4
   {
      k=kbd_getc();
      if(k!=0)
      {
         clave_key[j]=k-48;
         j++;     
         lcd_gotoxy(j,2);
         printf(lcd_putc,"%u",k-48);
         delay_ms(500);
      }
   }
   
   for (j=0;j<=3;j++)               //Lectura de la eeprom
   {
      memoria[j]=read_eeprom(i);
      i++;
   }   
   
   if ((memoria[0]==clave_key[0])&&(memoria[1]==clave_key[1])&&(memoria[2]==clave_key[2])&&(memoria[3]==clave_key[3]))     //Comprobacion de la contraseña ingresada por el usuario vs contraseña en la eeprom
   {
      pass=1;
   }
   else
   {
      pass=0;           
   }
}

void cambiar_cont()
{
   ingreso_cont();         //Primero se comprueba la contraseña actual para poder cambiarla
   j=0;
   if(pass==1)
   {
      lcd_putc("\f");
      lcd_gotoxy(3,1);
      printf(lcd_putc,"Puede Cambiar");
      while(j<=3)                         //Una vez comprada la contraseña se permite escribir en la eeprom la nueva contraseña
      {
         k=kbd_getc();
         if(k!=0)
         {
            press_key[j]=k-48;                       
            write_eeprom(l,press_key[j]);
            j++;
            lcd_gotoxy(j,2);
            printf(lcd_putc,"%u",k-48);
            delay_ms(200);
            l++;
         }
      }
      lcd_putc("\fGuardando.");
      delay_ms(500);
      lcd_putc("\fGuardando..");
      delay_ms(500);
      lcd_putc("\fGuardando...");
      delay_ms(500);
      lcd_putc("\fListo :-)");
   }
   else
   {
      lcd_gotoxy(1,1);
      printf(lcd_putc,"\fCont no Valida");   //En caso de que no pase la contraseña actual
   }   
}

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Duda con Cerradura Electronicaa
« Respuesta #1 en: 30 de Diciembre de 2013, 21:47:15 »
puedes usar RESET_CPU().... en vez del pin MCLR
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda con Cerradura Electronicaa
« Respuesta #2 en: 30 de Diciembre de 2013, 21:48:20 »
puedes usar RESET_CPU().... en vez del pin MCLR

No me parece una muy buena idea utilizar reset_cpu() en un microcontrolador 16F877A, ya que no descarga el stack ni reinicia los módulos, etc.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Re: Duda con Cerradura Electronicaa
« Respuesta #3 en: 30 de Diciembre de 2013, 23:09:29 »
Cual seria entonces su sugerencia para que cuando el usuario elija una opcion y despues de haber aceptado vuelva al menu principal. No se como hacerle sin usar el MCLR. Ayudenme porfa!!!!

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Duda con Cerradura Electronicaa
« Respuesta #4 en: 30 de Diciembre de 2013, 23:20:10 »
Hola.
Para mi tendria que, una vez que ha validado al usuario y si este desea modificar la password,llamar a una subrutina o procedimiento,  solicitarle la password 2 veces, verificar que haya coincidencia en los dos ingresos, almacenar la password nueva y luego volver al ciclo normal del programa. Nada de reset.

Con respecto a la solucion ........ ( AUTO CENSURADO )   NO COMENT !!!!

Saludos.


 

anything