Autor Tema: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c  (Leído 15210 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #30 en: 18 de Marzo de 2011, 08:12:45 »
Hola Amigos

Sigo con la batalla del expansor...


Analizando el codigo del  amigo porcher...

en la funcion

dato=PCF8574_Lee();

int8 PCF8574_Lee(void)
{
      int8 dato;
      i2c_start();                   // Start condition
      i2c_write(PCF8574A_Lectura);   // Device address   (Aqui INT pasa otra vez a 1)
      //dato = i2c_read();            //original
      dato = i2c_read(0);
      i2c_stop();                    // Stop condition
      return dato;
}


esta linea

 dato = i2c_read(0);

nos lee el dato ,pero la pregunta es
¿por donde empieza leyendo?


Algun amigo sabe que le esta ocurriendo...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #31 en: 18 de Marzo de 2011, 09:03:12 »

.............

esta linea

 dato = i2c_read(0);

nos lee el dato ,pero la pregunta es
¿por donde empieza leyendo?


Algun amigo sabe que le esta ocurriendo...


  ¿Como por donde empieza leyendo?

  Para mi, lo que hace esa función es leer el dato que tiene el puerto del expansor, No es que lee bit a bit sino que lee los 8 bits juntos.

  Por ejemplo si el integrada está configurado con el nibble alto como entrada y el nible bajo como salida, y suponiendo que las salidas están todas en 0 y que el bit 7 (que es entrada) está en 0 porque hay una tecla presionada, la lectura será

0111 para el nible alto. Para el nibble bajo hay que ver como trabaja el expansor. Si fuera como el puerto de los PIC se lee el mismo dato que tiene a la salida, por lo tanto el nibble bajo sería 0000. Quedando, de esta manera, el dato leido como

01110000
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #32 en: 19 de Marzo de 2011, 16:49:48 »
hola AngelGris

columnas entradas
filas salidas;

fila:0xfe -> 1111 1110

ponemos el puerto

columnas   filas

1111       1110

si pulso tecla del 1
es fila 1 columna 1
por lo tanto quedara asi

1110 1110
y es asi porque dato nos dice que es "ee"

si pulso la tecla del 2
es fila 1 columna 2
por lo tanto seria
1101 1110 esto seira "de"

por el contrario fisicamente
al pulsar la tecla del 2

me la reconocecomo si hubiera pulsado
la tecla del 4.

la tecla del cuantro es
fila 2 columna 1

1110 1101

de esto deduzco que estan cambiadas filas por columnas
si pulso las tecla de la primera fila me las reconoce como si fueran las teclas
de la primera columna.

esto es :
si pulso estas teclas

1 - ee   1110 1110  
2 - ed   1110 1101
3 - eb   1110 1011
F - e7   1110 0111

me las reconoce asi

1 - ee   1110 1110
4 - de   1101 1110
7 - be   1011 1110
A - 7e   0111 1110

en el codigo, en la linea de

 if (!bit_test(dato,4)) c=1;

si dato es 4 c=1...

aqui hay algo que NO me cuadra

si tiene que mirar si el bit 4 del bit es distinto

como va esto ...




este es el codigo:


//------------------------
   int8 f,c,datos;
   signed int8 dato=-1;
   int8 fila=0b11111110;     //Primera fila (P0=1)

   for (f=0; f<4; f++)     //Recorre las 4 filas (lineas)
   {
      PCF8574_Escribe(fila);
      delay_ms(20);                //Para que le de tiempo a escribir
      dato=PCF8574_Lee();      
      c=0;
      if (!bit_test(dato,4)) c=1;             //Col 1 4
      else if (!bit_test(dato,5)) c=2;        //Col 2 5
      else if (!bit_test(dato,6)) c=3;        //Col 3 6
      else if (!bit_test(dato,7)) c=4;        //Col 4 7
      if(c) break;                             //Si c es distinto de 0 sale del for
      rotate_left(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la izquierda  
   }  
datos=dato;
   if(c)
      dato=(f*4)+c;
   else
      dato=-1;                      //Ninguna tecla pulsada

   PCF8574_Escribe(0b11110000);     //Vuelve a poner como salida (0) las Lineas
 
//------------------------


Un Saludo

« Última modificación: 19 de Marzo de 2011, 20:00:34 por pajaro »

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #33 en: 20 de Marzo de 2011, 19:26:26 »
hola amigos

Resolvi parte del enigma del cambio de filas y columnas.
Al parecer al hacer la conexion, invertia el conector, por eso hacia esas cosas raras.

Pero aun asi no termina de sacar la tecla correspondiente.

Al parecer el diseño se corresponde con una posición del bus en los pines del conector y
una posicion de la serigeria o numeros de las teclas del teclado.

En mi caso mi teclado tiene los pines debajo de las letras en vez de encima,
de esta forma debo de rotar 180 grados las teclas

una vez colocado el puerto del expansor y puertos del teclado asi:

                  columnas      filas
io expansor  1  1  1  1      0  0  0  0

expansor     7  6  5  4      3  2  1  0
teclado        1  2  3  4      5  6  7  8


si pulso la letra de la tecla 1 me imprime la C
si pulso la letra de la tecla 2 me imprime la B
si pulso la letra de la tecla 3 me imprime la 0
si pulso la letra de la tecla F me imprime la A

es decir:

1 2 3 F
4 5 6 E
7 8 9 D
A 0 B C

lo reconoce como

C B 0 A
D 9 8 7
E 6 5 4
F 3 2 1

si solo cambio el valor de la variable C
de forma de

c=1 por c=4
c=2 por c=3
c=3 por c=2
c=4 por c=1

esto me pruduce que gire el teclado 90 grados

me los reconoce asi

A 0 B C
7 8 9 D
4 5 6 E
1 2 3 F

como hago para cambiar el orden de las fila..?


« Última modificación: 20 de Marzo de 2011, 20:28:02 por pajaro »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #34 en: 21 de Marzo de 2011, 10:17:54 »
  Algo sencillo de hacer es medir la continuidad entre los distintos pines del conector mientras presionas las distintas teclas de esa manera vas a saber con certeza que pin corresponde a cada fila y que pin corresponde a cada columna.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: 00 Rastrear Tecla de Teclado 4x4 con PCF8574 i2c
« Respuesta #35 en: 21 de Marzo de 2011, 15:29:31 »
Hola Amigos

Al final ayer noche consegui lo que perseguia,
que me detectara las teclas que le pulsaba,
si AngelGris,  asi fue mas o menos como
como llegue a la sintesis del problema,
tuve que modificar un poco el codigo, al final el codigo quedo asi:

int8 escanea_tecla(void){
   int8 f,c,datos;
   signed int8 dato=-1;
   //int8 fila=0b11111110;     //Primera fila (P0=1) //pines arriba
   //invierto orden de columnas y rotacion parapines abajo
   int8 fila=0b11110111;     //Primera fila (P3)
   f=0;
   for (f=0; f<4; f++)     //Recorre las 4 filas (lineas)
   {
      PCF8574_Escribe(fila);
      delay_ms(20);                //Para que le de tiempo a escribir
      dato=PCF8574_Lee();
      c=0;
      if (!bit_test(dato,4)) c=4;             //Col 1 dato 4
      else if (!bit_test(dato,5)) c=3;        //Col 2 dato 5
      else if (!bit_test(dato,6)) c=2;        //Col 3 dato 6
      else if (!bit_test(dato,7)) c=1;        //Col 4  dato7
      if(c!=0) break;                         //Si c es distinto de 0 sale del for
      //rotate_left(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la izquierda
      rotate_right(&fila, 1);     //Siguientes filas, va desplazando el 0 hacia la derecha
   }  
datos=dato;
   if(c)
      dato=(f*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
    lcd_gotoxy(3,1);                                
    printf(lcd_putc,"dato:%2x f:%2d, c:%2d",datos,f,c);                                
   return dato;
}



Lo más seguro que en un futuro próximo ingenie algo
para que sea el software el que detecte el hardware de la conexion del teclado matricial
al puerto del expasor y se auto reconfigure sin tener que cambiar el hardware.

No seria dificil a primera vista,
preguntar donde se encuentra 4 tecla y dependiendo de la posición
sería un tipo de teclado u otro.

Bueno esto para otro hilo.

----------------------------------------------------------------------------------------------------------
 :: Reconocimiento del hardware de un teclado y Reconfiguración automatica del mismo. ::
----------------------------------------------------------------------------------------------------------


***  " Quisiera mostrar agradecimientos, a los compañeros del foro,
          que me brindaron su tiempo y su atención asi como
          ejemplos de codigo, para todos aquellos,
          mis más cordiales agredeciemientos. "


Un saludo

« Última modificación: 21 de Marzo de 2011, 15:37:28 por pajaro »

Desconectado mastercel

  • PIC10
  • *
  • Mensajes: 8
Re: Teclado 4x4 con PCF8574 i2c
« Respuesta #36 en: 03 de Enero de 2018, 01:35:04 »
Hola suky

El esquemita que tengo lo tengo como el archivo que adjunto

el programa principal tengo

Código: C#
  1. #include "main.h"
  2.  
  3. #int_EXT
  4. void  EXT_isr(void)
  5. {
  6.  printf("\r %c",text_t());
  7. printf("\r pines %d%d%d%d ",EXPAN_P7,EXPAN_P6,EXPAN_P5,EXPAN_P4);
  8. printf("%d%d%d%d ",EXPAN_P3,EXPAN_P2,EXPAN_P1,EXPAN_P0);
  9. }
  10.  
  11.  
  12.  
  13. void main()
  14. {
  15.    enable_interrupts(INT_EXT);
  16.    ext_int_edge( H_TO_L );
  17.    enable_interrupts(GLOBAL);
  18.    
  19.    port_b_pullups (0b00000001);
  20.    expan_bus_rw(0b00001111);
  21.     while(true){
  22.    
  23.    }
  24.  
  25. }


en el la funcion de escane a tengo

Código: C
  1. char text_t(){
  2.   char tecla[17]={'1','2','3','F',
  3.                   '4','5','6','E',
  4.                   '7','8','9','D',
  5.                   'A','0','B','C',' '};
  6.  int t,f,filas,ini_p;
  7.  filas=0x0E;                     //xxxx1110
  8.  ini_p=0xF0;                    //inicializo varible para los puertos
  9.  expan_bus_rw(ini_p);     //configuro puerto del expansor 0b11110000
  10.  t=0;                              //inicio contador de tecla
  11.  for( f=0;  f<4; f++){
  12.    if(EXPAN_P0==0){break;}t++; //verifico pulsacion de tecla; incremento contador
  13.    if(EXPAN_P1==0){break;}t++;
  14.    if(EXPAN_P2==0){break;}t++;
  15.    if(EXPAN_P3==0){break;}t++;
  16.    rotate_left(&filas,1);                 //rota la fila
  17.    expan_bus_rw(filas);                // escribo fila rotada
  18.  }
  19. return tecla[t];
  20. }




en tu diagrama no pones ninguna resistencia en el pin de interrupción, cabe mencionar que lleva 1, y que tambien las resistencias de teclado son de 330ohms , asi mismo la rutina si sirve como indicas pero creo seria mejor tratar de hacer un gif para entender mejor el sistema , ya que cuesta trabajo entender asi como explicas.


 

anything