Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
El PIC C compiler mas conocido como ccs.
Bueno amigo loq ue tienes que hacer es hacer un cambio en el codigo que la clave se guarde en la memori eprom del PIC y al leerlo darle la dirección de dodne lo guardaste y ahi si se guarda la última contraseña que cambiaste, bueno el programa que hice no utilizo el eprom, suerte.
si esta explicado pero a la hora de compilar la parte del teclado para guardarlo en driver del pic compiler, a la hora de compilar me sale un error! que es esta parte
////////////////////////////////////////////////////////////////////////////////////////
// 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'} };
////////////////////////////////////////////////////////////
El compilador requiere un dispositivo # antes de que encuentre cualquier declaración o directiva de compilación que puede causar para generar código. En general # define puede aparecer antes de un dispositivo # pero no mucho más.
es que estoy empezando en el mundo de los pics gracias
saludos amigo tengo un problema resulta que copie su programa y funciono de maravilla la verdad te la comiste gracias inclusive lo monte y trabaja bien le cambio la clave y lo hace todo bien pero cuando se queda el pic sin tension hay q meterle la clave (123) de nuevo y volver a configurarlo como hago para q cuando cambie la clave y se quede sin tension el circuito no halla necesidad de volver a cambiar la clave sino q conserve la q yo le meta gracias seria bueno q resolvamos ese asuntico no le parece
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:
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:
seria muy interesente que compartieras el video para ver que tal funciona tu cerrradura..!
Yo hice una en lenguaje PicBasic con grabado de clave en la EEPROM, a queda bien y se la adapte a la puerta de mi cuarte funciona genial, el mecanismo para abrir la manilla de la puerta fue un motor servo trucado, pronto subire el video para que la vean.
Aqui les subo el ejemplo simulado en proteus con el archivo hex y el archivo PBP que es lenguaje picbasic, sin mas que decir dentro de la carpeta esta un documento texto que dice LEEME ahi explica algunos detalles del funcionamiento.
muy interesante tu proyecto y muy bueno esperare el video tambien seria agradable tenerlo en diferentes tipos de lenguaje en c con el pic compiler y otros lenguajes..! ( soy novato) espero que no me este equivocando..! :S