Hola saludos he escrito el codigo para ingresar una clave y si es la correcta encender un led un corto tiempo, si es incorrecta encender el mismo led pero mas tiempo, hice la rutina de exploracion del teclado, y despues pregunto por cada tecla ingresada hasta que se digiten 5 teclas y fin de ingreso un '*', verifica y si es correcto debe hacer lo necesario, pero no me funciona, algo esta mal?? ayuda por favor, por que lo hago correr y me da problemas, porque no reconoce ninguna clave ingresada y parece que simepre dara error, esta muy raro, creo haber escrito correctamente el codigo, les dejo en el adjunto el hex y el dsn de proteus, muchas gracias; aca el codigo:
/*------------------------------------------------------------------------------------*/
/* Teclado matricial 4x4 4 filas x 4 columas, puede adaptarse fácilmente a uno 4x3 */
/* Diseñado Cryn ---- 2006 */
/* */
/* C1 C2 C3 C4 */
/* F1 1 2 3 C *=A */
/* F2 4 5 6 D #=B */
/* F3 7 8 9 E */
/* F4 * 0 # F */
/* La exploración del teclado lo que hace es verificar secuencialmente y en orden */
/* la situación de las columnas 1,2,3 y 4 enviando '0' por la columna que queremos */
/* analizar y '1' al resto, si se encontrara algún pulsador activado, el código */
/* recibido por las filas sería diferente a 1111 que es el valor de reposo */
/* */
/* 4 resistencias pull-up en las entradas RB4 a RB7 */
/*------------------------------------------------------------------------------------*/
#include<16F84A.h>
#FUSES XT,NOWDT,PUT,NOPROTECT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#use fast_io(a)
#use fast_io(b)
unsigned char CONST clave[5]={'1','2','3','4','5'};
boolean var=0;
char c;
int limit;
int i=0;
int digitos=5;
void delay()
{
delay_ms(50);
}
char kbd_getc() // función que explora todo el teclado
{
port_b=0xfe; // verifica columna 1
if(bit_test(port_b,4)==0)
{delay();
return ('1');} // si se presiono el uno devuelve 1
if(bit_test(port_b,5)==0)
{delay();
return ('4');} // si se presiono el cuatro devuelve 4
if(bit_test(port_b,6)==0)
{delay();
return ('7');} // si se presiono el siete devuelve 7
if(bit_test(port_b,7)==0)
{delay();
return ('*'); } // si se presiono el * devuelve 10 = A
port_b=0xfc; // verifica columna 2
if(bit_test(port_b,4)==0)
{delay();
return ('2');} // si se presiono el dos devuelve 2
if(bit_test(port_b,5)==0)
{delay();
return ('5');} // si se presiono el cinco devuelve 5
if(bit_test(port_b,6)==0)
{delay();
return ('8');} // si se presiono el ocho devuelve 8
if(bit_test(port_b,7)==0)
{delay();
return ('0');} // si se presiono el cero devuelve 0
port_b=0xfb; // verifica columna 3
if(bit_test(port_b,4)==0)
{delay();
return ('3');} // si se presiono el tres devuelve 3
if(bit_test(port_b,5)==0)
{delay();
return ('6');} // si se presiono el seis devuelve 6
if(bit_test(port_b,6)==0)
{delay();
return ('9'); } // si se presiono el nueve devuelve 9
if(bit_test(port_b,7)==0)
{delay();
return '#'; } // si se presiono el # devuelve 11 = B
// si se tiene una matriz 4x3 no se usará el pin RB3
port_b=0xf7; // verifica columna 4
if(bit_test(port_b,4)==0)
{delay();
return ('C');} // si se presiono la C devuelve 12 = C
if(bit_test(port_b,5)==0)
{delay();
return ('D');} // si se presiono la D devuelve 13 = D
if(bit_test(port_b,6)==0)
{delay();
return ('E');} // si se presiono la E devuelve 14 = E
if(bit_test(port_b,7)==0)
{delay();
return ('F');} // si se presiono el F devuelve 15 = F
if(port_b==0xfb)
return (0); // devuelve 16 en caso de no haber presionado ningun pulsador
// podria colocarse otra alternativa en caso de que no se presione ningun pulsador
}
void main() // programa principal
{
set_tris_b(0xf0); // define RB0 a RB3 (columnas) como salidas y RB4 a RB7 (filas) como entradas
port_b=0; // inicializa puerto B
set_tris_a(0xfe); // define puerto A como todas entradas excepto RA0
port_a=0; // inicializa puerto A
port_b_pullups(TRUE); // activa pull up del puerto b, no hará falta conectar resistencias
while(true) // bucle de trabajo
{
while(1)
{
do
{
c=kbd_getc();
}while(c==0);
if(c==clave)
{
var=0;
i++;
}
else
{
var=1;
break;
}
if(i==digitos && c=='*')
break;
}
if(var==0){
output_high(PIN_A0);
delay_ms(500);
output_low(PIN_A0);}
else{
output_high(PIN_A0);
delay_ms(2000);
output_low(PIN_A0);
}
}
}