Autor Tema: TECLADO 4X4 Y INTERRUPCION RB4-RB7  (Leído 4478 veces)

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

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 207
TECLADO 4X4 Y INTERRUPCION RB4-RB7
« en: 14 de Abril de 2006, 23:53:30 »
HOLA A TODOS:

¿ALGUIEN TIENE UN CODIGO DE EJEMPLO,EN CCS  DONDE SE MANEJE UN TECLADO MATRICIAL 4X4, CON INTERRUPCION POR CAMBIO EN LOS CUATRO ULTIMOS PINES DE PORTB?...
HE INTENTADO HACERLO CON LA LIBRERIA MODIFICADA PARA 4X4 Y NO ME FUNCIONA :( :( :( :( :( :( :(.....

MUCHISIMAS GRACIAS...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #1 en: 15 de Abril de 2006, 03:41:07 »

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #2 en: 15 de Abril de 2006, 07:07:15 »
Quizá esto te sirva
http://www.todopic.com.ar/foros/index.php?topic=4807.0

Ocurre lo de siempre, la libreria de CCS no esta preparada para hacerlo mediante la interrupción. Aunque tmpc creo que sea dificil adaptarla, yo esto lo hice en ASM cuando empezaba, pero como no lo he vuelto a necesitar pues no la rehice en C :S
Si juegas contra el mejor, pierdes como los demás.

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #3 en: 15 de Abril de 2006, 08:37:48 »
Hola a tod@s

No merece la pena emplear 8 entradas del micro, es mucho mas practico y sencillo utilizar un expansor de bus PCF8574, y leer el teclado utilizando la linea I2C y la int RB0. Es mi consejo.

Saludos  :mrgreen:

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 207
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #4 en: 15 de Abril de 2006, 18:56:08 »
HOLA: GRACIAS POR LA AYUDA, MUY INTERESANTES LOS EJEMPLOS.....

juanelete ¿COMO SERIA EL CONTROL DEL TECLADO CON EL PCF8574?

¿TIENES EL EJEMPLO EN PROTEUS?

SALUDOS

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #5 en: 16 de Abril de 2006, 02:23:21 »
Aquí tienes un ejemplo de manejo de teclado que te podría servir.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #6 en: 16 de Abril de 2006, 02:30:38 »
Podeis ver también el ejemplo de teclado 4x4 por interrupción en C que he dejado en el Ejemplito de Teclado de RedPic. El enlace es el puesto arriba por Modulay

Un saludo

Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 207
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #7 en: 16 de Abril de 2006, 21:24:20 »
HOLA A TODOS:

HE ESTUDIADO LOS CODIGOS DE LOS EJEMPLOS.... POCHER  EN EL PROGRAMA DEL TECLADO POR INTERRUPCION EN CCS ¿PODRIA DETECTARSE ESTA , EN VEZ DE USAR LA VARIABLE  "aux", USAR EL FLAG "RBIF" (INDICA SI HUBO CAMBIO EN RB4-RB7) ?

¿DONDE SE HARIA EL CAMBIO EN EL CODIGO?

SALUDOS

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #8 en: 19 de Abril de 2006, 11:14:59 »
La variable AUX no sirve para nada, como pone en el código la utilicé solo en la depuración para hacer pruebas y ver si entraba en la interrupción. La puedes quitar tranquilamente, en la interrupción solo se entra para coger el código de la tecla pulsada y levantar la bandera a 1, para que así se active al if del while(1).

Un saludo

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #9 en: 21 de Abril de 2006, 16:33:23 »
Hola a tod@s

Perdon por la tardanza pero es que he estado algo liado...
 

El funcionamiento es muy similar a si lo conectaras directamente el teclado al PIC


//////////////////////////////////////////////////////////////
//   Libreria Teclado I2C    Libreria_tecladoI2C.C     //
//                                                                        //
//   Adaptacion: D. Sanchez           03/06          //
/////////////////////////////////////////////////////////////

/*
PCF8574     Resistencias   TECLADO    PIC
----------       ------------     ----------    -----
    P0 ---------- R 330 -------- Fila 1
    P1 ---------- R 330 -------- Fila 2
    P2 ---------- R 330 -------- Fila 3
    P3 ---------- R 330 -------- Fila 4
    P4 -------------------------- Col 1
    P5 -------------------------- Col 2
    P6 -------------------------- Col 3
    P7 -------------------------- Col 4

   INT------------------------------------  RB0/INT

  A0,A1,A2 conectar a masa.
*/


void PCF8574_Escribe(int8 dato);
int8 PCF8574_Lee(void);


void Teclado_ini(void)
{
   port_b_pullups (0b00000001);  // Activa la resitencia pull-up interna del pin RB0/INT
   
   ext_int_edge( H_TO_L );       // La int. se activara por flanco de bajada
   PCF8574_Escribe(0b11110000);  // Pone como salida (0) las Lineas  y como entrada (1) las Columnas
   delay_ms(50);
}


void PCF8574_Escribe(int8 dato)
{
      i2c_start();    // Start condition

      i2c_write(PCF8574_Escritura);// Device address

      i2c_write(dato);// dato

      i2c_stop();     // Stop condition
}



int8 escanea_tecla(void)
{
   int8 l,c;
   signed int8 dato=-1;
   int8 fila=0b11111110;  // primera fila


   for (l=0; l<=3; l++)  // Recorre las 4 filas
   {
      PCF8574_Escribe(fila);

      rotate_left(&fila, 1);  // siguientes filas, va desplazando el 0 hacia la izquierda

      delay_ms(20); // necesario antes de leer 20

      dato=PCF8574_Lee();

      c=0;

      if (!bit_test(dato,4)) c=1;          //Col 1
      else if (!bit_test(dato,5)) c=2;     //Col 2
      else if (!bit_test(dato,6)) c=3;     //Col 3
      else if (!bit_test(dato,7)) c=4;     //Col 4

      if(c) break;     // Si c es distinto de 0 sale del for
   }


   if(c)
      dato=(l*4)+c;
   else
      dato=-1;       //Ninguna tecla pulsada

   PCF8574_Escribe(0b11110000);  // Vuelve a poner como salida (0) las Lineas  y como entrada (1) las Columnas

   return dato;

}


char tecla_c(int8 codigo)
{
   char tabla_tecla[17]={'1','2','3','F','4','5','6','E','7','8','9','D','A','0','B','C','Z'};

   return tabla_tecla[codigo-1];
}



int8 lee_teclado(void)
{
   int8 tecla_hex;

   tecla_hex=escanea_tecla();
}




int8 PCF8574_Lee(void)
{
      int8 dato;

      i2c_start();    // Start condition

      i2c_write(PCF8574_Lectura);// Device address

      dato = i2c_read();

      i2c_stop();     // Stop condition

      return dato;
}
//////////////////////////////////////////////////////////////////////////////


Y aqui tienes un pequeño ejemplo



////////////////////////////////////////////////////////////////////////
////      Prueba Teclado I2C     Pru_teclado_I2C.C              ////
////                                                                                ////
////////////////////////////////////////////////////////////////////////

#INCLUDE <16F876.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#ORG 0x1F00,0x1FFF {}   //Para 8k Pic 16F876/7 (necesario para bootloader)

#use delay(clock=20000000)

#include <LCD_CCS_4B16x2.c>  // Libreria LCD.C modificada
#use I2C(master,sda=PIN_C4,scl=PIN_C3,FORCE_HW)

#define PCF8574_Lectura   0b01000001   // Fija=0100  A0-A1=000   Modo lectura=1
#define PCF8574_Escritura 0b01000000   // Fija=0100  A0-A1=000   Modo escritura=0


int8 conta=0;
signed int8 cod_tecla;


#include <Libreria_tecladoI2c.c>




#INT_EXT
void int_rb0()
{
   cod_tecla=escanea_tecla();
}




void main()
{
 
   lcd_init();
   lcd_putc("\fTeclado I2C\n"); delay_ms(500);


   Teclado_Ini();


   enable_interrupts(int_ext);
   enable_interrupts(global);

   while(TRUE)
   {


      if(cod_tecla>=0)
      {
         output_high(PIN_A1);
    printf(lcd_putc,"%d  %c",cod_tecla,tecla_c(cod_tecla));
    delay_ms(100);   
         output_low(PIN_A1);
         cod_tecla=-1;              // Necesario para evitar repetirse
      }

      delay_ms(25);

   }
}


En proteus no tengo nada, sorry


Saludos  :mrgreen:


Desconectado pachopic

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 207
Re: TECLADO 4X4 Y INTERRUPCION RB4-RB7
« Respuesta #10 en: 23 de Abril de 2006, 22:53:22 »
HOLA A TODOS:

gracias pocher por la aclaracion :shock: :shock: :shock:, tu ejemplo funciona perfectamente en proteus,me he guiado bastante de el y he aprendido mucho :-/ :-/ :-/intente usar la libreria que trae el ccs y no funciona bien con la  interrupcion..¿?
 :( :( no devuelve ningun valor parece que el valor de la tecla se pierde al retornar de la interrupcion..
cuando tenga un poco de tiempo usare  codigo de juanelete para ver como funciona,  :-/ :-/ :-/

muchisimas gracias :-/ :-/ :-/ :-/ :-/