desktop

Problemas manejando teclado matricial 5x6 con PIC 18F4550

Buenas compañeros del foro de electronica, vengo con una duda.

En estos momentos me encuentro trabajando con el pic 18f4550 para manejar un teclado 5x6, estoy haciendo una calculadora cientifica con las funciones basicas, suma, resta y deseo añadir funciones trigonometricas, exponencial, hiperbolicas, entre otros, dependiendo del boton que se presione en el teclado se hace la operacion. Pero bueno el problema no es eso, mas que nada diseñe el siguiente codigo solamente para ver en un lcd la tecla que presiono, para despues si enfocarme en la calculadora.

Coloque las columnas en el puerto D, y las filas en el C, el codigo proviene de la modificacion del archivo kdb.c, El problema es este, no se si la cuestion es que no se puede separa el teclado en dos puertos, si no defini bien cual son las entradas o salidas, o si hay una mala conexion en el diagrama de proteus, este es el programa :

Código:
////////////////// The following defines the keypad layout on port D
#include <18F4550.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <math.h>
#include <lcd.c>




#define use_portd_kbd TRUE

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


#if defined(__PCH__)
#if defined use_portd_kbd
   #byte kbd_rows = 0xF82    // Port C
   #byte kbd_cols = 0xF83    // Port D
#endif
#else
   #byte kbd_rows = 7        // Port C
   #byte kbd_cols = 8        // Port D
#endif


#define set_tris_kbd_rows(x) set_tris_c(x)
#define set_tris_kbd_cols(x) set_tris_d(x)

#define Bitmask(x) (1 << (x & 7))

// These statements define the connections between the keypad
// pins and the PIC pins. For example, the column 0 pin on the
// keypad connector goes to pin D0 on the PIC.   If you change
// the wiring on your board, then you must also change the
// definitions below to match your board.  I have used the
// Bitmask() macro in the following statements because I think
// it makes the connections easier to understand, compared to
// the way CCS does it in their driver.
#define COL0  Bitmask(PIN_D0)
#define COL1  Bitmask(PIN_D1)
#define COL2  Bitmask(PIN_D2)
#define COL3  Bitmask(PIN_D3)
#define COL4  Bitmask(PIN_D4)
#define COL5  Bitmask(PIN_D5)

#define ROW0  Bitmask(PIN_C0)
#define ROW1  Bitmask(PIN_C1)
#define ROW2  Bitmask(PIN_C2)
#define ROW3  Bitmask(PIN_C3)
#define ROW4  Bitmask(PIN_C4)


#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3|ROW4)
#define ALL_COLS (COL0|COL1|COL2|COL3|COL4|COL5)




// Keypad layout:
char const KEYS[5][6] = {{'1','2','3','A','F','J'},
                         {'4','5','6','B','G','K'},
                         {'7','8','9','D','H','L'},
                         {'C','0','=','E','I','M'}
                         {'N','O','P','Q','R','S'}};

#define KBD_DEBOUNCE_FACTOR 5    // 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_cols(ALL_COLS&~COL0);
                    kbd_cols=~COL0&ALL_COLS;
                    break;
         case 1   : set_tris_kbd_cols(ALL_COLS&~COL1);
                    kbd_cols=~COL1&ALL_COLS;
                    break;
         case 2   : set_tris_kbd_cols(ALL_COLS&~COL2);
                    kbd_cols=~COL2&ALL_COLS;
                    break;
         case 3   : set_tris_kbd_cols(ALL_COLS&~COL3);
                    kbd_cols=~COL3&ALL_COLS;
                    break;
         case 4   : set_tris_kbd_cols(ALL_COLS&~COL4);
                    kbd_cols=~COL4&ALL_COLS;
                    break;
         case 5   : set_tris_kbd_cols(ALL_COLS&~COL5);
                    kbd_cols=~COL5&ALL_COLS;
                    break;
       }

       if(kbd_down) {
         if((kbd_cols & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=false;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd_cols & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd_cols & ROW0)==0)
               row=0;
             else if((kbd_cols & ROW1)==0)
               row=1;
             else if((kbd_cols & ROW2)==0)
               row=2;
             else if((kbd_cols & ROW3)==0)
               row=3;
             else if((kbd_cols & ROW4)==0)
               row=4;
             last_key =KEYS[row][col];
             kbd_down = true;
          } else {
             ++col;
             if(col==6)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd_rows(ALL_ROWS);
  set_tris_kbd_cols(ALL_COLS);
  return(kchar);
}





void main()
{

char k;

    kbd_init();         // initialize keypad
    delay_ms(200);

while(1)
    {
        k = kbd_getc(); // scan for key press
         delay_ms(200);
        lcd_init();
       // Lcd_gotoxy (4,1);

        lcd_putc(k);
    }

Aca añado la imagen en proteus, coloque las resistencias de pull up, y probe cambiando entre vcc y tierra, por si era la forma de conectar, pero no funciono, me parece que el problema esta en el codigo, cualquier sugerencia es bien recibida, gracias de antemano.
 

Adjuntos

  • teclado.JPG
    teclado.JPG
    217.2 KB · Visitas: 28
te comparto esta libreria, espero te sea de ayuda, la hice hace algunos dias para un trabajo con un control de acceso a un apartamento y funciona bien, espero te sea de ayuda.(y)
 

Adjuntos

  • teclado.rar
    1.2 KB · Visitas: 28
Última edición:
Atrás
Arriba