Autor Tema: Problema con lectura de teclado matricial  (Leído 8757 veces)

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

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Problema con lectura de teclado matricial
« en: 15 de Septiembre de 2012, 18:58:08 »
Buenas Tardes a todos, primero felicitar a todos porque esta es una excelente pagina me ha ayudado en muchos problemas como principiante en esto de los pic.
Bueno tengo un problema y no se que hacer he buscado y buscado y nada, tengo un proyecto para mi solo por "jugar" nada mas  :), tengo un teclado matricial 4x4, un lcd 16x2 y un pic 16f887 , ya se usar el lcd y todo ahora tengo un problema con el teclado, programo el pic y cuando quiero leer el teclado y que aparezca la tecla pulsada en la lcd me sale un solo desorden de números y se queda como loco eso es sin presionar ninguna tecla, ahora cuando pulso una tecla se queda quieto.
la verdad no se que tengo mal o no se... les agradecería si me ayudan un poco adjunto el código y la simulación en proteus, de antemano muchas gracias.
Código: [Seleccionar]
#include <16F887.h>
#Fuses HS,NOWDT,NOPROTECT,PUT
#Use delay(clock=10000000)
#include <lcd.c>
#define use_portb_kbd
#include <kbd.c>


void main()
 {
   char k;
   int  x;
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   lcd_putc("\fListo...\n");
                                   
   while (TRUE)
    {
      k=kbd_getc();
      x=k-48;                             //Conversión numérica
      if(k!=0)
       {
        if(k=='*')
          lcd_putc('\f');
        else
         { lcd_putc(k);             //Imprime carácter
           delay_ms(50);
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(50);
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(50);
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(50);
           lcd_putc("\fListo...\n");
         }
      }
    }
   }

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con lectura de teclado matricial
« Respuesta #1 en: 15 de Septiembre de 2012, 19:13:47 »
Asumo que has conectado el teclado en el portb, tal como muestra al libreria kbd.c

