# Teclado 3X4 y PIC 16f877A en PIC C



## andresarev (May 18, 2009)

Hola a todos, espero me puedan colaborar con mi duda.... Estoy haciendo un temporizador con un pic 16f877a el cual es activado con un teclado matricial. La idea es que cuando se oprima el numero '1' se inicia la temporización y cuando se oprime la tecla'#' se pause.. El problema es que cuando el micro esta temporizando no logro que reconozca cuando oprimo la tecla '#', necesito que por favor me colaboren. 


Es necesario el uso de interrupciones?........  Como podría hacerlo?...


Adjunto el codigo y la simulacion para que lo vean.

Muchas Gracias.


----------



## Ardogan (May 21, 2009)

Hay un problema con el código fuente, fijate esto:


```
start:while (TRUE) {
     k=kbd_getc();
          
//////////////////////// RUTINA TECLA 1 ////////////////////////
     if(k=='1')
        {counter=10;
         loop1:lcd_putc("\fMotor encendido");
         lcd_gotoxy(1,2);
         printf(lcd_putc,"por %u segundos ",counter);
         counter=counter-1;
         k=kbd_getc();
         delay_ms(1000);
        
          //ACA TENDRIAS QUE CERRAR EL if(k=='1')

            if(k=='#')//LA IDEA ES QUE ACA RECONOZCA QUE SE OPRIMIO LA TECLA # E INTERRUMPA LA TEMPORIZACION.
            {lcd_putc("\fMotor en pausa");
            delay_ms(5000);}//
          
            else {delay_ms(500);//Mitad de un segundo
            if (counter>0)
            goto loop1;
            else lcd_putc("\f Motor apagado");
            delay_ms(1000);
            lcd_putc("\fPulse una tecla \npara iniciar");
            k=kbd_getc();
            }
         }
          
//////////////////////// RUTINA TECLA 2 ////////////////////////
```
Tendrías que cerrar el * if(k=='1') * antes del  * if(k=='#') *.
Así como esta nunca va a detectar el #, porque el * if(k=='#') * está dentro de * if(k=='1') * y siempre va a dar falso.
A ver si corrigiendo eso te funciona.
Saludos


----------



## andresarev (May 27, 2009)

Hola ardogan, muchas gracias por tu colaboración; efectivamente era problema de {}. Además usé interrupciones y quedó super.



 Saludos


----------



## Ardogan (May 27, 2009)

Un placer, para ver ese tipo de cosas es útil usar el depurador para ejecutar el programa paso a paso y ver como se ejecuta.
Si nunca lo usaste te recomendaría leer la ayuda/buscar algún tutorial y aprenderlo, es una herramienta imprescindible a la hora de buscar fallas de programación. No errores de sintaxis, o tipos, eso los tira el compilador; sino para ver por qué un programa no hace lo que uno espera.

Hasta luego y suerte.


----------



## juandamendez (Nov 13, 2010)

Hola, he trabajado con pics pero no soy experto , estoy realizando un control de temperatura y necesito introducir el setpoint de temperatura al pic mediante un teclado 3x4 todo esto mostrarlo en la LCD ya tengo el código y muestra la tecla presionada en la LCD, pero llega un momento en donde el teclado "no responde" y no se si es problema de la libreria , del codigo o del proteus he intentado con las resistencias de pullups, pero no he conseguido nada, he hecho uso de las kbd.c que me he encontrado pero tampoco si alguien pudiera ayudarme le agradeceria.. adjunto el codigo, las librerias y la simulacion gracias....


----------



## fiurer (May 3, 2011)

hola, estoy trabajando con el teclado pero tube un problema he estado leyendo el block pero al momento de utilizar la libreria kbd y lcd como que no las jala no se bien si se tienen que compilar las librerias o solo las referencio en el programa principal.
kbd_ini()
kbd_ini()
estas inician los main de las librerias si no me equivoco verdad
si no corrijanme por favor.


----------



## temoink (May 17, 2012)

inicia la libreria del lcd con lcd_init()   y la del keypad con kbd_init()..esto va despues del void main()


----------



## lrzv09 (Ago 19, 2012)

hola tengo un problema estoy utilizando un pic 16f877a y no me funciona el keypad 3x4 no se qué pasa busco por todos lados hago todo y nada aquí les dejo mi código no soy muy bueno programando. Pero se que funciona mi código porque lo probe con una librería que consegui por internet. Copie este código que conseguí en la librería kbd.c y lo simulo en proteus y bien pero cuando le coloco el código original del ccs pic no me funciona. Le cambie el código porque en la vida real ese código que conseguí tampoco me funciona. Aquí les dejo mi código, espero me puedan ayudar.
Es una cerradura electrónica lo que hago...


