Como grabar en la eeprom de un atmega8 en bascom

Buenas, he creado este hilo para poder aprende como se graban datos en la eeprom de un atmega8 utilizando el ide bascom. les presento mi codigo con el que no logro usar bien la eeprom para ver si alguien sabe como podria solucionarlo y asi ya queda en el foro una solucion mas sobre bascom


Código:
'*******************************************************************************
'*TITULO:                  CONTROL CAR                                         *
'*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*
'*                                                                             *
'*FUNCION: CERRADURA CON CLAVE DE 4 DIGITOS Y CON SALIDA A RELE                *
'*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*
'*                                                                             *
'*******************************************************************************

$regfile = "m8def.dat"                                      'MICRO A UTILIZAR
$crystal = 8000000                                          'CRISTAL 8Mhz
'*******************************************************************************
'******************CONFIGURACIONES**********************************************
'*******************************************************************************
Config Kbd = Portd , Debounce = 60
Cls
Waitms 50
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcdbus = 4
Waitms 50
Cls

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
'*******************************************************************************
'******************CONFIGURACION DEL TIMER0*************************************
'*******************************************************************************
Config Timer0 = Timer , Prescale = 256
On Ovf0 Tim0_isr
Enable Timer0
Enable Interrupts

'*******************************************************************************
'******************CONFIGURACION DEL ADC****************************************
'*******************************************************************************

Config Adc = Single , Prescaler = Auto , Reference = Avcc
'*******************************************************************************
'********************DECLARACIONES**********************************************
'*******************************************************************************
Declare Sub Teclado()
Declare Sub Borrar()
Declare Sub Ingreso()
Declare Sub Comprobar()
Declare Sub Clave_vieja()
Declare Sub Clave_nueva()
Declare Sub Confirmar()
Declare Sub Guardar()

Dim Cont As Integer
Dim Key_a As Byte
Dim Key_b As Byte
Dim Clave(4) As Integer
Dim Clavenueva(4) As Integer
Dim Claveprom(4) As Eram Integer
Dim Clave_eeprom(4) As Byte
Dim A As Byte
Dim I As Integer
Dim J As Integer
Dim Adc0 As Word
Dim Temp1 As Long
Dim Temp2 As Long
Dim W As Word
Dim R As Word
Dim S As Single
Dim T As Single
Dim Cont_timer0 As Integer
Dim Minuto As Byte
Const K = 5 / 1023
Cont_timer0 = 0
$eeprom
$data
Stop Timer0
'*******************************************************************************
'*******************************************************************************
'***************************GRABAR CLAVE AUTOMATICA*****************************
'*******************************************************************************
Cont = 0
Readeeprom A , 10
If A = 100 Then
Goto Vec1
Else


For I = 1 To 4
Clave_eeprom(i) = I
Next


For I = 1 To 4
Writeeeprom Clave_eeprom(i) , I
Next

A = 100

End If
'*******************************************************************************
'**************MENSAJE PRINCIPAL************************************************
'*******************************************************************************
Vec1:

Locate 1 , 5
Lcd "*MicroG*"
Waitms 1000

For A = 1 To 2

  Display Off

  Waitms 250

  Display On

  Waitms 250

Next
Cls
Waitms 1500

'*******************************************************************************
'******************************PROGRAMA PRINCIPAL*******************************
'*******************************************************************************
Inicio:
Start Timer0
Disable Interrupts



Do


Locate 1 , 1
Lcd "1-INSERTE CLAVE"

Locate 2 , 1
Lcd "2-CAMBIAR CLAVE"

Enable Interrupts

Leer_tecla:
         Gosub Teclado

         If Key_b = 1 Then
         Gosub Borrar
         Gosub Ingreso
         Gosub Comprobar
         End If


         If Key_b = 2 Then
         Gosub Borrar
         Gosub Clave_vieja
         Gosub Clave_nueva
         Gosub Confirmar
         Gosub Guardar
         End If

Goto Leer_tecla
Loop
'*******************************************************************************
'**************RUTINA PARA BORRAR CLAVE*****************************************
'*******************************************************************************
Borrar:
Stop Timer0
Cls
Waitms 500
For I = 1 To 4
Clave(i) = 0
Next
Return
'*******************************************************************************
'**************INGRESAR CLAVE***************************************************
'*******************************************************************************
Ingreso:


Cls
Cont_timer0 = 0
Waitms 500
I = 6
J = 1
Locate 1 , 2
Lcd "INGRESE CLAVE"
Locate 2 , I
For A = 1 To 4
Teclanueva:
Gosub Teclado
Waitms 300
If Key_b < 10 Then
Locate 2 , I
Lcd Key_b
I = I + 1
Clave(j) = Key_b

Else
Goto Teclanueva
End If
J = J + 1
Next
Waitms 300
Cls

Return
'*******************************************************************************
'**************COMPROBAR CLAVE**************************************************
'*******************************************************************************
Comprobar:


V1:
Gosub Teclado
If Key_b = 13 Then


   For I = 1 To 4
   Readeeprom Clave_eeprom(i) , I

   If Clave(i) = Clave_eeprom(i) Then
        'Next
      If I = 4 Then


      Cls
      Waitms 500
      Portc.0 = 1
      Locate 1 , 2
      Lcd "CLAVE CORRECTA"
      Locate 2 , 5
      Lcd "ENCENDER"
      Wait 4
      Cls
      Portc.0 = 0
      End If


      Next
   Else
      If Cont = 2 Then
      Cont = 0
      Cls
      Locate 1 , 5
      Lcd "ALARMA!"
      Portc.1 = 1
      Wait 8
      Portc.1 = 0
      Cls
      Start Timer0
      Goto Inicio
      End If

      Portc.0 = 0
      Portc.2 = 1
      Locate 1 , 1
      Lcd "CLAVE INCORRECTA"
      Locate 2 , 1
      Lcd "INTENTE DE NUEVO"
      Waitms 500
      Portc.2 = 0
      Waitms 1000
      Cls
      Cont = Cont + 1
      End If


Else
Goto V1
End If
Start Timer0

Goto Inicio
Return

'*******************************************************************************
'**************RUTINA PARA LEER EL TECLADO**************************************
'*******************************************************************************
Teclado:
Volver:

Key_a = Getkbd()
If Key_a < 16 Then
Key_b = Lookup(key_a , Dta )

Else
Goto Volver
End If
Return

'*******************************************************************************
'**************CLAVE VIEJA******************************************************
'*******************************************************************************
Clave_vieja:

Locate 1 , 1
Lcd "CLAVE ANTIGUA"
Waitms 1500

Gosub Ingreso

Q1:
Gosub Teclado
If Key_b = 13 Then

   For I = 1 To 4
   Readeeprom Clave_eeprom(i) , I

   If Clave(i) = Clave_eeprom(i) Then
        'Next

      If I = 3 Then


      Cls
      Wait 1
      Locate 1 , 2
      Lcd "CLAVE CORRECTA"
      Waitms 700
      Cls
      End If
   Else                                                     ' verificar como o mando al inicio del programa
      Cls
      Portc.0 = 0
      Portc.2 = 1
      Locate 1 , 1
      Lcd "CLAVE INCORRECTA"
      Waitms 500
      Portc.2 = 0
      Waitms 200
      Cls
      Start Timer0
      Goto Inicio
      End If
      Next

Else
Goto Q1
End If

Return
'*******************************************************************************
'**************CLAVE NUEVA******************************************************
'*******************************************************************************
Clave_nueva:

I = 6
J = 1
Waitms 100
Locate 1 , 3
Lcd "NUEVA CLAVE"
Locate 2 , I
For A = 1 To 4
Teclanueva1:
Gosub Teclado
Waitms 250
If Key_b < 10 Then
Locate 2 , I
Lcd Key_b
I = I + 1
Clave(j) = Key_b

Else
Goto Teclanueva1
End If
J = J + 1
Next
Waitms 200
Cls

Return
'*******************************************************************************
'**************RUTINA PARA CONFIRMAR CLAVE *************************************
'*******************************************************************************
Confirmar:

I = 6
J = 1
Wait 1
Locate 1 , 1
Lcd "CONFIRMAR CLAVE"
Locate 2 , I
For A = 1 To 4
Teclanueva2:
Gosub Teclado
Waitms 250
If Key_b < 10 Then                                          'poner un retardo tb, fijarse
Locate 2 , I
Lcd Key_b
I = I + 1
Clavenueva(j) = Key_b

Else
Goto Teclanueva2
End If
J = J + 1
Next
Waitms 200
Cls

W1:
Gosub Teclado
If Key_b = 13 Then

   For I = 1 To 4
   If Clave(i) = Clavenueva(i) Then

      If I = 4 Then


      Cls
      Wait 1
      Locate 1 , 8
      Lcd "OK"
      Waitms 500
      Cls
      End If
   Else
      Cls
      Portc.0 = 0
      Locate 1 , 1
      Lcd "CLAVE INCORRECTA"
      Waitms 500
      Cls
      Start Timer0
      Goto Inicio
      End If
      Next

Else
Goto W1
End If

Return
'*******************************************************************************
'**************RUTINA PARA GUARDAR CLAVE EN EEPROM******************************
'*******************************************************************************
Guardar:

Portc.3 = 1
Locate 1 , 1
Lcd "espere..."

For I = 1 To 4
      Clave_eeprom(i) = Clave(i)
      Writeeeprom Clave_eeprom(i) , I
      Next

   Waitms 1500
   Portc.3 = 0
   Start Timer0
   Goto Inicio
   Return



End

'*******************************************************************************
'****************SERVICIO DE INTERRUPCION DEL TIMER*****************************
'*******************************************************************************
Tim0_isr:


Stop Timer0
If Cont_timer0 = 1 Then

Cont_timer0 = 0
Start Adc

         W = Getadc(4)
         R = Getadc(5)
         S = W * K
         T = R * K
         Temp1 = S * 100
         Temp2 = T * 100
         Stop Adc


Locate 4 , 1
Lcd "Tin:" ; Temp1 ; "C"
Locate 4 , 10
Lcd "Tout" ; Temp2 ; "C"
Waitms 20
Set Tifr.1
Else

Cont_timer0 = Cont_timer0 + 1
End If

Set Tifr.1

Start Timer0

Return
'*******************************************************************************


Dta:
Data 1 , 2 , 3 , 10 , 4 , 5 , 6 , 11 , 7 , 8 , 9 , 12 , 13 , 0 , 14 , 15
 
Última edición por un moderador:
Buscá en la ayuda que trae el software de compilación de BASCOM. Primero probá alguna función sencilla para ver el funcionamiento de la EEPROM..y de ahí en más probá algo más complejo.
El error que tenés..lo más probable es que sea un error de lógica de tu programa....
 
ya lo solucione despues de muuucho tiempo sentado y cambiado mi programa de muchas formas, y despue slo solucione jeje tengo un pequeño error en la logica de la clave al comenzar el programa, hize pruebas grabando datos comunes en la eeprom con la ayuda de bascom que siempre uso y anduvo bien.

gracias igual

el error fue el siguiente:

Cont = 0
Readeeprom A , 10
If A = 100 Then
Goto Vec1
Else


For I = 1 To 4
Clave_eeprom(i) = I
Next


For I = 1 To 4
Writeeeprom Clave_eeprom(i) , I
Next

A = 100
(aqui) deberia haber guardado el valor en la posicion de memoria indicada arriba
End If


entonces loq ue hacia el programa era al apagar el equipo volver a pasar por el else del if y grabarme siempre la misma clave.


aunto resuelto xP

gracias

saludos!
 
hola moyano jhonatan que tal me gustan muchos tus proyectos y eh notado que manejas muy bien el lenguaje c te escribo para saber si podrias colaborar con una cerradura electronica que ando haciendo es que soy nuevo en este mundo de los pics mi problema es que no eh podido guardar la clave en el memoria eeprom osea que cuando presione la tecla c del teclado 4x4 me aparezca la opcion CAMBIAR CLAVE Y que esta clave me la guarde en la memoria eeprom del pic 16f877a... esto es loq ue llevo hasta hora de antemano muchas gracias espero tu pronta respuesta



#include <16f877a.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 admin(void);
void menu_admin(void);
void cambio_admin(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.
admin (); // Salto a menú principal.
goto inicio;
if(a=='C')
{
cambio_admin();
break;
}
}
}




//==============================================================================
// 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=='A') //si se pulsa A 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 ACCESO\n DENEGADO!" );
bit_set(porta,5);
delay_ms(2000);
bit_clear(porta,5);

}
else
{ //Clave correcta
lcd_putc("\f ACCESO\n CONCEDIDO!");
bit_set(porta,0);
bit_set(porta,3); //Abre la puerta,
delay_ms(2000);
bit_clear(porta,3); //Tiempo que se activará la chapa electrica.
porta = 0x00; //Se desactiva la chapa electrica.
}

var=0; //reset var
}




//==============================================================================
// 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=='A') //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)
}
}
 
Como andas falcondj :apreton:

Mirá en principio tu código al parecer está bien. Tengo algunas rutinas similares que están probadas para lo que vos necesitas, pero te las paso luego por que no estoy en casa.

Otra cosa , por favor abrí un hilo nuevo por que este habla sobre la EEPROM para atmel y vos estás planteando un tema sobre microcontroladores PIC.

Un saludo ! (y)
 
muy bien jhonathan moyano muchas gracias por responderme sii me servirian muchas esas rutinas o mirar en que parte estoy mal para que me digas cual es el error es que soy novato en este cuento de los pics y otro hilo ya los tengo pero nadie me ah querido ayudar profundamente agradecido saludos
 
Como andas falcondj :apreton:

Mirá en principio tu código al parecer está bien. Tengo algunas rutinas similares que están probadas para lo que vos necesitas, pero te las paso luego por que no estoy en casa.

Otra cosa , por favor abrí un hilo nuevo por que este habla sobre la EEPROM para atmel y vos estás planteando un tema sobre microcontroladores PIC.

Un saludo ! (y)

por favor jonathan no te olvides de lo mio es que ando un poco confundido:confused: con este tema de la eeprom gracias por la colaboracion que me puedas brindar:apreton:(y)
 
Disculpame no he tenido tiempo, en estos días te subo el ejemplo que te dije.

Un saludo y que andes bien !

Hola que tal jonathan mira eh intentado arreglar mi problema pero lo que hice fue peor porque la contraseña que tenia 123 ya no me entra espero que me puedas ayudar o me podrias explicar con tu ejemplo de antemanos muchas gracias :cry:


#include <16f877a.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
#rom 0x2100={'1','2','3'}
#byte porta=0x05
#use fast_io(b)
#use fast_io(d)

void admin(void);
void menu_admin(void);
void cambio_admin(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(;;)
{
for(i=0;i<=4;i++) clave=read_eeprom(i);
clavea=0;
bit_set(porta,2); // Prende el LCD.
admin (); // Salto a menú principal.
goto inicio;


}
}




void admin(void)
{
//dos:
lcd_putc("\fINTRODUZCA 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=='A') //si se pulsa A 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 ACCESO\n DENEGADO!" );
bit_set(porta,5);
delay_ms(2000);
bit_clear(porta,5);

}
else
{ //Clave correcta
lcd_putc("\f ACCESO\n CONCEDIDO!");
bit_set(porta,0);
bit_set(porta,3); //Abre la puerta,
delay_ms(2000);
bit_clear(porta,3); //Tiempo que se activará la chapa electrica.
porta = 0x00; //Se desactiva la chapa electrica.
}

var=0; //reset var
}






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=='A') //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)
}
}
 
Hola, disculpame que no te he podido ayudar. La facultad me tiene bastante ocupado, el ejemplo que te dije es el siguiente:
Código:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a) 

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'}  //Posición 0,1 y 2 de la Eeprom con los datos…
                           //7,2, y 3 respectivamente
void main() {
   char k;
   int i;
   char data[3], clave[3];  //Matrices para guardar clave y datos

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);

   while (TRUE) {
   i=0;            //posición de la matriz

   printf(lcd_putc,"\fpulsar tecla 1\n");  //Para primer dato

   while(i<=2){                //Para tres datos
      k=kbd_getc();            //Lee el teclado
      if (k!=0)                //Si se ha pulsado alguna tecla 
         {data[i]=k;           //se guarda en la posición correspondiente
          i++;                //de la matriz
          printf(lcd_putc,"\fpulsar tecla %u\n",i+1);  //Siguiente dato
         }
    }

   for (i=0;i<=2;i++) {             //Pasa datos de eeprom a la matriz clave
     clave[i]=read_eeprom(i);}

   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
      { printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
        output_high(PIN_A0);                //Si es igual da pulso al relé
        delay_ms(500);
        output_low(PIN_A0);}
   else printf(lcd_putc,"\fPuerta Cerrada");  //Clave erronea
   delay_ms(1000);
   }
}

Es un ejemplo bastante simple , te tendría que ayudar. Es cuestión de que le agregues alguna estructura más robusta para la decodificación de la clave...pero es funcional.

Un saludo !
 
Hola, disculpame que no te he podido ayudar. La facultad me tiene bastante ocupado, el ejemplo que te dije es el siguiente:
Código:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a) 

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'}  //Posición 0,1 y 2 de la Eeprom con los datos…
                           //7,2, y 3 respectivamente
void main() {
   char k;
   int i;
   char data[3], clave[3];  //Matrices para guardar clave y datos

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);

   while (TRUE) {
   i=0;            //posición de la matriz

   printf(lcd_putc,"\fpulsar tecla 1\n");  //Para primer dato

   while(i<=2){                //Para tres datos
      k=kbd_getc();            //Lee el teclado
      if (k!=0)                //Si se ha pulsado alguna tecla 
         {data[i]=k;           //se guarda en la posición correspondiente
          i++;                //de la matriz
          printf(lcd_putc,"\fpulsar tecla %u\n",i+1);  //Siguiente dato
         }
    }

   for (i=0;i<=2;i++) {             //Pasa datos de eeprom a la matriz clave
     clave[i]=read_eeprom(i);}

   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
      { printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
        output_high(PIN_A0);                //Si es igual da pulso al relé
        delay_ms(500);
        output_low(PIN_A0);}
   else printf(lcd_putc,"\fPuerta Cerrada");  //Clave erronea
   delay_ms(1000);
   }
}

Es un ejemplo bastante simple , te tendría que ayudar. Es cuestión de que le agregues alguna estructura más robusta para la decodificación de la clave...pero es funcional.

Un saludo !

gracias por tu pronta respuesta .. este ejemplo que me das es el que esta en el libro COMPILADOR C CCS Y SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC..! pero por lo mas que eh intentado no eh podido lograrlo solo necesito que despues de quemado el pic tenga la opcion de presionar la tecla C del teclado 4x4 y esta me muestre la opcion de cambiar la contraseña y que me la guarde en la memoria eeprom del pic.. para que cuando no halla corriente electrica me guarde la ultima contraseña que coloque y no la primera..! eso es lo que no eh podido eh intentado por todos lados pero nada :rolleyes: :cry: no se si revisastes mi programacion para ver que tengo mal :confused: y asi poderlo arreglar de antemano muchas gracias por la colaboracion que me estas brindando saludos..! :apreton:
 
gracias por tu pronta respuesta .. este ejemplo que me das es el que esta en el libro COMPILADOR C CCS Y SIMULADOR PROTEUS PARA MICROCONTROLADORES PIC..!
Si el ejemplo es del libro, te lo pasé por que era lo que tenía a mano.

Te recomiendo encarecidamente que hagas un diagrama de flujo para que te guies con la programación. A mi siempre me ayuda con los problemas de lógica.

Con respecto a tu código no te lo he podido revisar por que no tengo mucho tiempo. Te puedo decir que no es complejo....sería algo así:

1° - Leer el teclado.
2° - Es la tecla c?....si va la opción 3° no ...retorna 0 y va a la opción 7°
3° - muestra en el lcd : CAMBIAR CONTRASEÑA: SI? NO?
4° - Leer el teclado.
5° - SI? o no? si es si , cargamos contraseña...si es no va a la opción 7°
6° - guardamos en la eeprom la contraseña elejida.
7° volvemos al principio.

Te lo pongo más o menos en el orden que iria...vos tendrías que escribir el código e ir trabajando en el. Pero recuerda...hay que ser ordenado y muy estructurado para programar...sino es dificil que funcione.

Un saludo !
 
Código:
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a) 

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'}  //Posición 0,1 y 2 de la Eeprom con los datos…
                           //7,2, y 3 respectivamente
void main() {
   char k;
   int i;
   char data[3], clave[3];  //Matrices para guardar clave y datos

   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);

   while (TRUE) {
   i=0;            //posición de la matriz

   printf(lcd_putc,"\fpulsar tecla 1\n");  //Para primer dato

   while(i<=2){                //Para tres datos
      k=kbd_getc();            //Lee el teclado
      if (k!=0)                //Si se ha pulsado alguna tecla 
         {data[i]=k;           //se guarda en la posición correspondiente
          i++;                //de la matriz
          printf(lcd_putc,"\fpulsar tecla %u\n",i+1);  //Siguiente dato
         }
    }

   for (i=0;i<=2;i++) {             //Pasa datos de eeprom a la matriz clave
     clave[i]=read_eeprom(i);}

   if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
      { printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
        output_high(PIN_A0);                //Si es igual da pulso al relé
        delay_ms(500);
        output_low(PIN_A0);}
   else printf(lcd_putc,"\fPuerta Cerrada");  //Clave erronea
   delay_ms(1000);
   }
}

Es un ejemplo bastante simple , te tendría que ayudar. Es cuestión de que le agregues alguna estructura más robusta para la decodificación de la clave...pero es funcional.

Un saludo !

Hola que tal jonathan estuve intentando hacer el ejemplo del libro ..pero ps todavia me quedo grande la parte de cambiar la contraseña cuando te quede tiempo le podria hechar una miradita a mi programacion...de antemano muchas gracias saludos..!


Código:
#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=11059200)
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#rom 0x2100={'1','2','3','4'}
void main()
 {
     int i;
     char tecla=0;
     char datos[4],clave[4];
     lcd_init();
     kbd_init();
     port_b_pullups(true);
ciclo:
     for(i=0;i<=4;i++) clave[i]=read_eeprom(i);
     tecla=0;
  
     while(tecla==0) tecla=kbd_getc();
    
         lcd_putc("\fINTRODUCIR CLAVE\n");
         tecla=0;
         for(i=0;i<4;i++)
         {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            datos[i]=tecla;
            lcd_putc(" *");
            tecla=0;
         }
          if (tecla=='#')
         if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
         {
            lcd_putc("\fPUERTA ABIERTA");
            output_high(pin_a0);
            delay_ms(3000);
            output_low(pin_a0);
         }
         else
         {
            lcd_putc("\fCLAVE ERRONEA");
            delay_ms(3000);
         }
         goto ciclo;
     }
     
     
      if (tecla=='*')  [COLOR="Red"]<--------- el compilador me muestra error de aqui para abajo[/COLOR]     
  {
         lcd_putc("\f CLAVE  ACTUAL\n");
         tecla=0;
         for(i=0;i<4;i++)
         {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            datos[i]=tecla;
            lcd_putc("*");
            tecla=0;
         }
         if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
         {
            lcd_putc("\fNUEVA CLAVE\n");
            for(i=0;i<4;i++)
            {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            write_eeprom(i,tecla);
            lcd_putc("*");
            tecla=0;
            }
            lcd_putc("\fCLAVE MODIFICADA\n");
            delay_ms(1000);
         }
         else
         {
            lcd_putc("\fCLAVE ERRONEA");
            delay_ms(3000);
         }
     }
     goto ciclo;
 }
 
por favor @Moyano Jonathan ayudame esto es de vida o muerte de la cerradura si no la presento me tiro el semestre de la U intente por todos lo medios y no pude que error estoy cometiendo :cry:
 
Hola falcondj como estás.

Mirá te quiero hacer unas consultas:

1° - Tenés el hardware donde estás haciendo las pruebas ?
2° - Que modificaciones has hecho antes de plantearme las dudas ?
3° - Hiciste el paso a paso que te indiqué para realizar tu programa ?
4° - Que conocimientos tenés de programación en C ?

Es común presentarse con un proyecto a un foro por que no te sale,pero no te puedo ayudar si no tirás ideas permanentemente. Es decir, si vos no planteas paso a paso tus dudas no te podemos ayudar de forma directa.

Yo personalmente te puedo largar ideas pero no tengo tiempo para realizar las pruebas yo y decirte donde está el error.

Como una ayuda a la causa busqué exactamente lo que necesitas: http://issuu.com/tecnoelecsena/docs/informe_proyecto_cerradura

Este proyecto al parecer es funcional. Tendrías que estudiarlo y fondo y ver si te sirve la implementación.
 
Que has investigado tu para poder resolver tu problema?, nosotros estamos para ayudar en donde te atores, no para hacerte la tarea...

que tal chico3001 dejame decirte que eh intentado casi todo pero siempre a la hora de compilar el codigo ya sea en lenguaje c en el programa ccs o ya sea en asm con el programa mplab me vota una serie de errores que no eh logrado decifrar en asm es un codigo hecho para el pic16f876 pero lo necesito para el pic16f877a y ya que es el pic que estamos necesitando para mi proyecto porque el pic16f876 no se encuentra en las casa de electronica de mi ciudad compilo el programa sigo con el mismo problema..! sera que intentandole quemar el programa que venia para el pic16f876 me cojeria en el pic16f877a..! sii lo intente pero a la hora montarla en la protoboard tengo problemas con el teclado apenas lo conecto..!:rolleyes:
Código:
 processor 16F877a
    #include <P16F877a.INC>
   


T_RELE	EQU	20H	;CONTROLA EL TIEMPO QUE EL RELE ACCIONA EL MARCO DE LA PUERTA
PCL	EQU	02H
STATUS	EQU	03H
PORTA	EQU	05H
DATO	EQU	06H	;PUERTO B
KEYB	EQU	07H
TRISA	EQU	05H
TRISB	EQU	06H
TRISC	EQU	07H
PUNTAB	EQU	20H
INTENTO	EQU	21H
TECLA	EQU	22H
CUENTA1	EQU	23H
CUENTA2	EQU	24H
CUENTA3	EQU	25H
COD1	EQU	26H
COD2	EQU	27H
COD3	EQU	28H
COD4	EQU	29H
CUENTA4	EQU	2AH
COD1A	EQU	2BH
COD2A	EQU	2CH
COD3A	EQU	2DH
COD4A	EQU	2EH
CODWRITE EQU	2FH
EEADR	EQU	10DH
EECON1	EQU	18CH
EECON2	EQU	18DH
EEDATA	EQU	10CH
INTCON	EQU	0BH
PIR2	EQU	0DH
PIE2	EQU	8DH
F	EQU	1
W	EQU	0

#DEFINE	EN	05H,2
#DEFINE	RW	05H,1
#DEFINE	RS	05H,0
#DEFINE ALA	05H,3
#DEFINE PORTERO 05H,5



	ORG	00H
	GOTO	INICIO
	ORG	04H
	BCF	PIR2,4
	RETFIE
TABLA	MOVWF	PCL
MEN_1	RETLW	'I'
	RETLW	'N'
	RETLW	'T'
	RETLW	'R'
	RETLW	'O'
	RETLW	'D'
	RETLW	'U'
	RETLW	'Z'
	RETLW	'C'
	RETLW	'A'
MEN_5	RETLW	' '
	RETLW	'C'
	RETLW	'L'
	RETLW	'A'
	RETLW	'V'
	RETLW	'E'
	RETLW	00H

MEN_2	RETLW	'P'
	RETLW	'U'
	RETLW	'E'
	RETLW	'D'
	RETLW	'E'
	RETLW	' '
	RETLW	'P'
	RETLW	'A'
	RETLW	'S'
	RETLW	'A'
	RETLW	'R'
	RETLW	00H

