TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: bryant_elec en 11 de Mayo de 2020, 17:49:04

Título: Teclado Matricial 18f4550
Publicado por: bryant_elec en 11 de Mayo de 2020, 17:49:04
Me gustaría ver si me podrían ayudar a encontrar el error de mi código, sigue sin mostrarme en la lcd las teclas que pulso en mi teclado matricial de membrana. Se los agradecería mucho
////////////////////////////////////////////////////////////////////////////////
//                         Práctica: Teclado Matricial                        //
//                         Bryant Hernández Guerrero                          //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

#include <18F4550.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay(clock=20000000)
#include <PICStudio_lcd_2x16BK.c>

#bit RELAY_TECLADO=0xf80.5
#bit BEEP_TECLADO=0xf80.4

char const KEYS[4][4]= {{'1','2','3','A'},
                       {'4','5','6','B'},
                       {'7','8','9','C'},
                       {'E','0','F','D'}};

char clave[]={'1','2','3'};

char clave_Aux[]={'0','0','0'};
int i;
char tecla;

void inicializar(){
set_tris_b(0b00001111);
set_tris_a(0x00);
lcd_init();
delay_ms(10);
lcd_check();
delay_ms(300);
i=0;
}

char kbd_getc(){
char tecla=' ';
int f,c,t,i,j;
port_b_pullups(true);
   for(f=0x10, i=0; i<4; f<<=1, i++){
      for(c=0x01, j=0; j<4; c<<=1, j++){
         output_b(~f),
         delay_cycles(1);
         t= input_b() & 0x0f;
         t= ~(t | 0xf0);
         if(t == c){
            delay_ms(200);
            tecla=KEYS[j];
            while(t==c){
               t=input_b() && 0xf0;
               t= ~(t || 0xf0);
            }
   break;
      }
     }
   }
    port_b_pullups(false);
   return tecla;
}



void main(){
inicializar();
printf(lcd_putc,"\fPrac. Teclado\n Electronica");
delay_ms(3000);
printf(lcd_putc,"\fEdificios\n Inteligentes");
delay_ms(3000);
printf(lcd_putc,"\fIntroducir Clave:\n");
while(true){
tecla=kbd_getc();
if((tecla !=' ')&&(i<3)){
lcd_gotoxy(i+1,2);
delay_ms(200);
printf(lcd_putc,"%c",tecla);
delay_ms(500);
clave_Aux=tecla;
i++;
}
if(i==3){
i=0;
if((clave_Aux[0]==clave[0])&&(clave_Aux[1]==clave[1])&&(clave_Aux[2]==clave[2])){
printf(lcd_putc,"\f Clave Correcta \n Abriendo...");
RELAY_TECLADO=1;
for(i=0; i<10; i++){
BEEP_TECLADO=1;
delay_ms(10);
BEEP_TECLADO=0;
delay_ms(1000);
}
i=0;
RELAY_TECLADO=0;
printf(lcd_putc,"\fIntroducir Clave:\n");
}

else{
printf(lcd_putc,"\fClave Incorrecta:\nReintentelo...");
RELAY_TECLADO=0;
   for(i=0; i<3; i++){
      BEEP_TECLADO=1;
   delay_ms(10);
   BEEP_TECLADO=0;
   delay_ms(500);
   }
   
   i=0;
   BEEP_TECLADO=0;
   printf(lcd_putc,"\fIntroducir Clave:\n");
}
}
}
}
Título: Re:Teclado Matricial 18f4550
Publicado por: Eduardo2 en 11 de Mayo de 2020, 18:48:50