```
#include <16f877a.h> //pic a utilizar 
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT,NODEBUG //ordenes para el programador 
#use delay (clock=4000000) //Fosc=4Mhz
#include<kbd.c> //libreria manejo keypad 
#include<lcd.c> //libreria manejo lcd 8bits 
#include<stdlib.h>
#use fixed_io(a_outputs=PIN_A3,PIN_A5,PIN_A1) 
#use fast_io(B) 
#byte port_d=8  
#define use_portb_kbd TRUE
#include<internal_eeprom.c>

///DEFINICION DE FUNCIONES 
void nueva_clave(void); //funcion que cambia clave 
void comprueba_clave(void); //funcion que comprueba clave 
void fabrica_clave(void); //comprobacion de fabrica
void clave_inicial(void); //clave inicial
void Password(void);//Password

///VARIABLES GLOBALES 
char clave[16],q,s,y,limit;
int k=0;
int h=0;
int f=0;
int m=0;
int u=0;
int g=0;
int l=0;


int a=0;
int w=0;
int c=0;
int b=0x18;
int d=0;
int j=0;

signed char i;

boolean var=0; 
boolean bar=0;

///PROGRAMA 

void main(void) {
 
   lcd_init(); //inicializa lcd 
   kbd_init(); //inicializa kbd
   //port_b_pullups(TRUE);
   
   delay_ms(50); //presentacion... 
   output_high(PIN_A3); 
   output_high(PIN_A5);
   delay_ms(2000);
   output_low(PIN_A3); 
   output_low(PIN_A5);
   
   if(Read_Eeprom(0xFF)!=1){
      clave_inicial();
      write_eeprom(0xFF,1);
   }
   
   lcd_putc("\fLRZV \nSeguridad" ); 
   delay_ms(2000); //...inicial
 
   do{
         Password();
      
   }while(m==1);
   
   while(1){
      if(bar==1){
         lcd_putc("\f0->Aceder\n1->Cambiar clave");
         do{ //espera hasta... 
            q=kbd_getc(); 
         }while(q==0); //...pulsar una tecla 
         if(q=='A'){ //ve a introducir nueva clave 
            h=0;
            nueva_clave();
         }
         if(q=='H'){ //ve a comprobar clave 
            comprueba_clave();
         }
      } 
   }
} 
/////////FUNCION CAMBIAR CLAVE /////////////////////////
void nueva_clave(void){ 
   while(h==0){ //espera hasta... 
      fabrica_clave(); 
   }
   w=0;
   write_eeprom(0xFC,w);
   lcd_putc("\fNueva clave:\n" ); //presentacion 
   for(i=0; ;i++){ 
      do{ //espera hasta... 
         q=kbd_getc();
      }while(q==0); //...pulsar una tecla 
      
      if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion 
         if(i==0){ //no se sale... 
            lcd_putc("\nEscribe una!!!" ); 
            delay_ms(2000);
            lcd_putc("\fNueva clave:\n" );
            lcd_gotoxy(1,2); 
            i=-1; 
            continue; //...hasta poner una clave valida 
         } 
         b=0x17;
         j=i;
         i=-1;
         for(c=0;c<0x16;c++){
            b=b+1;
            i=i+1;
            d=Read_Eeprom(b);
            write_eeprom(i,d);
         }
         b=0x18;
         l=Read_Eeprom(0xFC);
         write_eeprom(0xFB,w);
         write_eeprom(0xFE,w);
         u=Read_Eeprom(0xFE);
         break; //salir de funcion nueva_clave 
      } 
      lcd_putc("*" ); 

      w=w+1; //longitud de la clave 
      clave[i]=q; //almacena clave(maximo 16 caracteres) 
      write_eeprom(b,q);
      b=b+1;
   } 
} 
////////////FUNCION COMPROBAR CLAVE ///////////////////////////////
void comprueba_clave(void){ 
   lcd_putc("\fIntroduce clave:\n" ); 
   l=0;
   for(i=0; ;i++){ //bucle no sale...               
      do{ //espera hasta...                             
         q=kbd_getc();                              
      }while(q==0); //...pulsar una tecla   
      
      lcd_putc("*");  
      if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
         if(i==0){ //no se sale... 
            lcd_putc("\nEscribe una!!!" ); 
            delay_ms(2000);
            lcd_putc("\fIntroduce clave:\n" );
            lcd_gotoxy(1,2); 
            i=-1; 
            continue; 
         } //...poner una clave valida 
         
         break; //salimos si se pulsa tecla * o # 
      } 
      l=l+1;
      write_eeprom(0xFD,l);
      if(q!=clave[i]){
         var=1;
      }
      for(k=0;k<0xFB;k++){                                   
         if((Read_Eeprom(i)==q)){     
            var=0;
         }
         else{
            var=1; 
         }
      }
   } //...hasta pulsar * o # 
   l=Read_Eeprom(0xFD);
   f=Read_Eeprom(0xFB);
   if((var>0)||(f!=l)){ //Clave incorrecta 
      lcd_putc("\fClave\nIncorrecta" ); 
      output_high(PIN_A3); 
      delay_ms(2000); 
      output_low(PIN_A3);
   } 
   if((var==0)&&(f==l)){ //Clave correcta 
      lcd_putc("\fClave\nCorrecta" ); 
      output_high(PIN_A5); 
      output_high(PIN_A1);
      delay_ms(2000); 
      output_low(PIN_A5);
      output_low(PIN_A1);
      bar=1;
   } 
   var=0; //reset var 
} 
/////////////COMPROVACION DE FABRICA//////////////
void fabrica_clave(void){
   lcd_putc("\fSu clave:\n" ); //presentacion 
   a=0;
   for(i=0; ;i++){ //bucle no sale... 
      do{ //espera hasta... 
         q=kbd_getc(); 
      }while(q==0); //...pulsar una tecla 
      lcd_putc("*"); 
      write_eeprom(0xFE,a);
      if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion 
         if(i==0){ //no se sale... 
            lcd_putc("\nEscribe una!!!" ); 
            delay_ms(2000); 
            lcd_putc("\fSu clave:\n" );
            lcd_gotoxy(1,2); 
            i=-1; 
            continue; 
         } //...poner una clave valida 
 
         break; //salimos si se pulsa tecla * o # 
      } 
      a=a+1;
      for(k=0;k<0xFB;k++){                                    
         if((Read_Eeprom(i)==q)){    
            var=0;
         }
         else{
            var=1; 
         }
      }
   } //...hasta pulsar * o # 
   a=Read_Eeprom(0xFE);
   f=Read_Eeprom(0xFB);
   if((var>0)||(f!=a)){ //Clave incorrecta 
      lcd_putc("\fClave\nIncorrecta" ); 
      output_high(PIN_A3); 
      delay_ms(2000); 
      output_low(PIN_A3); 
      
   } 
   if((var==0)&&(f==a)){
      lcd_putc("\fClave\nCorrecta" ); 
      output_high(PIN_A5); 
      delay_ms(2000); 
      output_low(PIN_A5);
      h=1;
   } 
   var=0; //reset var 
} 

////////////CLAVE INICIAL////////////////

void clave_inicial(void){
   lcd_putc("\fIntroduce clave:\n" ); 
   
   for(i=0; ;i++){ //bucle no sale...
      do{ //espera hasta... 
         y=kbd_getc();
      }while(y==0); //...pulsar una tecla    
      lcd_putc("*"); 
      if(y!='D'){
         s=y;
      }
      write_eeprom(0xFE,u);
      if(y=='D' || y=='L'){ //si se pulsa * o # se sale de la funcion 
         if(i==0){ //no se sale... 
            lcd_putc("\nEscribe una!!!" ); 
            delay_ms(2000); 
            lcd_putc("\fIntroduce clave:\n" );
            lcd_gotoxy(1,2); 
            i=-1; 
            continue; 
         }
         break; //salimos si se pulsa tecla * o #      
      }
      u=u+1;
      clave[i]=s;
      limit=i+1; //longitud de la clave
      write_eeprom(i,y);       
       
   }    
}
///////////////////////////////Password////////////////////////////////
void Password(void){
   lcd_putc("\fPassword:\n" );
   f=0;
   for(i=0; ;i++){ //bucle no sale...
      do{ //espera hasta... 
         q=kbd_getc(); 
      }while(q==0); //...pulsar una tecla   
      lcd_putc("*");
      if(q=='D' || q=='L'){ //si se pulsa * o # se sale de la funcion
         if(i==0){ //no se sale...
            lcd_putc("\nEscribe una!!!" ); 
            delay_ms(2000);  
            lcd_putc("\fPassword:\n" );
            lcd_gotoxy(1,2); 
            i=-1; 
            continue; 
         } //...poner una clave valida ; 
         break; //salimos si se pulsa tecla * o # 
      }
      f=f+1;
      for(k=0;k<0xFB;k++){                                
         if((Read_Eeprom(i)==q)){    
            var=0;
         }
         else{
            var=1; 
         }
      }

   } //...hasta pulsar * o# 
   u=Read_Eeprom(0xFE);
   if((var>0)||(u!=f)){ //Clave incorrecta 
      lcd_putc("\fClave\nIncorrecta" ); 
      output_high(PIN_A3); 
      delay_ms(2000); 
      output_low(PIN_A3);
      if(g==0){
         m=1;
      }
      g=1;
   }

   if((var==0)&&(u==f)){ //Clave correcta 
      lcd_putc("\fClave\nCorrecta" ); 
      output_high(PIN_A5); 
      delay_ms(2000); 
      output_low(PIN_A5);
      bar=1;
      m=0;
   } 
   var=0; //reset var 
   write_eeprom(0xFB,f);

}
```


----------

