Autor Tema: Teclado Matricial 3x4 4x4  (Leído 10799 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Teclado Matricial 3x4 4x4
« en: 27 de Agosto de 2006, 00:38:16 »
Hola saludos, estaba practicando y viendo un poco, y logre hacer nose si una nueva forma de ver el teclado matricial, talvez algo basica, lo adapte de un tutorial que venia en assember, espero les guste, y si pueden corregirme talvez algo pues bienvenido, aca les dejo el código:

/*------------------------------------------------------------------------------------*/
/* Teclado matricial 4x3 4 filas x 3 columas, puede adaptarse fácilmente a uno 4x4    */
/* Diseñado por Rodrigo A. Flores C. Cryn ---- Cbba,26 de agosto de 2006              */
/*                                                                                    */
/*     C1 C2 C3---C4                                                                  */
/*  F1  1  2  3    C    *=A                                                           */
/*  F2  4  5  6    D    #=B                                                           */
/*  F3  7  8  9    E                                                                  */
/*  F4  *  0  #    F                                                                  */
/* La exploración del teclado lo que hace es verificar secuencialmente y en orden     */
/* la situación de las columnas 1,2,3 y 4 enviando '0' por la columna que queremos    */
/* analizar y '1' al resto, si se encontrara algún pulsador activado, el código       */
/* recibido por las filas sería diferente a 1111 que es el valor de reposo            */
/*                                                                                    */
/* 4 resistencias pull-up en las entradas RB4 a RB7                                   */
/*------------------------------------------------------------------------------------*/

#include<16F648A.h>

#FUSES NOWDT      //      Watch Dog Timer
#FUSES PUT        //      Power Up Timer
#FUSES NOPROTECT  //      Code not protected from reading
#FUSES BROWNOUT   //    Reset when brownout detected
#FUSES NOMCLR     //      Master Clear pin enabled
#FUSES NOLVP      //      No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES INTRC_IO   //      Internal RC Osc, no CLKOUT
#FUSES NOCPD      //      No EE protection

#use delay(clock=4000000,RESTART_WDT)
#byte port_a=0x05
#byte port_b=0x06

// variables
char codigo;

char explorar_teclado()                  // función que explora todo el teclado
{
   port_b=0xfe;                  // verifica columna 1
   codigo=port_b;                // guarda valor de puerto b en variable
   if(bit_test(port_b,4)==0)
   return 1;                     // si se presiono el uno devuelve 1
   if(bit_test(port_b,5)==0)
   return 4;                     // si se presiono el cuatro devuelve 4
   if(bit_test(port_b,6)==0)
   return 7;                     // si se presiono el siete devuelve 7
   if(bit_test(port_b,7)==0)
   return 10;                    // si se presiono el * devuelve 10 = A
   
   port_b=0xfc;                  // verifica columna 2
   codigo=port_b;                // guarda valor de puerto b en variable
   if(bit_test(port_b,4)==0)
   return 2;                     // si se presiono el dos devuelve 2
   if(bit_test(port_b,5)==0)
   return 5;                     // si se presiono el cinco devuelve 5
   if(bit_test(port_b,6)==0)
   return 8;                     // si se presiono el ocho devuelve 8
   if(bit_test(port_b,7)==0)
   return 0;                     // si se presiono el cero devuelve 0

   port_b=0xfb;                  // verifica columna 3
   codigo=port_b;
   if(bit_test(port_b,4)==0)
   return 3;                     // si se presiono el tres devuelve 3
   if(bit_test(port_b,5)==0)
   return 6;                     // si se presiono el seis devuelve 6
   if(bit_test(port_b,6)==0)
   return 9;                     // si se presiono el nueve devuelve 9
   if(bit_test(port_b,7)==0)
   return 11;                    // si se presiono el # devuelve 11 = B

/* si se tiene una matriz 4x4 se aumentará este código
   port_b=0xf7;                  // verifica columna 4
   codigo=port_b;
   if(bit_test(port_b,4)==0)
   return 12;                    // si se presiono la C devuelve 12 = C
   if(bit_test(port_b,5)==0)
   return 13;                    // si se presiono la D devuelve 13 = D
   if(bit_test(port_b,6)==0)
   return 14;                    // si se presiono la E devuelve 14 = E
   if(bit_test(port_b,7)==0)
   return 15;                    // si se presiono el F devuelve 15 = F
   if(port_b==0xf7)             
   return 15;                    // podria colocarse una alternativa en caso de qeu no se presione nada
*/ // no hará falta las siguientes dos líneas de código 
   if(port_b==0xfb)
   return 15;                    // si no se presiono ninguna tecla devuelve 15 = F
}


void main()
{
   set_tris_b(0xf0);             // define RB0 a RB3 como salidas y RB4 a RB7 como entradas
   port_b=0;                     // inicializa puerto B
   set_tris_a(0x00);             // define puerto A como todas salidas
   port_a=0;                     // inicializa puerto A
   while(true)                   // bucle de trabajo
   {
      port_a=explorar_teclado(); // explora si se presiona pulsador en teclado y lo muestra en el puerto A
   }
}

tb les dejo la simulacion con proteus 6.9 sp4  :-/
.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Teclado Matricial 3x4 4x4
« Respuesta #1 en: 27 de Agosto de 2006, 02:27:59 »
Interesante descubrimiento Cryn, aunque tengo que decirte que no es nuevo, es la forma habitual de explorar un teclado de matriz.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado Matricial 3x4 4x4
« Respuesta #2 en: 27 de Agosto de 2006, 12:51:09 »
Hola saludos,  :D no intentaba decir que fue un descubrimiento, solo pensaba que era algo distinto a lo que siempre veia por el foro, ciclos for y de todo, que no los entendia y bueno busque mucho para entenderlo y vi que no era tan complicado y lo hice como explicaba un tutorial que encontre en asm, como ya mencione, hay alguna forma de hacerlo mas eficaz?? gracias
.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Teclado Matricial 3x4 4x4
« Respuesta #3 en: 08 de Septiembre de 2006, 21:03:23 »
Te felicito por haber montado esa información en el foro, siempre hay alguna persona que buscara lo que uno antes busco y si uno puede colocar un granito de arena para ayudar a esa persona, es de admirar, por lo que NOCTURNO no estoy de acuerdo que trates de menospreciar lo que trata de hacer Cryn. Crees que por llevar tanto tiempo en el foro tienes derecho de hacerlo, pues NO, alguna vez tu estuviste buscando esa información también, o es que nació aprendido?. :x

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Teclado Matricial 3x4 4x4
« Respuesta #4 en: 09 de Septiembre de 2006, 07:31:07 »
No creo que el amigo nocturno haya querido menospreciar el trabajo de nadie, simplemente ha recalcado que es la forma habitual de explorar un teclado...Aunque también se suele hacer con las interrupciones externas del puerto B

PD: Y a ser posible, no creemos polémicas :?


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Teclado Matricial 3x4 4x4
« Respuesta #5 en: 09 de Septiembre de 2006, 10:37:15 »
Mi intención no es crear polémica, solo cuando vi el mensaje no me pareció la forma, solo pienso que todos tenemos derecho a publicar lo que nos parezca que puede ayudar a alguien, de todas maneras se que nocturno es una de las personas que hace grande a este foro y hay que darle espacio a que otras personas también algún día lo sean.

Gracias y este tema de mi parte queda cerrado.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Teclado Matricial 3x4 4x4
« Respuesta #6 en: 12 de Septiembre de 2006, 03:31:38 »
Pues a pesar de que leo y releo mi mensaje anterior una y otra vez, no sé cuál de las palabras o combinación de ellas ha podido sugerirte un menosprecio hacia Cryn.
En fin, queda claro que dos no discuten si uno no quiere, y hoy no tengo ganas.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Teclado Matricial 3x4 4x4
« Respuesta #7 en: 12 de Septiembre de 2006, 23:35:00 »
saludos, no creo que la intencion de nocturno haya sido mala, talvez la frase "Interesante descubrimiento Cryn," haya sido la mal interpretada, hasta yo la primera vez al leerlo me sorprendi un poco, pero viendolo del lado bueno no veo mala intencion.
ahora creo que nadie me ha colaborado con ayudarme a hacer el programa mas efectivo, jeje, es decir menos lineas de codigo, gracias, chao.
.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Teclado Matricial 3x4 4x4
« Respuesta #8 en: 13 de Septiembre de 2006, 00:05:57 »
saludos, no creo que la intencion de nocturno haya sido mala, talvez la frase "Interesante descubrimiento Cryn," haya sido la mal interpretada, hasta yo la primera vez al leerlo me sorprendi un poco, pero viendolo del lado bueno no veo mala intencion.
ahora creo que nadie me ha colaborado con ayudarme a hacer el programa mas efectivo, jeje, es decir menos lineas de codigo, gracias, chao.

Cryn, un muestreo de teclado matricial es lo que has hecho y consta precisamente de escribir el puerto y ponerse a leer bit por bit hasta encontrar uno que esté activado (activo por 0 en tu caso)

Se me ocurren un par de sugerencias pero que no hacen a la cosa, es decir creo que tu solución es muy buena. 

1) Si guardas el contenido de portb en dato luego usa dato para tus cálculos.  De esa manera has 'congelado' el estado del puerto al momento de leerlo.  Esto lo digo porque cada btfss provoca que el PIC lea nuevamente el puerto! lo cual es innecesario y además podría llegar producir algún problema o error si justo cambió algún valor en el puerto.

2) Se me ocurren algunas cosas que se podria hacer para que el código sea mas "corto" en cuanto a lo visual , como por ejemplo el uso de algún bucle, rotando bits, pero no veo que se gane luego en código generado, de seguro la opción que has usado es la más económica en código generado finalmente.  La versión con bucles se vería mas "bonita" o "elegante" pero el código generado no.  Y el pic , al final, solo necesita el menor código posible  :)

3) Algo que no se como funcionará en ccs, que podrías hacer para que tu código no sea tan 'largo' de ver es lo siguiente

Código: C
  1. if(bit_test(port_b,7)==0)
  2.    return 15;                    // si se presiono el F devuelve 15 = F

cambiarlo por

Código: C
  1. if(!bit_test(port_b,7))  return 15;     // si se presiono el F devuelve 15 = F

4) Si el usuario no pulso nada... pues nada, devuelves 0 y listo.  Para que complicarse la vida.
Si pasó por todas las instancias y no leyó nada , no hace falta que compares con el número que pusiste en el puerto.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)