Hola a todos! Continuo con los avances. He conseguido meter la interrupcion externa y que funcionen ambas cosas. Lo que no consigo es que me guarde las teclas pulsadas como una cadena para que aparezcan en el display una detras de otra. En el display las teclas las oculto mediante asteriscos. Seguiré intentando lo de la cadena y mas avances. Por cierto, os pediría un favor, ¿como se hace para poner el código en una pequeña ventanita mas pegueña? Lo veo en muchos post y no se como se hace y así lograría que los mios no ocupasen tanto jajajaj. Pongo el código:
#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
////////////////DEFINICION DE FUNCIONES////////////////////////////
void escribir_clave(char clave[]); //funcion que escibre la clave tecleada
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
char clave_introducida[3]={}; //variable usada para los datos ingresados
signed char i; //variable usada para movernos por las posiciones de la memoria
/********************************
Esta Rutina permite rastrear el teclado
y devuelve el valor de la tecla que se
ha presionado
************************************/
int captura(void)
{
int const teclado[4][4] = {{0,'1','2','3'},
{0,'4','5','6'},
{0,'7','8','9'},
{0,'*','0','#'}};
int tecla,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);
}
/***************************************
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.
{
tecla = captura();
flag_teclado=1;
}
set_tris_b(0b11110000);
output_b(0b00001111);
clear_interrupt(INT_RB);
set_tris_b(0b11110001);
//input_b();
}
//////////////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);
while(TRUE)
{
if(flag_teclado==1)
{
escribir_clave(clave_introducida); //tecleo la contraseña
flag_teclado=0;
//break;
}
if(bandera==1)
{
bandera=0;
alarma_general();
//break;
}
}
}
//////////FUNCION ESCRIBIR NUEVA CLAVE
void escribir_clave(char clave[]) //funcion que escibre la clave tecleada
{
int i=0;
lcd_putc("\fEscribir clave:\n"); //presentacion
if(!(tecla=='*' || tecla=='#')) // Si no es '*' o '#' en la pantalla aparece un '*'
{
lcd_putc("*");
clave=tecla;
}
i++;
}
//////////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
}