Código: C
  1. if((tecla !=' ')&&(i<3)){
  2.         lcd_gotoxy(i+1,2);
  3.         delay_ms(200);
  4.         printf(lcd_putc,"%c",tecla);
  5.         delay_ms(500);
  6.         clave_Aux[i]=tecla;   //  <<<<<<<  en lugar de clave_Aux=tecla;
  7.         i++;
  8.     }
  9.     if(i==3){
  10.         i=0;
  11.         if((clave_Aux[0]==clave[0])&&(clave_Aux[1]==clave[1])&&(clave_Aux[2]==clave[2])){
  12.             printf(lcd_putc,"\f Clave Correcta \n Abriendo...");
  13.             RELAY_TECLADO=1;
  14.             for(i=0; i<10; i++){
  15.                 BEEP_TECLADO=1;
  16.                 delay_ms(10);
  17.                 BEEP_TECLADO=0;
  18.                 delay_ms(1000);
  19.             }
  20.             i=0;
  21.             RELAY_TECLADO=0;
  22.             printf(lcd_putc,"\fIntroducir Clave:\n");
  23.         }
  24.     }                         //  <<<<<<<  Falta esta llave
  25.     else{

De momento corregí  en las líneas 6 y 24
Título: Re:Teclado Matricial 18f4550
Publicado por: bryant_elec en 11 de Mayo de 2020, 18:57:28
Eduardo2 Ya hice la corrección pero ahora el problema es que me salta de pedirme la clave a decir que es incorrecta sin poder introducir nada
Título: Re:Teclado Matricial 18f4550
Publicado por: Eduardo2 en 11 de Mayo de 2020, 19:57:33
Entonces la llave que te faltaba no iba ahí.
Título: Re:Teclado Matricial 18f4550
Publicado por: bryant_elec en 11 de Mayo de 2020, 20:13:06
Así es, ya intenté jugar cambiando las llaves pero nada funciona, y no consigo que me escanee las teclas presionadas en la lcd
Título: Re:Teclado Matricial 18f4550
Publicado por: Leon Pic en 11 de Mayo de 2020, 22:57:29
¿Estás seguro de que la función kbd_getc funciona bien?

Luego encontré un par de errores. Si dicha función funciona bien, la modificación que le hice debería corregir el error:

Código: C
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //                         Práctica: Teclado Matricial                        //
  3. //                         Bryant Hernández Guerrero                          //
  4. //                                                                            //
  5. ////////////////////////////////////////////////////////////////////////////////
  6.  
  7. #include <18F4550.h>
  8. #fuses HS,NOLVP,NOWDT,NOPROTECT
  9. #use delay(clock=20000000)
  10. #include <PICStudio_lcd_2x16BK.c>
  11.  
  12. #bit RELAY_TECLADO=0xf80.5
  13. #bit BEEP_TECLADO=0xf80.4
  14.  
  15. char const KEYS[4][4]= {{'1','2','3','A'},
  16.                        {'4','5','6','B'},
  17.                        {'7','8','9','C'},
  18.                        {'E','0','F','D'}};
  19.  
  20. char clave[]={'1','2','3'};
  21.  
  22. char clave_Aux[]={'0','0','0'};
  23. int i;
  24. char tecla;
  25.  
  26. void inicializar(){
  27.         set_tris_b(0b00001111);
  28.         set_tris_a(0x00);
  29.         lcd_init();
  30.         delay_ms(10);
  31.         lcd_check();
  32.         delay_ms(300);
  33.         i=0;
  34. }
  35.  
  36. char kbd_getc(){
  37.         char tecla=' ';
  38.         int f,c,t,i,j;
  39.         port_b_pullups(true);
  40.         for(f=0x10, i=0; i<4; f<<=1, i++){
  41.                 for(c=0x01, j=0; j<4; c<<=1, j++){
  42.                         output_b(~f),
  43.                         delay_cycles(1);
  44.                         t= input_b() & 0x0f;
  45.                         t= ~(t | 0xf0);
  46.                         if(t == c){
  47.                                 delay_ms(200);
  48.                                 tecla=KEYS[j];
  49.                                 while(t==c){
  50.                                         t=input_b() && 0xf0;
  51.                                         t= ~(t || 0xf0);
  52.                                 }
  53.                                 break;
  54.                         }
  55.                 }
  56.         }
  57.         port_b_pullups(false);
  58.         return tecla;
  59. }
  60.  
  61.  
  62.  
  63. void main(){
  64.         inicializar();
  65.         printf(lcd_putc,"\fPrac. Teclado\n Electronica");
  66.         delay_ms(3000);
  67.         printf(lcd_putc,"\fEdificios\n Inteligentes");
  68.         delay_ms(3000);
  69.         printf(lcd_putc,"\fIntroducir Clave:\n");
  70.         while(true){
  71.                 tecla=kbd_getc();
  72.                 i = 0;
  73.                 if((tecla !=' ')&&(i<3)){
  74.                         lcd_gotoxy(i+1,2);
  75.                         i=i-1;
  76.                         delay_ms(200);
  77.                         printf(lcd_putc,"%c",tecla);
  78.                         delay_ms(500);
  79.                         clave_Aux[i]=tecla;
  80.                         i++;
  81.                 }
  82.                 i=0;
  83.                 if((clave_Aux[0]==clave[0])&&(clave_Aux[1]==clave[1])&&(clave_Aux[2]==clave[2])){
  84.                         printf(lcd_putc,"\f Clave Correcta \n Abriendo...");
  85.                         RELAY_TECLADO=1;
  86.                         for(i=0; i<10; i++){
  87.                                 BEEP_TECLADO=1;
  88.                                 delay_ms(10);
  89.                                 BEEP_TECLADO=0;
  90.                                 delay_ms(1000);
  91.                         }
  92.                         i=0;
  93.                         RELAY_TECLADO=0;
  94.                         printf(lcd_putc,"\fIntroducir Clave:\n");
  95.                 }
  96.                 else{
  97.                         printf(lcd_putc,"\fClave Incorrecta:\nReintentelo...");
  98.                         RELAY_TECLADO=0;
  99.                         for(i=0; i<3; i++){
  100.                                 BEEP_TECLADO=1;
  101.                                 delay_ms(10);
  102.                                 BEEP_TECLADO=0;
  103.                                 delay_ms(500);
  104.                         }
  105.    
  106.                         i=0;
  107.                         BEEP_TECLADO=0;
  108.                         printf(lcd_putc,"\fIntroducir Clave:\n");
  109.                 }
  110.         }
  111. }

Por favor, respeta las sangrías; así es más fácil seguir el código y saber si faltan o no llaves; o en donde se debe interrumpir una función, ect.
Título: Re:Teclado Matricial 18f4550
Publicado por: bryant_elec en 11 de Mayo de 2020, 23:17:01
Creo que la función kbd_getc si es el problema, porque de hecho, moviendo por debajo de la tarjeta cuidadosamente con mis dedos y presionando una tecla si me la marca, pero si dejo la tarjeta por si sola, no me marca nada en la lcd. Ya probé con el código que me mandaste ya corregido y nada.. De hecho directamente después de los mensajes que se presentan como saludo directamente se lanza a Clave incorrecta, introducir clave. Si el problema es la función kbd_getc ¿qué podría hacer con ella?
Título: Re:Teclado Matricial 18f4550
Publicado por: Leon Pic en 13 de Mayo de 2020, 14:17:49
A ver si entiendo.
¿Tocas con tus manos al teclado y funciona?

Si es así, significa que el error está en el hardware. Posibles causas, cables internos rotos, o pistas rotas; mala conexión del teclado con el pic.
Título: Re:Teclado Matricial 18f4550
Publicado por: bryant_elec en 15 de Mayo de 2020, 17:11:43
No, tengo que mover por debajo de la tarjeta para que me pueda marcar ciertas letras, pero con otro programa más simple logré hacer que el teclado sirva sin moverle nada a la tarjeta.