Si eso es asi, lo unico que veo respecto a los ejemplos que vienen es que tenes activado los pullups en portb, prueba comentar esa linea y despues comenta el resultado.
Por otro lado, en los muestreos que haces por display, hay una sumatoria de 200 milisegundos !!
Te conviene mas usar un lcd de 4 lineas que escribir y borrar, temporizando en el medio...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #2 en: 15 de Septiembre de 2012, 20:07:09 »
entonces que desconecto de la lcd?? ahorita voy hacer la prueba y comentare como me va muchas gracias

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con lectura de teclado matricial
« Respuesta #3 en: 15 de Septiembre de 2012, 20:33:02 »
Los 200 milisegundos solo ralentizan el escaneo del teclado, asi que salvo ese detalle, no te molestara mucho.
Lo de los pullups puede que te maquen como si fueran pulsaciones, por eso cuando apretas una tecla deja de enloquecerte.
Si comentas la linea que habilita los PullUps, deberia funcionar OK. :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #4 en: 15 de Septiembre de 2012, 21:04:05 »
gracias por responder :) y es que no me funciona :( ya dejo de ser loco pero ahora no me sale la tecla presionada...no se que tengo mal...

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #5 en: 17 de Septiembre de 2012, 16:39:36 »
bueno he hecho varias pruebas y todavía me queda loco los números...use una librería modificada para usar un teclado matricial 4x4 y no se que mas hacer...aqui les pongo el codigo mio y el de la libreria...la verdad ya no se que mas hacer...uds si me podrian ayudar.
mi codigo
Código: [Seleccionar]
#include <16F887.h>
#Fuses HS,NOWDT,NOPROTECT,PUT
#Use delay(clock=10000000)
#include <lcd.c>
#include <kbd_lib.c>


void main()
 {
   char k;
   int  x;
   lcd_init();
   kbd_init();
   //port_b_pullups(TRUE);
   lcd_putc("\fListo...\n");
                                   
   while (TRUE)
    {
      k=kbd_getc();
      x=k-48;                             //Conversión numérica
      if(k!=0)
       {
        if(k=='*')
          lcd_putc('\f');
        else
         { lcd_putc(k);             //Imprime carácter
           delay_ms(50);
           printf(lcd_putc,"\f Car=%c",k); //Imprime carácter
           delay_ms(50);
           printf(lcd_putc,"\f Car=%u",k); //Imprime valor ASCII
           delay_ms(50);
           printf(lcd_putc,"\f Num=%u",x); //Imprime valor numérico
           delay_ms(50);
           lcd_putc("\fListo...\n");
         }
      }
    }
   }

Libreria teclado4x4
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
////                     KBD_LIB.C by Redraven                         ////
////                                                                   ////
////                     Derived from KBDD.C                           ////
////                  Generic keypad scan driver                       ////
////                                                                   ////
////  kbd_init()   Must be called before any other function.           ////
////                                                                   ////
////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////
////                   This function should be called frequently so as ////
////                   not to miss a key press.                        ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,1997 Custom Computer Services            ////
//// This source code may only be used by licensed users of the CCS C   ////
//// compiler.  This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler.  No other use, reproduction  ////
//// or distribution is permitted without written permission.           ////
//// Derivative programs created using this software in object code     ////
//// form are not restricted in any way.                                ////
////////////////////////////////////////////////////////////////////////////

////////////////// The following defines the keypad layout on port D

// Un-comment the following define to use port B
#define use_portb_kbd TRUE

// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins


#if defined(__PCH__)
#if defined use_portb_kbd
   #byte kbd = 0xF81              // This puts the entire structure
#else
   #byte kbd = 0xF83              // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
   #byte kbd = 6                  // on to port B (at address 6)
#else
   #byte kbd = 8                  // on to port D (at address 8)
#endif
#endif

#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif

//Keypad connection:   (for example column 0 is B0)

#define COL0 (1 << 0) // PIN_B0
#define COL1 (1 << 1) // PIN_B1
#define COL2 (1 << 2) // PIN_B2
#define COL3 (1 << 3) // PIN_B3

#define ROW0 (1 << 4) // PIN_B4
#define ROW1 (1 << 5) // PIN_B5
#define ROW2 (1 << 6) // PIN_B6
#define ROW3 (1 << 7) // PIN_B7

#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)

// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'*','0','#','D'}};

#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second

void kbd_init() {
}

char kbd_getc( ) {
   static byte kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static byte col;

   byte kchar;
   byte row;

   kchar='\0';
   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
         case 3   : set_tris_kbd(ALL_PINS&~COL3);
                    kbd=~COL3&ALL_PINS;
                    break;
       }

       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=false;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = true;
          } else {
             ++col;
             if(col==4)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con lectura de teclado matricial
« Respuesta #6 en: 17 de Septiembre de 2012, 17:33:05 »
Estaba por marcarte que deberias cambiar tu libreria, pero la que estas utilizando esta bien, al menos es parecida a tu teclado y conexion, pero sigue igual.

Porque no usas directamente todo el ejemplo de RedPic ??
Es quien hizo esa libreria... ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con lectura de teclado matricial
« Respuesta #7 en: 17 de Septiembre de 2012, 17:38:29 »
Ya se que te pasa!!
esa libreria esta hecha para un PIC18F, porque tiene en otro lado los puertos.
0xF81 es el portB en un PIC 18F.... :D :D :D

Deberas reformarla a como es la original, que mira que pic usas y los pone como corresponde, aqui el pedazo de codigo...

Código: C
  1. // Make sure the port used has pull-up resistors (or the LCD) on
  2. // the column pins
  3.  
  4. #if defined use_portb_kbd
  5.    #byte kbd = getenv("SFR:PORTB")
  6. #else
  7.    #byte kbd = getenv("SFR:PORTD")
  8. #endif
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #8 en: 17 de Septiembre de 2012, 19:57:32 »
 :shock: no sabia eso  :D :D :D pero si cambio esa parte que me pusiste debería de funcionar bien?? por que la verdad ya no se que mas hacer... :(
muchas gracias por tu ayuda ahorita vere y enseguida comento

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #9 en: 17 de Septiembre de 2012, 20:08:07 »
 :8} me sale lo mismo...me podrías brindar el código del teclado si lo tienes... por favor...o no se que hay que cambiar en el codigo o circuito...porfa..

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con lectura de teclado matricial
« Respuesta #10 en: 17 de Septiembre de 2012, 23:56:03 »
Me equivoque, la libreria esa tiene lo necesario para PIC16 tambien, asi que no se bien donde esta tu problema...
Lo has armado en la practica o solo simulado??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #11 en: 18 de Septiembre de 2012, 22:17:22 »
sii lo arme tal como dice la libreria pero a la hora de ver la tecla queda loco y cambiando de numero como que estuvieran todas las teclas presionadas...y solo presiono una y deja de tar loco y me sale el mensaje listo...y si la suelto vuelve a estar loco...la vdd no se que tengo malo...mi teclado es de membrana y no tiene ni dos semanas de haberlo comprado...

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #12 en: 19 de Septiembre de 2012, 16:23:09 »
creo que encontré el problema...porque probé el teclado con un arduino y cuando presiono una tecla varias se presionan a la vez...creo que el teclado esta pegado o algo asi, el que yo tengo es de membrana como te dije antes y es delgado el teclado aquí te muestro una imagen.

este es el que tengo y tengo miedo de desarmarlo y arreglarlo... haré mas pruebas a ver si de verdad es eso...

Desconectado jumu

  • PIC12
  • **
  • Mensajes: 83
Re: Problema con lectura de teclado matricial
« Respuesta #13 en: 19 de Septiembre de 2012, 17:37:10 »
bueno MGLSOFT gracias por todo...encontre el problema y si el teclado estaba medio pegado osea las teclas estaban cerradas como presionadas hay le hice un masaje a toco el teclado y funciono y tambien le puse resistencias a las columnas que no las tenia y funciono muchas gracias por todo


 

anything