Sayfalar

Menü

23 Kasım 2020 Pazartesi

Şifreli kilit eeprom Şİfre değiştirme (ALINTI)

Şifreli kilit eeprom Şİfre değiştirme (ALINTI) örnek uygulama

#INCLUDE <16f887.h>

//#USE DELAY(CLOCK=4000000) // Reloj 4MHz

#use delay(clock=4000000,crystal)//Crystal Externo 4MHz

#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,NOPUT,NOLVP


//Definiciones para colocar el LCD y el teclado en el puerto B

#DEFINE USE_PORTB_LCD TRUE

#DEFINE USE_PORTB_KBD TRUE  

 

//Librerías del LCD y Teclado

#INCLUDE <LCD.C>

#INCLUDE <KBD.C> 


//Definiciones

#BYTE PORTC= 7

#BYTE PORTB= 6

#DEFINE LED1 PORTC,4

#DEFINE LED2 PORTC,7


//Variables Globales

CHAR K;

INT8 MIL,CEN,DEC,UNI,VAL;

INT16 contra=9999; //Variable entera para almacenar la contraseña

INT8 sinal; //Variable para saber si tengo contraseña


VOID TECLADO()

{

   k=kbd_getc(); //Llamar la función del teclado y almacenar

   //el valor digitado en una variable tipo

   //carácter. Si no se oprime ninguna tecla el

   //teclado retornara el carácter nulo.*/

   WHILE(k=='\0') //si no se oprime ninguna tecla sigue llamando al teclado.

   {

      k=kbd_getc();

   }

   IF( (k!='\0'))

   {

      IF(K=='0')//Si K es igual a cero

         VAL=0;//Val es igual a cero

      IF(K=='1')

         VAL=1;

      IF(K=='2')

         VAL=2;

      IF(K=='3')

         VAL=3;

      IF(K=='4')

         VAL=4;

      IF(K=='5')

         VAL=5;

      IF(K=='6')

         VAL=6;

      IF(K=='7')

         VAL=7;

      IF(K=='8')

         VAL=8;

      IF(K=='9')

         VAL=9;

   }

}


//Rutina para pedir la clave

void pedir_clave(void)

{

      TECLADO();

      

      IF((k!='#')&&(k!='*'))

      {

         lcd_putc('*');

         MIL=VAL;

      }

      if(k=='*' || k=='#')

         return;

      TECLADO();

      IF((k!='#')&&(k!='*'))

      {

         lcd_putc('*');

         CEN=VAL;

      }

      if(k=='*' || k=='#')

         return;

      TECLADO();

      IF((k!='#')&&(k!='*'))

      {

         lcd_putc('*');

         DEC=VAL;

      }

      if(k=='*' || k=='#')

         return;

      TECLADO();

      IF((k!='#')&&(k!='*'))

      {

         lcd_putc('*');

         UNI=VAL;

      }

      if(k=='*' || k=='#')

         return;

   

}


int validar_clave(void)


{

   //Variables locales

   int16 clave=0,m,c,d,u;

   

   /* Para realizar la multiplicación cuando se tienen numeros del tipo int8, 

      como por ejemplo 100 con otro tipo int8 como por ejemplo CEN, el programa

      hará un producto int8, sin embargo se desea un resultado int16, por lo 

      tanto debe informarce al compilador por medio de un 'cast' (c=(int16)CEN*100)

      o utilizando la función de multiplicación de tipos del compilador (_mul)*/

      

   m=MIL*1000; //Convierto miles a numero

   //c=_mul(CEN,100); //Otra alternativa para multiplicar int8*int8=int16

   c=(int16)CEN*100; //Convierto centemas, haciendo un CAST para obtener un int16

   d=DEC*10; //Convierto decenas a numero 

   u=UNI; //Convierto unidades a numero 

   

   clave=m+c+d+u;

   //Borra lo último que fue digitado en el teclado

   MIL=0;CEN=0;DEC=0;UNI=0; 

   if(clave==contra) //Si la clave es igual a la contraseña

      return(1);

   else

      return(0);

}


void cambio_clave(void)

