Hola colegas, acabo de terminar un proyecto que se llama "llave electrónica", para esto e utilizado el PIC 16f877, un LCD LM016 16x2, 15 pulsadores como teclado matricial.
Explicación:
-->An iniciar el programa te pide que digites A(administrador) ó B(Ingreso), necesariamente se tiene que entrar por primera vez al menu del administrador que su clave por defecto es "123" una vez dentro puedes cambiar las claves de cualqueira de los dos.
-->Cuando ayas colocado la clave del usuario recien podras ingresar.
-->Cada vez que digites mal la clave de acceso no te permitira el ingreso o mejor dicho no se acitvará la señal por el PIN RA0, cada ves que presiones una tecla se activará un pequeño pitido.
-->cuando no se utilice el sistema se apaga asta apretar cualquier tecla.
--> El circuito es el se encuentra en adjuntos:
--> Ahora muchos se preguntaran el programa?, lo hice el el lenguaje CCS, para controlar el teclado 4x4, tuve que hacerle unas modificaciones que tambien se lo publicaré aca abajo:
--> Está un poco extenso, y me gustaria que elguien con mejor idea lo pueda modificar, no s epreocupen lo dejo para el uso libre , espero sus comentarios.
-->Se me olvidaba se puede simular en el Proteus, aca les dejo el archivo para descargar del proteus
--> ESPERO COMENTARIOS:
Explicación:
-->An iniciar el programa te pide que digites A(administrador) ó B(Ingreso), necesariamente se tiene que entrar por primera vez al menu del administrador que su clave por defecto es "123" una vez dentro puedes cambiar las claves de cualqueira de los dos.
-->Cuando ayas colocado la clave del usuario recien podras ingresar.
-->Cada vez que digites mal la clave de acceso no te permitira el ingreso o mejor dicho no se acitvará la señal por el PIN RA0, cada ves que presiones una tecla se activará un pequeño pitido.
-->cuando no se utilice el sistema se apaga asta apretar cualquier tecla.
--> El circuito es el se encuentra en adjuntos:
--> Ahora muchos se preguntaran el programa?, lo hice el el lenguaje CCS, para controlar el teclado 4x4, tuve que hacerle unas modificaciones que tambien se lo publicaré aca abajo:
Código:
// Funciones para la gestión del teclado de la Trainer PLUS.
// char kbd_getc( ) Devuelve el código ASCII de la tecla pulsada.
// Si no se pulsó ninguna, devuelve 0.
// Conexiones del teclado.
/*
RB0 RB1 RB2 RB3
^ ^ ^ ^
| | | |
|---|---|---|---|
RB4 ---> | 1 | 2 | 3 | F |
|---|---|---|---|
RB5 ---> | 4 | 5 | 6 | E |
|---|---|---|---|
RB6 ---> | 7 | 8 | 9 | D |
|---|---|---|---|
RB7 ---> | A | 0 | B | C |
|---|---|---|---|
*/
// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','A'} ,
{'4','5','6','B'} ,
{'7','8','9','C'} ,
{'*','0','#','D'} };
#byte kbd_port_b = 6
char kbd_getc( )
{
char tecla=0;
int f,c,t,i,j;
port_b_pullups(true);
set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas
for(f=0x10, i=0; i<4; f<<=1, i++)
{
for(c=0x01, j=0; j<4; c<<=1, j++)
{
kbd_port_b = ~f;
delay_cycles(1);
t = kbd_port_b & 0x0F;
t = ~(t | 0xF0 );
if(t == c)
{
delay_ms(20);
tecla=KEYS[i ][j ];
while(t==c)
{
restart_wdt( );
t = kbd_port_b & 0x0F;
t = ~(t | 0xF0) ;
}
break;
}
}
if(tecla)
break;
}
port_b_pullups(false);
return tecla;
}
--> este archivo lo tienen que guardar con el nombre de kbd4x4.c en el archivo DRIVES delprograma PICCCompiler.
-->Ahora si se puede compilar el programa que les muestro aca abajo:
#include <16f877.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<kbd4x4.c> //libreria manejo keypad
#include<lcd.c> //libreria manejo lcd 8bits
#byte porta=0x05
#use fast_io(b)
#use fast_io(d)
void menu_inicial(void);
void admin(void);
void menu_admin(void);
void usuario(void);
void cambio_admin(void);
void cambio_usuario(void);
char clave[16],a,limit;
char clavea[16]={'1','2','3'};
char limita=3;
signed char i, e;
boolean var=0; // variable donde se almacena la tecla precionada
void main(void)
{
inicio:
lcd_init();
set_tris_a( 0x00 );
bit_clear(porta,2); // Apaga el LCD.
for(;;)
{
do{a=kbd_getc(); // hasta precionar una tecla.
}while(a==0);
bit_set(porta,1); // Accionará un pitido
delay_ms(500);
bit_clear(porta,1);
bit_set(porta,2); // Prende el LCD.
menu_inicial(); // Salto a menú principal.
goto inicio;
}
}
//==============================================================================
//Saludo inicial.
//==============================================================================
void menu_inicial (void)
{
lcd_init(); //inicializa lcd
lcd_putc(" BIENVENIDO\n"); // Escribe en el lcd
delay_ms(1000); //Espero dos segundos
lcd_putc(" WELCOME"); //Escribo en la segunda fila
delay_ms(3000); //Espero tres segundos
uno: //Etiqueta UNO.
lcd_putc("\fAdmin. -> A \nIngreso -> B"); //solicitud de clave.
for(;;)
{
do{a=kbd_getc();
}while(a==0); //Hasta pulsar una tecla.
bit_set(porta,1); // Accionará un pitido
delay_ms(100);
bit_clear(porta,1);
if(a=='A')
{
admin();
delay_ms(1000);
break;
}
if(a=='B')
{
usuario();
delay_ms(1000);
break;
}
if(a!= 'A' && 'B')
{
lcd_putc("\fTecla incorrecta\ncorrija x favor.");
delay_ms(2000);
goto uno;
}
}
}
//==============================================================================
// Colocar clave
//==============================================================================
void usuario(void)
{
//dos:
lcd_putc("\fINGRESE SU CLAVE\n");
for(i=0; ;i++)
{ //bucle no sale...
do{a=kbd_getc();
}while(a==0); //...pulsar una tecla
bit_set(porta,1); // Accionará un pitido
delay_ms(100);
bit_clear(porta,1);
lcd_putc("*");
if(a=='C' || a=='D') //si se pulsa C o D se sale de la funcion
{
if(i==0) //no se sale...
{
lcd_putc("\nEscribe una!");
delay_ms(1000);
lcd_putc("\n");
lcd_gotoxy(1,2);
i=-1;
continue;
} //...poner una clave valida
if(i!=limit) //para ser correcto debe tener tb longitud correcta
var=1;
break; //salimos si se pulsa tecla * o #
}
if(a!=clave[i]) //comprobacion de caracteres correctos
var=1; //No es correcto->clave incorrecta
} //...hasta pulsar * o #
if(var>0)
{ //Clave incorrecta
lcd_putc("\fAcceso denegado\n Reintente!" );
delay_ms(2000);
break;
}
else
{ //Clave correcta
lcd_putc("\fAcceso permitido\n Adelante!");
delay_ms(1000);
lcd_putc("\fNo olvide cerrar\n la puerta ...");
bit_set(porta,0); //Abre la puerta,
delay_ms(2000); //Tiempo que se activará la chapa electrica.
porta = 0x00; //Se desactiva la chapa electrica.
}
var=0; //reset var
}
//==============================================================================
// Pedir la clave del administrador
//==============================================================================
void admin(void)
{
//dos:
lcd_putc("\fINGRESE SU CLAVE\n");
for(e=0; ;e++)
{ //bucle no sale...
do{a=kbd_getc();
}while(a==0); //...pulsar una tecla
bit_set(porta,1); // Accionará un pitido
delay_ms(100);
bit_clear(porta,1);
lcd_putc("*");
if(a=='C' || a=='D') //si se pulsa C o D se sale de la funcion
{
if(e==0) //no se sale...
{
lcd_putc("\nEscribe una!");
delay_ms(1000);
lcd_putc("\n");
lcd_gotoxy(1,2);
e=-1;
continue;
} //...poner una clave valida
if(e!=limita) //para ser correcto debe tener tb longitud correcta
var=1;
break; //salimos si se pulsa tecla * o #
}
if(a!=clavea[e]) //comprobacion de caracteres correctos
var=1; //No es correcto->clave incorrecta
} //...hasta pulsar * o #
if(var>0)
{ //Clave incorrecta
lcd_putc("\f Clave\n Incorrecta!" );
delay_ms(2000);
break;
}
else
{ //Clave correcta
lcd_putc("\f Clave\n Correcta!");
delay_ms(1000);
menu_admin();
}
var=0; //reset var
}
//==============================================================================
// Menú del administrador
//==============================================================================
void menu_admin(void)
{
tres:
lcd_putc("\f Puede cambiar\n claves de...");
delay_ms(2000);
lcd_putc("\fAdmin. -> A\nUsuario -> B");
for(;;)
{
do{a=kbd_getc();
}while(a==0);
bit_set(porta,1); // Accionará un pitido
delay_ms(100);
bit_clear(porta,1);
if(a=='A')
{
cambio_admin();
break;
}
if(a=='B')
{
cambio_usuario();
break;
}
if(a!= 'A' && 'B')
{
lcd_putc("\fTecla incorrecta\ncorrija x favor.");
delay_ms(2000);
goto tres;
}
}
}
//==============================================================================
// Cambio de clave al administrdor
//==============================================================================
void cambio_admin(void)
{
lcd_putc("\fNueva clave:\n"); //presentacion
for(e=0;e<16;e++)
{
do{a=kbd_getc(); //espera hasta...
}while(a==0); //...pulsar una tecla
bit_set(porta,1); // Accionará un pitido
delay_ms(100);
bit_clear(porta,1);
if(a=='C' || a=='D') //si se pulsa * o # se sale de la funcion
{
if(e==0) //no se sale...
{
lcd_putc("\nEscribe una!" );
delay_ms(500);
lcd_putc("\n " );
lcd_gotoxy(1,2);
e=-1;
continue; //...hasta poner una clave valida
}
lcd_putc("\fGuardando clave\n nueva ...");
delay_ms(2000);
lcd_putc("\f Nueva clave\n guardada ...");
break; //salir de funcion nueva_clave
}
lcd_putc(a);
limita=e+1; //longitud de la clave
clavea[e]=a; //almacena clave(maximo 16 caracteres)
}
}
//==============================================================================
// Cambiar la clave al usuario.
//==============================================================================
void cambio_usuario(void)
{
lcd_putc("\fNueva clave:\n"); //presentacion
for(i=0;i<16;i++)
{
do{a=kbd_getc(); //espera hasta...
}while(a==0); //...pulsar una tecla
bit_set(porta,1); // Accionará un pitido.
delay_ms(100);
bit_clear(porta,1);
if(a=='C' || a=='D') //si se pulsa * o # se sale de la funcion
{
if(i==0) //no se sale...
{
lcd_putc("\nEscribe una!" );
delay_ms(500);
lcd_putc("\n " );
lcd_gotoxy(1,2);
i=-1;
continue; //...hasta poner una clave valida
}
lcd_putc("\fGuardando clave\n nueva ...");
delay_ms(2000);
lcd_putc("\f Nueva clave\n guardada ...");
break; //salir de funcion nueva_clave
}
lcd_putc(a);
limit=i+1; //longitud de la clave
clave[i]=a; //almacena clave(maximo 16 caracteres)
}
}
--> Está un poco extenso, y me gustaria que elguien con mejor idea lo pueda modificar, no s epreocupen lo dejo para el uso libre , espero sus comentarios.
-->Se me olvidaba se puede simular en el Proteus, aca les dejo el archivo para descargar del proteus
--> ESPERO COMENTARIOS: