ok veamos checa los cambios que he echo
1.- En la funcion captura() no es necesario que la declares que regresa un valor int,en este caso modificas a la variable tecla y como es global no hace falta que regrese algún valor
2.- Coloque un mensaje en el display de "Escribir clave" despues del "Bienvenido inicial,ya que solo lo veo que lo tienes pero hasta que presionan una tecla
3.- La variable d,es global,no es necesario redeclararla,eso lo tienes para varias variables,checalo,si esta como global no tiene sentido redeclararla
4.- Cambie la forma en la que inicializas la variable clave,de clave=0 a clave[3]={'0','0','0'},es lo mismo en teoria pero no me fio jeje
5.- Coloque un delay de 500ms despues del mensaje de "Nueva Clave"
6.- Cambie el lugar donde tienes tu funcion de captura,solo la movi mas abajo,despues del main()
6.- En tu funcion que cambia la clave de administrador agregue un ciclo para asegurarnos que no salga de alli hasta que alla capturado los 3 nuevos valores y claro que los alla guardado
coloco el codigo checalo y prueba y ya me diras si va o no va
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay (CLOCK=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_b = 0x06
#byte tris_b = 0xff
#include <LCD4.c> //libreria manejo lcd 8 bits
#include <string.h> //libreria manejo cadenas
#rom 0x2100={0,0,0,0,0,0,0} //la EEPROM se carga con los valores 00h desde la direccion 00h hasta 06h
////////////////DEFINICION DE FUNCIONES////////////////////////////
void cambia_clave_inicial(void); //funcion que cambia la clave iinicial
void escribir_clave(void); //funcion que escibre la clave tecleada
void nueva_clave_admin(void); //funcion que añade la nueva clave administrativa
void limpiar_clave(void);
void alarma_general(void); //funcion que enciende la sirena
////////////////VARIABLES GLOBALES///////////////////////////
int flag_teclado;
int tecla,fila,columna;
char bandera=0;
char clave[3]={}; //variable usada para recoger la clave tecleada y guardarla en ROM
char clave_inicial[3]= {'1','2','3'}; //variable usada como clave de inicio
int d=0; //variable usada para movernos por las posiciones de la memoria
//int e=0;
/***************************************
Rutina de Interrupcion.
- Antirebote.
- Llama a rutina "captura" para saber
la tecla presionada.
- Activa la bandera "flag_teclado"
a usar en el main o en otra parte
del programa.
***************************************/
#INT_RB
void tecla_presionada()
{
int lectura_1,lectura_2;
lectura_1 = port_b & 0b11110000; //lee portb4:7 y lo guarda en lectura_1
delay_ms(10); //Funcion AntiRebotes: Espero 10ms.
lectura_2 = port_b & 0b11110000; //Vuelvo a leer el puerto.
if(lectura_1==lectura_2 && lectura_1!=0) //Si el valor es igual y distinto de 0 es porque en realidad se presiono una tecla.
{
flag_teclado=1;
captura();
}
set_tris_b(0b11110000);
output_b(0b00001111);
clear_interrupt(INT_RB);
set_tris_b(0b11110001);
}
//////////////INTERRUPCION EXTERNA//////////////////
#INT_EXT
void externa(void)
{
bandera=1;
}
//////////////PROGRAMA PRINCIPAL///////////////////////
void main()
{
set_tris_b(0b11110001);
set_tris_c(0b11111111); //configuro el puerto c
enable_interrupts(INT_RB);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
lcd_init(); //inicializa lcd
delay_ms(1000);
lcd_putc (" Bienvenido ");
delay_ms(1000);
lcd_putc("\fEscribir clave:\n");
while(TRUE)
{
if(flag_teclado==1)
{
flag_teclado=0;
cambia_clave_inicial(); //cambio la contraseña que viene por defecto
}
if(bandera==1)
{
bandera=0;
alarma_general();
}
}
}
/********************************
Esta Rutina permite rastrear el teclado
y devuelve el valor de la tecla que se
ha presionado
************************************/
void captura(void)
{
int const teclado[4][4] = {{0,'1','2','3'},
{0,'4','5','6'},
{0,'7','8','9'},
{0,'*','0','#'}};
int lectura,i;
for(i=0;i<4;i++)
{
output_b(0);
bit_set(port_b,i);
lectura = port_b & 0b11110000;
switch(lectura)
{
case 0b00010000: fila=0;
columna=i;
break;
case 0b00100000: fila=1;
columna=i;
break;
case 0b01000000: fila=2;
columna=i;
break;
case 0b10000000: fila=3;
columna=i;
break;
}
}
tecla = teclado[fila][columna];
return(tecla);
}
//////////FUNCION CAMBIAR CLAVE INICIAL
void cambia_clave_inicial(void) //funcion que cambia clave administrativa
{
int p;
escribir_clave(); //tecleo la contraseña
if (d==3)
{
p=strncmp(clave , clave_inicial,3); //comparo la clave por defecto con la tecleada
if (p==0) //si las dos claves son iguales:
{lcd_putc("\fClave Correcta\n");
delay_ms(2000);
limpiar_clave();
nueva_clave_admin(); //introduzco la nueva clave
}
if (p!=0) //si las dos claves son distintas
{lcd_putc("\fClave Incorrecta\n");
delay_ms(2000);
limpiar_clave();
alarma_general (); //activo la alarma
}
}
}
//////////FUNCION ESCRIBIR NUEVA CLAVE
void escribir_clave() //funcion que escibre la clave tecleada
{
lcd_putc("*");
clave[d]=tecla;
if(d<3)
{
d++;
}
else
{
d=0;
}
}
//////////FUNCION NUEVA CLAVE
void nueva_clave_admin(void) //funcion que añade la nueva clave administrativa
{
clave[3]={'0','0','0'}; //pongo la clave tecleada a 0
tecla=0;
aux=0;
//int fila=0;
//int columna=0;
lcd_putc("\fNueva clave:\n"); //presentacion
delay_ms(500);
for(aux=0;aux<3;aux++)
{
while(tecla==0);
flag_teclado=0;
lcd_putc("*");
clave[d]=tecla;
if(d<3)
{
escribir_clave_en_eeprom(d); //guardamos la nueva clave en la memoria EEPROM
tecla=0;
d++;
}
else
{
d=0;
}
}
}
//////////ESCRIBIR_CLAVE_EN_EEPROM
void limpiar_clave() //función que escribe las claves en la memoria eeprom
{
int k;
for(k=0;k<3;k++)
{
clave[k]=0x00;
}
}
//////////ESCRIBIR_CLAVE_EN_EEPROM
void escribir_clave_en_eeprom(int d) //función que escribe las claves en la memoria eeprom
{
write_eeprom (d,tecla); //guardamos cada valor de la variable global correspondiente
delay_ms(20); //en la direccion e + 0 (para no pisar datos) de la eeprom
d++; //en una palabra escribe de la posicion 0 a la 2 (3 lugares)
}
//////////FUNCION ALARMA GENERAL
void alarma_general (void)
{
set_tris_c(0b11111110); //pin C0 como salida
output_high(pin_C0); //enciende la sirena durante 2 seg y muestra mensaje
//lcd_putc("\fALARMA\n");
delay_ms(2000);
output_low(pin_C0); //apaga la sirena
//alarm_cont = 0; //pongo a cero el contador de errores
break;
}