Autor Tema: Teclado Matricial 18f4550  (Leído 2437 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bryant_elec

  • PIC10
  • *
  • Mensajes: 5
Teclado Matricial 18f4550
« 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");
}
}
}
}
« Última modificación: 11 de Mayo de 2020, 18:58:24 por bryant_elec »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Teclado Matricial 18f4550
« Respuesta #1 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

Desconectado bryant_elec

  • PIC10
  • *
  • Mensajes: 5
Re:Teclado Matricial 18f4550
« Respuesta #2 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

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Teclado Matricial 18f4550
« Respuesta #3 en: 11 de Mayo de 2020, 19:57:33 »
Entonces la llave que te faltaba no iba ahí.

Desconectado bryant_elec

  • PIC10
  • *
  • Mensajes: 5
Re:Teclado Matricial 18f4550
« Respuesta #4 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

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Teclado Matricial 18f4550
« Respuesta #5 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.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado bryant_elec

  • PIC10
  • *
  • Mensajes: 5
Re:Teclado Matricial 18f4550
« Respuesta #6 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?

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Teclado Matricial 18f4550
« Respuesta #7 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.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado bryant_elec

  • PIC10
  • *
  • Mensajes: 5
Re:Teclado Matricial 18f4550
« Respuesta #8 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.


 

anything