{

      int bandera=0;

      int16 clave=0,m,c,d,u;

      

      LCD_PUTC("\f");

      LCD_GOTOXY(1,1);

      LCD_PUTC("CLAVE ACTUAL");

      LCD_GOTOXY(1,2);      

      pedir_clave(); //Llama la funcion de pedir la clave

      //bandera=validar_clave(); //Compruebo si la clave actual es correcta

      if(validar_clave())

      {

         LCD_PUTC("\f");

         LCD_GOTOXY(1,1);

         LCD_PUTC("CLAVE NUEVA  ");

         LCD_GOTOXY(1,2);   

         TECLADO();

         IF((k!='#')&&(k!='*'))

         {

            lcd_putc('*');

            MIL=VAL;

         }

        

         TECLADO();

         IF((k!='#')&&(k!='*'))

         {

            lcd_putc('*');

            CEN=VAL;

         }

         

         TECLADO();

         IF((k!='#')&&(k!='*'))

         {

            lcd_putc('*');

            DEC=VAL;

         }

         

         TECLADO();

         IF((k!='#')&&(k!='*'))

         {

            lcd_putc('*');

            UNI=VAL;

         }

         

         m=MIL*1000; //Convierto miles a numero

         c=CEN*10; //Convierto centemas a numero y lo sumo al anterior

         c=c*10;

         d=DEC*10; //Convierto decenas a numero y lo sumo al anterior

         u=UNI; //Convierto unidades a numero y lo sumo al anterior

         

         clave=m+c+d+u;

         

         contra=clave;

         WRITE_EEPROM(0,MIL); //Guarda en la eemprom posicion cero la nueva contraseña

         WRITE_EEPROM(1,CEN);

         WRITE_EEPROM(2,DEC);

         WRITE_EEPROM(3,UNI);

         WRITE_EEPROM(4,12); //Guardo un 12 en la posicion 1 de la EEPROM, para decir que tengo

                              //una contraseña guardada

         

      }

      else

      {

         LCD_PUTC("\f");

         LCD_GOTOXY(1,2);

         LCD_PUTC(" CLAVE INVALIDA ");

         BIT_SET(LED2);

         DELAY_MS(4000);

         BIT_CLEAR(LED2);

         LCD_PUTC("\f");

      }

}

VOID MAIN()

{

   //Variables Locales

   int16 m,c,d,u;

   INT8 m1,c1,d1,u1;

   

   //Puerto C como Salida

   SET_TRIS_C(0B00000000);

   PORTC=0; //Limpia Puerto C

   

   lcd_init(); //Inicializa el LCD

   kbd_init(); //Inicializa el Teclado

 

   //Configura las Resistencias PULL-UP del Puerto B

   port_b_pullups(0xFF); //PIC16F887

   //port_b_pullups(TRUE); //PIC16F877A

   

   sinal=READ_EEPROM(4); //Averiguo si tengo una contraseña guardada o no

   if(sinal!=12)

      contra=9999;

   else

   { 

     //Lee los datos del EEPROM

      m1=READ_EEPROM(0); 

      c1=READ_EEPROM(1); 

      d1=READ_EEPROM(2); 

      u1=READ_EEPROM(3); 

   

   /* Para realizar la multiplicación cuando se tienen numeros del tipo int8, 

      como por ejemplo 100 con otro tipo int8 como por ejemplo CEN, el programa

      hará un producto int8, sin embargo se desea un resultado int16, por lo 

      tanto debe informarce al compilador por medio de un 'cast' (c=(int16)CEN*100)

      o utilizando la función de multiplicación de tipos del compilador (_mul)*/

      

      m=m1*1000; //Convierto miles a numero

      //c=_mul(c1,100); //Otra alternativa para multiplicar int8*int8=int16

      c=(int16)c1*100; //Convierto centemas, haciendo un CAST para obtener un int16

      d=d1*10; //Convierto decenas a numero 

      u=u1; //Convierto unidades a numero 

      

      contra=m+c+d+u;

   }

      

   WHILE(TRUE)

   {

      LCD_PUTC("\f");

      LCD_GOTOXY(1,1);

      LCD_PUTC(" DIGITE CLAVE ");

      LCD_GOTOXY(1,2);

      DELAY_MS(1000);

      pedir_clave(); //Llama la funcion de pedir la clave

      if(k=='*')

         cambio_clave();

      else

      {

         WHILE((k!='#'))

         {

            TECLADO();

            if(k=='*')

               cambio_clave();

         }

         IF(validar_clave()) //Aquí se compara si

         //los números digitados

         //están correctos.*/

         {

            LCD_PUTC("\f"); //Se borra LCD

            LCD_GOTOXY(1,1);//Se ubica en la posición 1,1

            LCD_PUTC(" CLAVE CORRECTA ");

            BIT_SET(LED1);

            DELAY_MS(2000);

            BIT_CLEAR(LED1);

         }

         ELSE

         {

            LCD_PUTC("\f");

            LCD_GOTOXY(1,2);

            LCD_PUTC(" CLAVE INVALIDA ");

            BIT_SET(LED2);

            DELAY_MS(4000);

            BIT_CLEAR(LED2);

         }

      }

   }

}



Hiç yorum yok:

Yorum Gönder

Her yorum bilgidir. Araştırmaya devam...