Llave electrónica con PIC

k mas hombre esta muy bueno el proyecto tengo una inquietud el montaje en la protoboar es asi como esta en proteus gracias.

sdel la k mas hombre esta muy bueno el proyecto tengo una inquietud el montaje en la protoboar es asi como esta en proteus gracias.

Si wilson, es igual, lo unico que tenes que agregar es la fuente del pic, o sea el regulador 7805 con sus capacitores correspondientes.

Saludos.
 
bueno la verdad los aportes de todos estan muy interesantes... bien decidi empezar con la llave de wilfretronic pues hice todo lo que decia y todo perfecto, pero a la hora de simular en proteus la clace "1,2,3" no hacia nada, si alguien realizo esto y soluciono esa parte, comentenlo para que podamos hacerlo aquellos que tenemos ese detalle. Gracias
 
bueno la verdad los aportes de todos estan muy interesantes... bien decidi empezar con la llave de wilfretronic pues hice todo lo que decia y todo perfecto, pero a la hora de simular en proteus la clace "1,2,3" no hacia nada, si alguien realizo esto y soluciono esa parte, comentenlo para que podamos hacerlo aquellos que tenemos ese detalle. Gracias

saludos:

realice lo mismo y funciona perfecto, lo mejor es realizar una plaqueta de pruebas por que algunas veces el proteus si esta mal configurado no funciona bien, revisalo de nuevo.
 
saludos:

realice lo mismo y funciona perfecto, lo mejor es realizar una plaqueta de pruebas por que algunas veces el proteus si esta mal configurado no funciona bien, revisalo de nuevo.


bueno pues gracias por tu respuesta pero ya lo he armado varias veces fisicamente y el detalle es que en la primera linea del lcd, aparecen cuadritos es todo :confused: de antemano gracias
 
saludos:

realice lo mismo y funciona perfecto, lo mejor es realizar una plaqueta de pruebas por que algunas veces el proteus si esta mal configurado no funciona bien, revisalo de nuevo.

buenos dias soy nuevo en esto de los pics em puedes regalar el codigo y el plano de proteus, el plano no lo veo y el codigo es que intente el inicial y me aroja un problema entonces para utilizar el tuyo de antemano muchas gracias por tu ayuda.

cordialmente, leclagago74 (leonardo garcia)
 
hola

estoy realizando un proyecto de programación de microcontroladores se trata de una cerradura electrónica de acceso por medio de un teclado matricial.

en una parte del código lo que quiero hacer es que se detecte cuando se pulso una tecla cualquiera del teclado matricial .

el código total que tengo hasta el momento es este .


Código:
#include <main.h>
#include <LCD.C>
#include <KBD.C>
#include <stdio.h>
#use delay(clock=4000000) 
#include <stdlib.h>
#rom 0x2100={"1","9","7"} // 1 , 7 , 9 son los números de la clave 

void main()
{ char k;
int x;
char data[3], clave[3];
lcd_init();
kbd_init();
port_b_pullups(TRUE);
setup_adc_ports(NO_ANALOGS);
printf(LCD_PUTC, "\f");
int i; 

lcd_gotoxy(1,1);
printf(LCD_PUTC, "Bienvenido");
delay_ms(1000);
for (i=1;i<=16;++i)
{
lcd_gotoxy(i,2);
printf(LCD_PUTC, "*");
delay_ms( 200 );
}

printf(LCD_PUTC, "\f");
lcd_gotoxy(1,1);
printf(LCD_PUTC, "Cerradura");
lcd_gotoxy(1,2);
printf(LCD_PUTC, "Cerrada");
delay_ms(2000);
printf(LCD_PUTC, "\f");
lcd_gotoxy(1,1);
printf(LCD_PUTC, "ingrese clave");
delay_ms(2000);

while(TRUE)
{k=kbd_getc();
if(k!=0) {
lcd_gotoxy(1,2);
printf(LCD_PUTC, " hola");
}

}
}


esta ultima parte antes de terminar el código es la que me interesa

donde dice while (true)

que es donde empieza a ejecutarse el código respectivamente.
básicamente lo que quiero en esta ultima parte es que al pulsar una tecla del teclado matricial aparezca en el lcd el mensaje " hola"