MEN_3	RETLW	'C'
	RETLW	'L'
	RETLW	'A'
	RETLW	'V'
	RETLW	'E'
	RETLW	' '
	RETLW	'I'
	RETLW	'N'
	RETLW	'C'
	RETLW	'O'
	RETLW	'R'
	RETLW	'R'
	RETLW	'E'
	RETLW	'C'
	RETLW	'T'
	RETLW	'A'
	RETLW	00H

MEN_4	RETLW	'C'
	RETLW	'A'
	RETLW	'M'
	RETLW	'B'
	RETLW	'I'
	RETLW	'O'
	RETLW	' '
	RETLW	'D'
	RETLW	'E'
	RETLW	00H

MEN_6	RETLW	' '
	RETLW	'A'
	RETLW	'N'
	RETLW	'T'
	RETLW	'I'
	RETLW	'G'
	RETLW	'U'
	RETLW	'A'
	RETLW	00H

MEN_7	RETLW	'N'
	RETLW	'U'
	RETLW	'E'
	RETLW	'V'
	RETLW	'A'
	RETLW	00H

MEN_8	RETLW	'V'
	RETLW	'E'
	RETLW	'R'
	RETLW	'I'
	RETLW	'F'
	RETLW	'I'
	RETLW	'Q'
	RETLW	'U'
	RETLW	'E'
	RETLW	00H

MEN_9	RETLW	' '
	RETLW	'C'
	RETLW	'A'
	RETLW	'M'
	RETLW	'B'
	RETLW	'I'
	RETLW	'A'
	RETLW	'D'
	RETLW	'A'
	RETLW	00H

MEN_10	RETLW	'L'
	RETLW	'A'
	RETLW	' '
	RETLW	'C'
	RETLW	'L'
	RETLW	'A'
	RETLW	'V'
	RETLW	'E'
	RETLW	' '
	RETLW	'D'
	RETLW	'E'
	RETLW	'B'
	RETLW	'E'
	RETLW	00H

MEN_11	RETLW	'T'
	RETLW	'E'
	RETLW	'N'
	RETLW	'E'
	RETLW	'R'
	RETLW	' '
	RETLW	'4'
	RETLW	' '
	RETLW	'D'
	RETLW	'I'
	RETLW	'G'
	RETLW	'I'
	RETLW	'T'
	RETLW	'O'
	RETLW	'S'
	RETLW	00H

MEN_12	RETLW	'I'
	RETLW	'N'
	RETLW	'T'
	RETLW	'E'
	RETLW	'N'
	RETLW	'T'
	RETLW	'E'
	RETLW	'L'
	RETLW	'O'
	RETLW	00H

MEN_13	RETLW	'D'
	RETLW	'E'
	RETLW	' '
	RETLW	'N'
	RETLW	'U'
	RETLW	'E'
	RETLW	'V'
	RETLW	'O'
	RETLW	00H


INICIO	CLRF	DATO
	CLRF	KEYB
	CLRF	PORTA
	BSF	STATUS,5
	MOVLW	06H
	MOVWF	9FH
	CLRF	DATO
	BCF	EN
	BCF	RW
	BCF	RS
	BCF	ALA
	BCF	PORTERO
	MOVLW	0F0H
	MOVWF	KEYB
	BCF	STATUS,5
	BCF	PIR2,4
	MOVLW	03H
	MOVWF	INTENTO
	

	CALL	INITLCD
	CALL	INITLCD
PRINCI	CALL	CLEARL


	MOVLW	00H
	CALL	SITUCU
	MOVLW	MEN_1
	CALL	ESCMEN

	MOVLW	44H
	CALL	SITUCU

ECOD12	CALL	SUELKEY
	CALL	ESPEKEY
	MOVWF	COD1
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD12
	MOVF	COD1,W
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	INCOR
	MOVF	COD1,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	CAMBIOC
	MOVF	COD1,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD12
	MOVLW	'*'
	CALL	WRITEL
ECOD22	CALL	SUELKEY


	CALL	ESPEKEY
	MOVWF	COD2
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD1
	MOVF	COD2,W
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	INCOR
	MOVF	COD2,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	CAMBIOC
	MOVF	COD2,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD22
	MOVLW	'*'
	CALL	WRITEL
ECOD32	CALL	SUELKEY

	CALL	ESPEKEY
	MOVWF	COD3
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD2
	MOVF	COD3,W
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	INCOR
	MOVF	COD3,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	CAMBIOC
	MOVF	COD3,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD32
	MOVLW	'*'
	CALL	WRITEL
ECOD42	CALL	SUELKEY
	
	CALL	ESPEKEY
	MOVWF	COD4
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD3
	MOVF	COD4,W
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	INCOR
	MOVF	COD4,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	CAMBIOC
	MOVF	COD4,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD42
	MOVLW	'*'
	CALL	WRITEL
	CALL	SUELKEY

	
FINCOD	CALL	ESPEKEY
	MOVWF	TECLA
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	FINCOD2
	MOVF	TECLA,W
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD4
	MOVF	TECLA,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	CAMBIOC
	GOTO	FINCOD

FINCOD2	MOVLW	00H
	CALL	LEECOD
	SUBWF	COD1
	BTFSS	STATUS,2
	GOTO	INCOR

	MOVLW	01H
	CALL	LEECOD
	SUBWF	COD2
	BTFSS	STATUS,2
	GOTO	INCOR

	MOVLW	02H
	CALL	LEECOD
	SUBWF	COD3
	BTFSS	STATUS,2
	GOTO	INCOR

	MOVLW	03H
	CALL	LEECOD
	SUBWF	COD4
	BTFSS	STATUS,2
	GOTO	INCOR

	
	CALL	CLEARL		;CLAVE CORRECTA
	MOVLW	02H
	CALL	SITUCU
	MOVLW	MEN_2
	CALL	ESCMEN
	MOVLW	03H
	MOVWF	INTENTO
	BSF	PORTERO
	MOVLW	T_RELE
	CALL	DELAY
	BCF	PORTERO
	MOVLW	10H
	CALL	DELAY
	GOTO	PRINCI

INCOR	MOVLW	0CH
	CALL	COMANDO
	CALL	CLEARL
	MOVLW	MEN_3
	CALL	ESCMEN
	DECFSZ	INTENTO,F
	GOTO	INCOR2
	GOTO	ALARMA
INCOR2	MOVLW	20H
	CALL	DELAY
	GOTO	PRINCI

ECOD1	MOVLW	44H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	44H
	CALL	SITUCU
	GOTO	ECOD12

ECOD2	MOVLW	45H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	45H
	CALL	SITUCU
	GOTO	ECOD22

ECOD3	MOVLW	46H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	46H
	CALL	SITUCU
	GOTO	ECOD32

ECOD4	MOVLW	47H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	47H
	CALL	SITUCU
	GOTO	ECOD42

ALARMA	MOVLW	1EH
	MOVWF	TECLA
ALARMA4	MOVLW	03H
	MOVWF	INTENTO
	MOVLW	00FH
	MOVWF	CUENTA1
	MOVLW	030H
	MOVWF	CUENTA2
ALARMA1	MOVLW	20H
	MOVWF	CUENTA4
	DECF	CUENTA1,F
	BTFSC	STATUS,2
	GOTO	ALARMA2
