Autor Tema: Problema lectura teclado matricial  (Leído 1831 veces)

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

Desconectado jeison

  • PIC10
  • *
  • Mensajes: 19
Problema lectura teclado matricial
« en: 13 de Agosto de 2015, 10:53:45 »
Hola, quien puede ayudarme con un problema? resulta que tengo un código y pretendo leer un teclado matricial, pero este si bien me funciona en proteus, no corre en físico, estoy usando CCS en lenguaje C.
añadiré el código con la librería que uso para que me entiendan, muchas gracias, no saben cuanto me urge.  :?


#INCLUDE <16F887.H>
#FUSES INTRC_IO,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#USE DELAY(CLOCK=4000000)
#use RS232 (baud = 9600,  xmit = pin_c6, rcv = pin_c7)
#DEFINE USE_PORTB_KBD
#INCLUDE <kbd1.C>
#include <stdlib.h>
#include <stdio.h>
//#BYTE PORTC= 7
#BYTE PORTB= 6
#BYTE WPUB= 0X95 // declarar registro option
#BYTE OPTION_REG = 0X81


void SERIAL (void);

     #define LCD_ENABLE_PIN  PIN_d2                                    
     #define LCD_RS_PIN      PIN_d0                                    
     #define LCD_RW_PIN      PIN_d1                        
     #define LCD_DATA4       PIN_d3
     #define LCD_DATA5       PIN_d4                                    
     #define LCD_DATA6       PIN_d5                                    
     #define LCD_DATA7       PIN_d6

#include <lcd.c>





CHAR K='0';
INT R=0;  // conversión echar en entero
int n=0;  // contador limite de c}valores a ingresar
int M=0;  // minutos
int D=0;  //decenas de segundos
int U=0;  //unidades de segundos
int j=0;  //tiempo total
int Ms=0;  // minutos
int Ds=0;  //decenas de segundos
int Us=0;  //unidades de segundos




VOID MAIN()
{
  R=0;
  PORT_B_PULLUPS(TRUE);
   OPTION_REG = 0; //en el MAIN desactivas el registro OPTION
   WPUB= 0B11111111;// y seleccionas los pullups q vas a utilizar
   lcd_init();
   KBD_INIT(); //Inicializar la rutina del teclado
   printf(lcd_putc,"\fINGRESE TIEMPO:\n %d:%d%d", M,D,U);
  
  
   WHILE (n<3)
   {
   n++;
    
LECT:   do{  
                            //espera hasta que se pulse una tecla
         K=kbd_getc();  
         R=K-48;
        
         }while(K==0);
          
         if(n==1)
            {
             M=R*60;
             Ms=R;
             j=R;
             SERIAL();
            }
          if(n==2)
            {
            
            if(R>5)
            {
              printf(lcd_putc,"\fINGRESE TIEMPO:\n %d:%d%d ERROR", Ms,Ds,Us);
              //delay_ms(100);
              GOTO LECT;
              }
              D=R*10;
             Ds=R;
             j=R;
             SERIAL();
            }
            
          if(n==3)
            {
             U=R;
             Us=R;
             j=R;
             SERIAL();
             //j=M+D+U;            
            }
        
     printf(lcd_putc,"\fINGRESE TIEMPO:\n %d:%d%d", Ms,Ds,Us);
      
    
   }
}

void SERIAL (void)
   {  
   PUTC(j);  
   }






y la librería es la del teclado 4x4.





///////////////////////////////////////////////////////////////////////////
////                     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 carlospetry77

  • PIC10
  • *
  • Mensajes: 5
Re:Problema lectura teclado matricial
« Respuesta #1 en: 03 de Diciembre de 2015, 00:17:37 »
Hola jeison! podrías poner un esquema del conexionado que estás utilizando? Recuerda siempre configurar los pines que no uses como salida, y a los de entrada cuidado de no dejarlos flotantes. Saludos! :-/
Si la soga viene con mierda, agarrala con los dientes...


 

anything