Autor Tema: TECLADO MATRICIAL 4X4 CONECTADO POR EL PUERTO D CON PIC 18F4550  (Leído 5114 veces)

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

Desconectado wilmert

  • PIC10
  • *
  • Mensajes: 1
TECLADO MATRICIAL 4X4 CONECTADO POR EL PUERTO D CON PIC 18F4550
« en: 25 de Enero de 2014, 13:50:03 »
Muy buenos días,

Me gustaría que me colaboraran con este tema que he venido trabajando ya hace varias semanas y no he logrado aun. En los proyectos que he utilizado siempre he conectado el teclado por el puerto B a un pic 18F4550 y ha funcionado correctamente. Pero ahora necesito conectarlo por el puerto D del mismo pic, he utilizado varias librerias y hecho lo que dicen muchos tutoriales pero nada ha funcionado aun, si alguien ha realizado ya este ejercicio le agradecería inmensamente de su colaboración.

esta es la libreria que estoy utilizando:

////////////////////////////////////////////////////////////////////////////////////
//                                   KBD.C                                        //
//               FUNCIONES PARA ESCANEO DE UN TECLADO MATRICIAL                   //
//                         4X4 HEXADECIMAL, EN EL PORTB                           //
//       kbd_init()       Debe ser invocada antes que las otras funciones.         //
//       c=lcd_getc(c)    Si há sido presionada una tecla devuelve el caracter c    //
//                  y lo salva en el char c, sino se presiona una tecla       //
//                  retorna el valor /0, esta función puede invocarse         //
//                  frecuentemente para no perder teclas pulsadas.            //
//        NOTA: REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS     //
//               PINES DE COLUMNAS DE RB0(COL0) A RB3(COL3))                   //
//               PINES DE FILAS DE RB4(ROW0)) A RB7(ROW3))                    //
//                  MODIF.: ING. FRANK GIRALDO - UD                       //
////////////////////////////////////////////////////////////////////////////////////
/*//////////////////////////////////////////////////////////////////////////////////
*    RB0 RB1 RB2 RB3   
*     |   |   |   |
*     c0  c1  c2  c3 
*   | 1 | 2 | 3 | F | r0 - RB4
*   | 4 | 5 | 6 | E | r1 - RB5
*   | 7 | 8 | 9 | D | r2 - RB6
*   | A | 0 | B | C | r3 - RB7
*
*   COLUMNS=OUTs
*   ROWS=INs
*   SE HABILITAN PULL-UP INTERNAS
*   SE REQUIERE COLOCAR RESISTENCIAS (2.2K) EN LOS PINES DE COLUMNAS
*
*///////////////////////////////////////////////////////////////////////////////////
//
#byte portkbd = 0XF83                  //portkbd = portD
//Keypad connection:   (Column 0 es B0)
//                Bx:
#define COL0 (0 << 0)
#define COL1 (0 << 1)
#define COL2 (0 << 2)
#define COL3 (0 << 3)
#define ROW0 (1 << 4)
#define ROW1 (1 << 5)
#define ROW2 (1 << 6)
#define ROW3 (1 << 7)
#define ALL_ROWS (ROW3|ROW2|ROW1|ROW0)
#define ALL_PINS (ALL_ROWS|COL3|COL2|COL1|COL0)

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

#define KBD_DEBOUNCE_FACTOR 1.2
// Modifique el valor de temporización antirrebote con (KBD_DEBOUNCE_FACTOR = n/333),
// en donde n es el número de veces por segundo en los que ud. invoca
//la función kbd_getc().
//

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;
   //port_d_pullups(TRUE);
   kchar='\0';

   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR)
   {
       switch (col)
       {
         case 0   : set_tris_d(ALL_PINS&~COL0);
                    portkbd=(0b1110);
                    break;

         case 1   : set_tris_d(ALL_PINS&~COL1);
                    portkbd=(0b1101);
                    break;

         case 2   : set_tris_d(ALL_PINS&~COL2);
                    portkbd=(0b1011);
                    break;

         case 3   : set_tris_d(ALL_PINS&~COL3);
                    portkbd=(0b0111);
                    break;
       }

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

/*char dato;
char tecla()
{
   dato='\0';
   while(dato=='\0')
   {
      dato=kbd_getc();
      delay_ms(100);
   }
return dato;
} */

Y utilizando picc compiler este es el codigo que manejo en este momento:

#include <18F4550.h>
#include <KBD18FD.c>
#use delay(clock=20000000)
#fuses  NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,HS,CPD,NODEBUG
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=n)//n bit  seg //debe hacerse en ambos micros 877A

#define prender output_high   
#define apagar output_low
#define luz1 PIN_C1
#define luz2 PIN_C2
#define pulsador1 PIN_B0

#define LCD_DAT PIN_E0
#define LCD_E PIN_E2
#define LCD_CK PIN_E1
#include <LCD4x20_3PIN.c>

char daton;
long auxsegundos;
long segundos;


void un_digito()
{
   lcd_putc("\f");
   segundos=0;
   auxsegundos=0;
   do{
      daton=kbd_getc();
      lcd_putc(daton);
      delay_ms(60);
      if( daton !='\0')
      {
         lcd_gotoxy(8,1);
         lcd_putc(daton);
         delay_ms(1000);
         // daton=daton-0X30;
         auxsegundos=0;
         segundos=12;
      }
      auxsegundos ++;
      if(auxsegundos > 20)
      {
         auxsegundos = 0;
         segundos ++;
      }
   }while(segundos<12);
}
void main()
{
#zero_ram
set_tris_A(0x00);
set_tris_B(0x00);
set_tris_C(0x80);
set_tris_D(0xff);
set_tris_E(0x00);


lcd_init();
kbd_init();

setup_comparator(No_analogs);
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

EXT_INT_edge(H_to_L);

output_A(0x00);
output_B(0x00);
output_C(0x00);
output_D(0x00);
output_E(0x00);

lcd_gotoxy(1,1);
lcd_putc("\fBIENVENIDO");
delay_ms(500);
lcd_putc('\f');
lcd_gotoxy(1,1);
lcd_putc("\fPRUEBA1");
delay_ms(500);
lcd_putc('\f');
lcd_gotoxy(1,1);
lcd_putc("\fPROTEUS");
delay_ms(500);
un_digito();
     
}
   
« Última modificación: 25 de Enero de 2014, 14:49:50 por wilmert »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: TECLADO MATRICIAL 4X4 CONECTADO POR EL PUERTO D CON PIC 18F4550
« Respuesta #1 en: 25 de Enero de 2014, 14:12:45 »
  Deberías dar mas datos, por ejemplo el lenguaje que estás utilizando, si es C, que compilador utilizas.... mostrar que es lo que tienes hecho hasta ahora.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Vayadespiste

  • PIC12
  • **
  • Mensajes: 53
Re: TECLADO MATRICIAL 4X4 CONECTADO POR EL PUERTO D CON PIC 18F4550
« Respuesta #2 en: 30 de Enero de 2014, 21:35:02 »
Sin repasar tu código solo quería comentarte un pequeño detalle y es que es normal usar las pull-up del puerto B, en el puerto D creo que no hay pull-up.


 

anything