he simulado en proteus y todo el código se ejecuta normalmente es decir se muestran los mensajes en el LCD pero llega hasta el while true y se supone que el pic espera una respuesta por parte del usuario cuando pulso una tecla del teclado simplemente es como si el pic no la reconociera en pocas palabras el problema esta en lo que viene después de el while true .

no se que error tenga si he investigado en libros y siempre aparece ese ultimo código para reconocer una tecla pulsada .

estoy utilizando el pic16f877a

si alguien me pudiera ayudar se lo agradecería .
también se me olvidaba agregar un detalle que considero importante
el LCD lo conecté al puerto D

y el teclado matricial lo conecte al puerto B.
 
Última edición por un moderador:
Si vas a usar el teclado en el puerto B con el 16F877A debes descomentar una línea en la librería KBD.C
En esta parte de la librería lo dice...
Código:
////////////////// The following defines the keypad layout on port D

// [B]Un-comment the following define to use port B[/B]
// #define use_portb_kbd TRUE

Suerte.
 
gracias y como se descomenta una linea en una librería ?

gracias y como se descomenta una linea en una librería ?



Si vas a usar el teclado en el puerto B con el 16F877A debes descomentar una línea en la librería KBD.C
En esta parte de la librería lo dice...
Código:
////////////////// The following defines the keypad layout on port D

// [B]Un-comment the following define to use port B[/B]
// #define use_portb_kbd TRUE

Suerte.

gracias y como hago para descomentar una linea en una librería ?
 
Última edición:
En C quitando las diagonales (//)
Debe quedar así...
// Un-comment the following define to use port B
#define use_portb_kbd TRUE

Lo puedes hacer directamente desde el programa PCW, seleccionando el archivo con doble click,
en el arbol del lado izquierdo donde dice Files
 
hola

estoy realizando la programación de una cerradura electrónica en pic c compiler este es el código que tengo hasta el momento.

Código:
#include <main.h>
#include <LCD.C>
#include <KBD.C>
#include <stdio.h>
#use delay(clock=4000000) 
#include <stdlib.h>
#rom 0x2100={'1','9','7'}

void main()
{  char k;
   int  x;
   int  j;
   char data[3], clave[3];
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   printf(LCD_PUTC, "\f");
    int i; 
    
    lcd_gotoxy(1,1);
      printf(LCD_PUTC, "Bienvenido");
      delay_ms(1000);
      for (i=1;i<=16;++i)
         {
         lcd_gotoxy(i,2);
         printf(LCD_PUTC, "*");
         delay_ms( 200 );
         }
         
      printf(LCD_PUTC, "\f");
      lcd_gotoxy(1,1);
      printf(LCD_PUTC, "Cerradura");
      lcd_gotoxy(1,2);
      printf(LCD_PUTC, "Cerrada");
      delay_ms(2000);
      printf(LCD_PUTC, "\f");
      lcd_gotoxy(1,1);
      printf(LCD_PUTC, "ingrese clave");
     

   while(TRUE)
   {j=0;
    
   while (j<=2){
    k=kbd_getc();
    
    if(k!=0) {
    
    data[j]=k;
    j++;
    
    }
   }
   
   for (j=0;j<=2;j++){
   clave[j]=read_eeprom(j);
   }
   
   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])){
   
      printf(LCD_PUTC, "\f");
      lcd_gotoxy(1,1);
      printf(LCD_PUTC, "ok");
   
   }
   else 
      printf(LCD_PUTC, "\f");
      lcd_gotoxy(1,1);
      printf(LCD_PUTC, "clave erronea");
      delay_ms(2000);
   
     
   }
}


tengo un problema y es que al simularlo en proteus se muestran todos los mensajes correctamente se hace la lectura del teclado correctamente pero no se por que cuando llega a la parte de guardar los dígitos pulsados en la memoria del microcontrolador parece que ese paso tuviera errores por que de una vez manda el código hasta ELSE .

si alguien me pudiera ayudar se lo agradecería .

el pic es un 16f877a y el teclado matricial esta conectado al puerto b .
 
Última edición por un moderador:
Prueba así...
Código:
#include <16f877a.h>
#fuses   nobrownout
#use delay(crystal = 4MHz)
#include <lcd.c>
#include <kbd.c>
#rom 0x2100={'1','9','7'}