ALARMA3	BSF	ALA
	CALL	FRECU
	BCF	ALA
	CALL	FRECU
	DECFSZ	CUENTA4,F
	GOTO	ALARMA3
	GOTO	ALARMA1
		
ALARMA2	MOVLW	01H
	CALL	DELAY
	DECFSZ	TECLA,F
	GOTO	ALARMA4
	GOTO	PRINCI

FRECU	MOVF	CUENTA1,W
	MOVWF	CUENTA3
FRECU2	DECFSZ	CUENTA3,F
	GOTO	FRECU2
	DECFSZ	CUENTA2,F
	GOTO	FRECU
	MOVLW	030H
	MOVWF	CUENTA2
	RETURN

CAMBIOC	CALL	CLEARL
	MOVLW	MEN_4
	CALL	ESCMEN
	MOVLW	MEN_5
	CALL	ESCMEN
	MOVLW	20H
	CALL	DELAY
	CALL	CLEARL
	MOVLW	MEN_5
	CALL	ESCMEN
	MOVLW	MEN_6
	CALL	ESCMEN
	CALL	SUELKEY
	MOVLW	44H
	CALL	SITUCU	

	CALL	COGECOD
	MOVLW	00H
	CALL	LEECOD
	SUBWF	COD1
	BTFSS	STATUS,2
	GOTO	INCORE
	
	MOVLW	01H
	CALL	LEECOD
	SUBWF	COD2
	BTFSS	STATUS,2
	GOTO	INCORE

	MOVLW	02H
	CALL	LEECOD
	SUBWF	COD3
	BTFSS	STATUS,2
	GOTO	INCORE

	MOVLW	03H
	CALL	LEECOD
	SUBWF	COD4
	BTFSS	STATUS,2
	GOTO	INCORE

	MOVLW	03H
	MOVWF	INTENTO

NUEVACL	CALL	CLEARL
	MOVLW	02H
	CALL	SITUCU
	MOVLW	MEN_7
	CALL	ESCMEN
	MOVLW	MEN_5
	CALL	ESCMEN
	MOVLW	44H
	CALL	SITUCU
	CALL	SUELKEY
	CALL	COGECOD
	MOVF	COD1,W		
	BTFSC	STATUS,2
	GOTO	INCOREC
	MOVWF	COD1A
	MOVF	COD2,W
	BTFSC	STATUS,2
	GOTO	INCOREC
	MOVWF	COD2A
	MOVF	COD3,W
	BTFSC	STATUS,2
	GOTO	INCOREC
	MOVWF	COD3A
	MOVF	COD4,W
	BTFSC	STATUS,2
	GOTO	INCOREC
	MOVWF	COD4A

	CALL	CLEARL		;VERIFIQUE CLAVE
	MOVLW	MEN_8
	CALL	ESCMEN
	MOVLW	MEN_5
	CALL	ESCMEN
	MOVLW	44H
	CALL	SITUCU
	CALL	SUELKEY
	CALL	COGECOD
	MOVF	COD1,W		
	SUBWF	COD1A,W
	BTFSS	STATUS,2
	GOTO	NOVERI
	MOVF	COD2,W
	SUBWF	COD2A,W
	BTFSS	STATUS,2
	GOTO	NOVERI
	MOVF	COD3,W
	SUBWF	COD3A,W
	BTFSS	STATUS,2
	GOTO	NOVERI
	MOVF	COD4,W
	SUBWF	COD4A,W
	BTFSS	STATUS,2
	GOTO	NOVERI

	CALL	CLEARL		;CLAVE CAMBIADA
	MOVLW	MEN_5
	CALL	ESCMEN
	MOVLW	MEN_9
	CALL	ESCMEN

	MOVF	COD1,W
	MOVWF	CODWRITE
	MOVLW	00H
	CALL	EEWRITE

	MOVF	COD2,W
	MOVWF	CODWRITE
	MOVLW	01H
	CALL	EEWRITE

	MOVF	COD3,W
	MOVWF	CODWRITE
	MOVLW	02H
	CALL	EEWRITE

	MOVF	COD4,W
	MOVWF	CODWRITE
	MOVLW	03H
	CALL	EEWRITE
	MOVLW	20H
	CALL	DELAY

	GOTO	PRINCI

NOVERI	CALL	CLEARL
	MOVLW	03H
	CALL	SITUCU
	MOVLW	MEN_12
	CALL	ESCMEN
	MOVLW	43H
	CALL	SITUCU
	MOVLW	MEN_13
	CALL	ESCMEN
	MOVLW	20H
	CALL	DELAY
	GOTO	NUEVACL
	


INCOREC	CALL	CLEARL		;LA CLAVE DEBE TENER 4 DIGITOS
	MOVLW	MEN_10
	CALL	ESCMEN
	MOVLW	40H
	CALL	SITUCU
	MOVLW	MEN_11
	CALL	ESCMEN
	MOVLW	20H
	CALL	DELAY
	GOTO	PRINCI

INCORE	DECF	INTENTO,F
	BTFSC	STATUS,2
	GOTO	ALARMA
	CALL	CLEARL
	MOVLW	MEN_3
	CALL	ESCMEN
	MOVLW	20H
	CALL	DELAY
	CALL	SUELKEY
	GOTO	PRINCI
	
;-----------------------------------------------------------------
COGECOD	CLRF	COD1
	CLRF	COD2
	CLRF	COD3
	CLRF	COD4
ECOD12C	CALL	SUELKEY
	CALL	ESPEKEY
	MOVWF	COD1
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD12C
	MOVF	COD1,W
	SUBLW	'A'
	BTFSC	STATUS,2
	RETURN
	MOVF	COD1,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	ECOD12C
	MOVF	COD1,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD12C
	MOVLW	'*'
	CALL	WRITEL
ECOD22C	CALL	SUELKEY


	CALL	ESPEKEY
	MOVWF	COD2
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD1C
	MOVF	COD2,W
	SUBLW	'A'
	BTFSC	STATUS,2
	RETURN
	MOVF	COD2,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	ECOD22C
	MOVF	COD2,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD22C
	MOVLW	'*'
	CALL	WRITEL
ECOD32C	CALL	SUELKEY

	CALL	ESPEKEY
	MOVWF	COD3
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD2C
	MOVF	COD3,W
	SUBLW	'A'
	BTFSC	STATUS,2
	RETURN
	MOVF	COD3,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	ECOD32C
	MOVF	COD3,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD32C
	MOVLW	'*'
	CALL	WRITEL
ECOD42C	CALL	SUELKEY
	
	CALL	ESPEKEY
	MOVWF	COD4
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD3C
	MOVF	COD4,W
	SUBLW	'A'
	BTFSC	STATUS,2
	GOTO	RETU4
	MOVF	COD4,W
	SUBLW	'C'
	BTFSC	STATUS,2
	GOTO	ECOD42C
	MOVF	COD4,W
	SUBLW	'D'
	BTFSC	STATUS,2
	GOTO	ECOD42C
	MOVLW	'*'
	CALL	WRITEL
	CALL	SUELKEY

	