void main()
{  char k;
   int  j;
   char data[3], clave[3];
   lcd_init();
   kbd_init();
   port_b_pullups(true);
   setup_adc_ports(no_analogs);
   
      lcd_putc("\fingrese clave");
     
   while(true)
   {j=0;
    
   while (j<=2){
    k=kbd_getc();
    
    if(k!=0) {
    
    data[j]=k;
    j++;
    
    }
   }
   
   for (j=0;j<=2;j++){
   clave[j]=read_eeprom(j);
   }
   
   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])){
   
      lcd_putc("\fok");
   }
   else 
      lcd_putc("\fclave erronea");
      delay_ms(2000);
   }
}
Solo deje la parte del código de la comprobación de clave.

Suerte.
 
Prueba así...
Código:
#include <16f877a.h>
#fuses   nobrownout
#use delay(crystal = 4MHz)
#include <lcd.c>
#include <kbd.c>
#rom 0x2100={'1','9','7'}

void main()
{  char k;
   int  j;
   char data[3], clave[3];
   lcd_init();
   kbd_init();
   port_b_pullups(true);
   setup_adc_ports(no_analogs);
   
      lcd_putc("\fingrese clave");
     
   while(true)
   {j=0;
    
   while (j<=2){
    k=kbd_getc();
    
    if(k!=0) {
    
    data[j]=k;
    j++;
    
    }
   }
   
   for (j=0;j<=2;j++){
   clave[j]=read_eeprom(j);
   }
   
   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])){
   
      lcd_putc("\fok");
   }
   else 
      lcd_putc("\fclave erronea");
      delay_ms(2000);
   }
}
Solo deje la parte del código de la comprobación de clave.

Suerte.




:D bueno de hecho deje el código que te mostré y me di cuenta que tenia dos errores:

1) el ELSE debia tener sus respectivos { }
2) siempre intentaba ingresar la clave verdadera y no una clave erroena para ver que pasaba por lo tanto al estar correcta se ejecutaba la parte de IF pero como no tiene un retardo simplemente no mostraba nada .
le puse sus respectivos { } y el retardo al mensaje ok y ya todo va bien aun no termino el codigo pero ya tengo la parte mas dificil reconocer la clave verdadera .

gracias por tu ayudaa
:D



amigo tengo una pregunta como puedo resetear un pic por medio de codigo es decir sin llevar a tierra el máster clear .
gracias
 
Última edición:
hola pues como cada ocho días me ponen un trabajo distinto pues en esta semana no es la excepción esta vez me toca hacer una alarma con el pic 18f4550 voy en la parte de la programación y necesito que al escribir un numero en mi caso
clave 1(vendría siendo el numero el cual seria la clave de la caja )
clave 2 (y la clave 2 seria la para abrir la caja)
pero al momento de comparar el numero me dan que todos es incorrecto les dejo lo que tengo gracias de antemano

Código:
#include "C:\Users\User\Desktop\sda\main.h"


#include "flex_lcd.c"
#include "kbd_lib.c"
#use fast_io(b)
void main()
{
   // declaracion de variables
   char k;
   char a;
  char clave;
  char i;
  int op;
  
  // asignacion del puerto
   
   set_tris_d(0x00);
   
   //inicializacion del lcd y teclado
   
   lcd_init();
   kbd_init();
   
   // encendido de las resistencias pull-up
   
   port_b_pullups(true);
 
 
 
 lcd_gotoxy(1,1);
   printf (lcd_putc,"clave1");
   delay_ms (500);
   printf(LCD_PUTC, "\f");

  clave=kbd_getc();
  
 if (input (PIN_A0)==0)
 
  
  lcd_gotoxy(1,1);
   printf (lcd_putc,"clave2");
   delay_ms (300);
   printf(LCD_PUTC, "\f");
 


   while(TRUE)
   {
 
 
 
 
 k=kbd_getc();
 
    if (k!='\0') 
     
     if((clave==k))
     {
     lcd_gotoxy(1,1);
   printf (lcd_putc,"correcto");
   delay_ms (100);
   printf(LCD_PUTC, "\f");
     }
    else 
     {
    lcd_gotoxy(1,1);
   printf (lcd_putc,"incorrecto");
   delay_ms (100);
   printf(LCD_PUTC, "\f");
     }
   
   }
  
  }
les recuerdo que tiene un teclado matricial y un lcd para que diga si es correcto o incorrecto