FINCODC	CALL	ESPEKEY
	MOVWF	TECLA
	SUBLW	'A'
	BTFSC	STATUS,2
	RETURN			;YA TENGO EL CÓDIGO
	MOVF	TECLA,W
	SUBLW	'B'
	BTFSC	STATUS,2
	GOTO	ECOD4C
	GOTO	FINCODC


ECOD1C	MOVLW	44H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	44H
	CALL	SITUCU
	CLRF	COD2
	GOTO	ECOD12C

ECOD2C	MOVLW	45H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	45H
	CALL	SITUCU
	CLRF	COD3
	GOTO	ECOD22C

ECOD3C	MOVLW	46H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	46H
	CALL	SITUCU
	CLRF	COD4
	GOTO	ECOD32C

ECOD4C	MOVLW	47H
	CALL	SITUCU
	MOVLW	' '
	CALL	WRITEL
	MOVLW	47H
	CALL	SITUCU
	GOTO	ECOD42C

RETU4	CLRF	COD4
	RETURN
	
;-----------------------------------------------------------------
;	LEECOD:		SUBRUTINA QUE LEE EL REGISTRO DE LA EEPROM
;			INDICADO POR EL ACUMULADOR Y LO DEVUELVE EN
;			ACUMULADOR

LEECOD	BSF	STATUS,6
	BCF	STATUS,5
	MOVWF	EEADR
	BSF	STATUS,5
	BCF	EECON1,7
	BSF	EECON1,0
	BCF	STATUS,5
	MOVF	EEDATA,W
	BCF	STATUS,6
	RETURN
;----------------------------------------------------------------

;-----------------------------------------------------------------

;	EEWRITE:	SUBRUTINA QUE ESCRIBE EN LA EEPRON DE DATOS
;			PASAR LA DIRECCION DE LA EEPRON A ESCRIBIR EN W Y EL DATO A ESCRIBIR EN CODWRITE

EEWRITE	BSF	STATUS,6
	BCF	STATUS,5
	MOVWF	EEADR
	BCF	STATUS,6
	MOVF	CODWRITE,W
	BSF	STATUS,6
	MOVWF	EEDATA
	BSF	STATUS,5
	BCF	EECON1,7
	BSF	EECON1,2
	BCF	INTCON,7
	MOVLW	55H
	MOVWF	EECON2
	MOVLW	0AAH
	MOVWF	EECON2
	BSF	EECON1,1
	BSF	INTCON,7
	BCF	STATUS,5
	BCF	STATUS,6
EEWRIT	BTFSS	PIR2,4
	GOTO	EEWRIT
	BSF	STATUS,5
	BSF	STATUS,6
	BCF	EECON1,2
	BCF	STATUS,5
	BCF	STATUS,6
	BCF	PIR2,4

	RETURN

	



	


;----------------------------------------------------------
;	GETKEY:	Subrutina que devuelve el valor pulsado en
;		un teclado hexadecimal en código ascii en W
;COL1: 0	COL2: 1		COL3: 2		COL4: 3
;ROW1: 4	ROW2: 5		ROW3: 6		ROW4: 7



GETKEY	MOVLW	0FH
	MOVWF	KEYB
	NOP
	MOVF	KEYB,W
	MOVWF	TECLA
	CALL	REBOTE
	MOVF	KEYB,W
	SUBWF	TECLA,F
	BTFSS	STATUS,2
	GOTO	GETKEY
	SUBLW	0FH
	BTFSS	STATUS,2
	GOTO	HAYTECL
	RETLW	0FH
HAYTECL	BTFSC	KEYB,4
	GOTO	ROW1
	BTFSC	KEYB,5
	GOTO	ROW2
	BTFSC	KEYB,6
	GOTO	ROW3
	BTFSC	KEYB,7
	GOTO	ROW4
	RETLW	0FH
ROW1	MOVLW	01H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,4
	RETLW	31H	;TECLA=1
	MOVLW	02H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,4
	RETLW	32H	;TECLA=2
	MOVLW	04H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,4
	RETLW	33H	;TECLA=3
	MOVLW	08H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,4
	RETLW	'A'	;TECLA=A
	RETLW	0FH

ROW2	MOVLW	01H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,5
	RETLW	34H	;TECLA=4
	MOVLW	02H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,5
	RETLW	35H	;TECLA=5
	MOVLW	04H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,5
	RETLW	36H	;TECLA=6
	MOVLW	08H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,5
	RETLW	'B'	;TECLA=B
	RETLW	0FH

ROW3	MOVLW	01H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,6
	RETLW	37H	;TECLA=7
	MOVLW	02H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,6
	RETLW	38H	;TECLA=8
	MOVLW	04H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,6
	RETLW	39H	;TECLA=9
	MOVLW	08H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,6
	RETLW	'C'	;TECLA=C
	RETLW	0FH

ROW4	MOVLW	01H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,7
	RETLW	'*'	;TECLA=*
	MOVLW	02H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,7
	RETLW	30H	;TECLA=0
	MOVLW	04H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,7
	RETLW	'#'	;TECLA=#
	MOVLW	08H
	MOVWF	KEYB
	NOP
	BTFSC	KEYB,7
	RETLW	'D'	;TECLA=D
	RETLW	0FH
;----------------------------------------------------------------
;-----------------------------------------------------------
;	SUELKEY:	SUBRUTINA QUE ESPERA A QUE SE SUELTE
;			LA TECLA PULSADA

SUELKEY CALL	GETKEY
	SUBLW	0FH
	BTFSC	STATUS,2
	RETURN
	GOTO	SUELKEY
;-----------------------------------------------------------
;---------------------------------------------------------------------
;     	ESPEKEY:	SUBRUTINA QUE ESPERA A QUE SE PULSE UNA TECLA
;			DEVUELVE EL VALOR EN W Y TECLA

ESPEKEY	CALL	GETKEY
	MOVWF	TECLA
	SUBLW	0FH
	BTFSC	STATUS,2
	GOTO	ESPEKEY
	MOVF	TECLA,W
	RETURN
;----------------------------------------------------------------------


;--------------------------------------------------------------------------------------------
;	   ESCMEN:	SUBRUTINA QUE ESCRIBE UN MENSAJE EN EL LCD, 
;			PASAR INICIO DE TABLA EN ACUMULADOR

ESCMEN	MOVWF	PUNTAB
ESCMEN2	CALL	TABLA
	ADDLW	00H
	BTFSC	STATUS,2
	RETURN
	CALL	WRITEL
	INCF	PUNTAB,F
	MOVF	PUNTAB,W
	GOTO	ESCMEN2
;-------------------------------------------------------------------------------------------

	

;-------------------------------------------------------------------------------------------
;          WAITLCD:	SUBRUTINA DE ESPERA AL LCD

WAITLCD	BSF	STATUS,5
	MOVLW	0FFH
	MOVWF	DATO
	BCF	STATUS,5
	BSF	EN
	BCF	RS
	BSF	RW
	MOVLW	0FFH
	MOVWF	DATO
WAITLC	BTFSC	DATO,7
	GOTO	WAITLC
	BCF	EN
	BCF	RW
	BCF	DATO,7
	BSF	STATUS,5
	CLRF	DATO
	BCF	STATUS,5
	RETURN
;--------------------------------------------------------------------------------------------
	
	

;--------------------------------------------------------------------------------------------
;          INITLCD:	SUBRUTINA DE INICIALIZACIÓN DEL LCD

INITLCD	MOVLW	38H		;00111000
	CALL	COMANDO		;INTERFACE 8 BIT, 2 LINEAS
	MOVLW	0CH		;00001100
	CALL	COMANDO		;DISPLAY A ON, NO MUESTRA CURSOR, NO PARPADEO
	MOVLW	06H		;00000110
	CALL	COMANDO		;MUEVE CURSOR A LA DCHA DESPUES D ESCRIBIR, NO MUEVE VENTANA
	RETURN
;-------------------------------------------------------------------------------------------



;-------------------------------------------------------------------------------------------
;	   CLEARL:	SUBRUTINA QUE BORRA EL LCD Y LLEVA EL CURSOR AL LADO IZQUIERDO DEL
;			DISPLAY

CLEARL	MOVLW	01H
	CALL	COMANDO		;BORRADO
	RETURN
;--------------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------------
;	   WRITEL:	SUBRUTINA QUE ESCRIBE EN EL LCD EL CARACTER DEL ACUMULADOR

WRITEL	BSF	EN
	BSF	RS
	BCF	RW
	MOVWF	DATO
	BCF	EN
	CALL	WAITLCD
	RETURN
;---------------------------------------------------------------------------------------------


;---------------------------------------------------------------------------------------------
;	   COMANDO:	SUBRUTINA QUE ENVIA UN COMANDO AL LCD

COMANDO	BSF	EN
	BCF	RS
	BCF	RW
	MOVWF	DATO
	BCF	EN
	CALL	WAITLCD
	RETURN
;---------------------------------------------------------------------------------------------
;	   SITUCU:	SUBRUTINA QUE SITUA EL CURSOR EN LA DIRECCION INDICADA POR EL ACUMULADOR

SITUCU	IORLW	80H
	CALL	COMANDO
	RETURN
;----------------------------------------------------------------------------------------------
;=====================================================================
;***********  DELAY  ***********
;---------------------------------------------------------------------
;SUBRUTINA DE RETARDO SEGÚN EL VALOR DEL ACUMULADOR
;MODIFICA LOS SIGUIENTES REGISTROS
;	CUENTA1
;	CUENTA2
;	CUENTA3

DELAY	MOVWF	CUENTA1
DELAY3	MOVLW	0FFH
	MOVWF	CUENTA2
DELAY2	MOVLW	0FFH
	MOVWF	CUENTA3
DELAY1	DECFSZ	CUENTA3,F
	GOTO	DELAY1
	DECFSZ	CUENTA2,F
	GOTO	DELAY2
	DECFSZ	CUENTA1,F
	GOTO	DELAY3
	RETURN
;======================================================================
REBOTE	MOVLW	0FFH
	MOVWF	CUENTA1
REBO	DECFSZ	CUENTA1,F
	GOTO	REBO
	RETURN

	ORG	2100H
	DE	30H,30H,30H,30H

	END

espero que me puedas ayudar o darme un vasito con agua para poder desatorarme..!:D

Hola falcondj como estás.

Mirá te quiero hacer unas consultas:

1° - Tenés el hardware donde estás haciendo las pruebas ?
2° - Que modificaciones has hecho antes de plantearme las dudas ?
3° - Hiciste el paso a paso que te indiqué para realizar tu programa ?
4° - Que conocimientos tenés de programación en C ?

Es común presentarse con un proyecto a un foro por que no te sale,pero no te puedo ayudar si no tirás ideas permanentemente. Es decir, si vos no planteas paso a paso tus dudas no te podemos ayudar de forma directa.

Yo personalmente te puedo largar ideas pero no tengo tiempo para realizar las pruebas yo y decirte donde está el error.

Como una ayuda a la causa busqué exactamente lo que necesitas: http://issuu.com/tecnoelecsena/docs/informe_proyecto_cerradura

Este proyecto al parecer es funcional. Tendrías que estudiarlo y fondo y ver si te sirve la implementación.

hola que tal jonathan respondo a tus consultas

1º- si tengo el programa para hacer mis pruebas manejo el proteus 7.7 sp2 con el ccs 4.110
2º- las modificaciones que le hecho te las presento al final y te digo donde el ccs me compila 100 errores desde el punto especificado
3º- si hice el diagrama de flujos que me solicitastes pero no pude solucionarlo
4º- el conocimiento que tengo en el lenguaje c es basico soy novatos :D

el problema que tengo es el siguiente :

Código:
#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=11059200)
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#rom 0x2100={'1','2','3','4'}
void main()
 {
     int i;
     char tecla=0;
     char datos[4],clave[4];
     lcd_init();
     kbd_init();
     port_b_pullups(true);
ciclo:
     for(i=0;i<=4;i++) clave[i]=read_eeprom(i);
     tecla=0;
  
     while(tecla==0) tecla=kbd_getc();
    
         lcd_putc("\fINTRODUCIR CLAVE\n");
         tecla=0;
         for(i=0;i<4;i++)
         {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            datos[i]=tecla;
            lcd_putc(" *");
            tecla=0;
         }
          if (tecla=='#')
         if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
         {
            lcd_putc("\fPUERTA ABIERTA");
            output_high(pin_a0);
            delay_ms(3000);
            output_low(pin_a0);
         }
         else
         {
            lcd_putc("\fCLAVE ERRONEA");
            delay_ms(3000);
         }
         goto ciclo;
     }
     
           if (tecla=='*')  [COLOR="Red"]desde aqui me salen los 100 errores [/COLOR]:cry:
     
  {
         lcd_putc("\f CLAVE  ACTUAL\n");
         tecla=0;
         for(i=0;i<4;i++)
         {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            datos[i]=tecla;
            lcd_putc("*");
            tecla=0;
         }
         if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
         {
            lcd_putc("\fNUEVA CLAVE\n");
            for(i=0;i<4;i++)
            {
            while(tecla==0) tecla=kbd_getc();
            delay_ms(150);
            write_eeprom(i,tecla);
            lcd_putc("*");
            tecla=0;
            }
            lcd_putc("\fCLAVE MODIFICADA\n");
            delay_ms(1000);
         }
         else
         {
            lcd_putc("\fCLAVE ERRONEA");
            delay_ms(3000);
         }
     }
     goto ciclo;
 }
de antemano muchas gracias por tu colaboracion un saludo :apreton:
 
Última edición:
1º- si tengo el programa para hacer mis pruebas manejo el proteus 7.7 sp2 con el ccs 4.110
Hardware no software. Por favor armá un prototipo de lo que querés hacer es la única manera de poder solucionar tu problema de manera inmediata.

Por favor abrí el link que te digo , ahí vas a ver la implementación de otra persona que tiene tu mismo proyecto.
 
muchas gracias por su colaboracion ya me doy por rendido este proyecto esta muy complejo lo intente de todas las formas la arme en pcb y nada, muchas gracias por toda su colaboracion y no les quito mas de su valioso tiempo :cry: :abrazo:
 
Atrás
Arriba