bueno pues estuve viendo algunos codigos como el de arriba y veo que me falta agregrarle un tiempo de espera (talvez se pueda mediante el boton pero no estoy seguro) otra cosa con respecto a mi codigo es que pareciera que no lee el valor que entro alguna razon gracias
 
Última edición:
hola pues como nadie a podido responder he tomado como ejemplo el ejercicio de arriba pero me he dado cuenta que el para grabar esa clave utliza el comando #rom 0x2100={'1','2','3'} (que es para un pic 16f876a) y yo utlizo un 18 f4550 alguien sabe que comando debreia utlizar
 
hola pues como nadie a podido responder he tomado como ejemplo el ejercicio de arriba pero me he dado cuenta que el para grabar esa clave utliza el comando #rom 0x2100={'1','2','3'} (que es para un pic 16f876a) y yo utlizo un 18 f4550 alguien sabe que comando debreia utlizar
Saludos.
Veo que utilizas librerías modificadas, y es mejor que adjuntes tu proyecto completo en un archivo comprimido.
Una opción que puedes hacer, es grabar la EEPROM del PIC con la clave pero físicamente, no por software.
Después haces una rutina para leer la clave en la EEPROM y la comparas con la ingresada en el teclado.
También puedes crear un arreglo con la clave e igualmente después la comparas.
El problema de escribir la clave en la EEPROM por software, es que tienes que cambiarla en el código,
volver a compilar y otra vez grabar el PIC para poder cambiarla.

Mira este ejemplo que adjunto usando la pantalla y el teclado por el mismo puerto.
Éste ejemplo usa las librerías de CCS sin modificar, y se usa el puerto D para ambos.
Solo se compara una clave de dos digitos, y se puede repetir el procedimiento para mas de dos.

Suerte.
 

Adjuntos

  • 18F4550 Comprobar clave.rar
    18.5 KB · Visitas: 87
Última edición:
hola pues como cada ocho días me ponen un trabajo distinto pues en esta semana no es la excepción esta vez me toca hacer una alarma con el pic 18f4550 voy en la parte de la programación y necesito que al escribir un numero en mi caso
clave 1(vendría siendo el numero el cual seria la clave de la caja )
clave 2 (y la clave 2 seria la para abrir la caja)
pero al momento de comparar el numero me dan que todos es incorrecto les dejo lo que tengo gracias de antemano

Código:
#include "C:\Users\User\Desktop\sda\main.h"


#include "flex_lcd.c"
#include "kbd_lib.c"
#use fast_io(b)
void main()
{
   // declaracion de variables
   char k;
   char a;
  char clave;
  char i;
  int op;
  
  // asignacion del puerto
   
   set_tris_d(0x00);
   
   //inicializacion del lcd y teclado
   
   lcd_init();
   kbd_init();
   
   // encendido de las resistencias pull-up
   
   port_b_pullups(true);
 
 
 
 lcd_gotoxy(1,1);
   printf (lcd_putc,"clave1");
   delay_ms (500);
   printf(LCD_PUTC, "\f");

  clave=kbd_getc();
  
 if (input (PIN_A0)==0)
 
  
  lcd_gotoxy(1,1);
   printf (lcd_putc,"clave2");
   delay_ms (300);
   printf(LCD_PUTC, "\f");
 


   while(TRUE)
   {
 
 
 
 
 k=kbd_getc();
 
    if (k!='\0') 
     
     if((clave==k))
     {
     lcd_gotoxy(1,1);
   printf (lcd_putc,"correcto");
   delay_ms (100);
   printf(LCD_PUTC, "\f");
     }
    else 
     {
    lcd_gotoxy(1,1);
   printf (lcd_putc,"incorrecto");
   delay_ms (100);
   printf(LCD_PUTC, "\f");
     }
   
   }
  
  }
les recuerdo que tiene un teclado matricial y un lcd para que diga si es correcto o incorrecto

bueno pues estuve viendo algunos codigos como el de arriba y veo que me falta agregrarle un tiempo de espera (talvez se pueda mediante el boton pero no estoy seguro) otra cosa con respecto a mi codigo es que pareciera que no lee el valor que entro alguna razon gracias


una pregunta..... para que son las dos claves ? es indispensable las dos calves ( clave1 y clave2 ) ?

o clave dos es la clave que ingresas siendo clave1 la que el pic compara ?
 
Atrás
Arriba