Control teclado 4X4 con el codificador MM74C922

Cualquier cosa relacionado con la programación de Microcontroladores PIC en C utilizando el compilador CCS.

Control teclado 4X4 con el codificador MM74C922

Notapor biblioman » Mié Nov 25, 2009 3:46 pm

Hola a todos, aunque con un poco de retraso aquí tenéis el DNS del circuito para controlar un teclado 4X4 con el codificador MM74C922. Una pregunta que puede que se haga más de uno, es porque no he utilizado la interrupción por cambio de estado en los pines RB4-RB7 con el consiguiente ahorro de la línea que va conectada a RB0, la causa es la siguiente: cuando se alimenta este componente, pone a cero las salidas (A, B, C y D), al tratarse de un teclado de 16 teclas, el valor cero corresponde en este ejemplo a la tecla “c”, por lo que si pulsamos esa tecla la primera, lógicamente no se producirá la interrupción por cambio de estado en RB4-RB7. Para hacer que esto funcione por hardware habría que colocar una bascula D con una señal de reloj (en el datasheet viene el esquema), cosa que no he probado, por que considero que ya sería complicar demasiado el circuito para lo que hay que hacer. Por lo que la única manera que he visto de utilizar solo cuatro líneas, es no utilizar interrupciones y chequear el teclado por medio de un bucle infinito.

Espero vuestras sugerencias y aportaciones sobre esta manera de controlar el teclado.

Un saludo
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor QuijotescoXp » Mié Nov 25, 2009 5:51 pm

Como siempre hasta el fin de semana no lo podré mirar en profundidad, pero a bote pronto entiendo que es la manera más eficiente de controlar este tipo de teclados. Se nota que te lo has trabajado y eso se agradece.

Yo también he estado mirando maneras de controlar teclados matriciales y hay una forma estupenda de controlarlo con una sola patilla de nuestro PIC, adivina cual.

Gracias y hasta pronto.
Existen 10 tipos de personas. Los que saben binario y los que no.
Avatar de Usuario
QuijotescoXp
 
Mensajes: 33
Registrado: Sab Sep 19, 2009 10:46 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor biblioman » Mié Nov 25, 2009 9:06 pm

Hola QuijotescoXp. De nuevo me sorprendes con la rapidez de tus respuestas. En cuanto a controlar un teclado con un solo pin. Hay una manera muy ingeniosa que utiliza el convertidor Analógico/Digital del Pic. Aquí está el enlace a la fuente:

http://www.micropic.es/index.php?option=com_content&task=view&id=56&Itemid=1

En este sitio se encuentran ejemplos interesantes sobre aplicaciones de los PIC, por lo que te recomiendo su visita, si es que no la conoces ya.

Si tú has encontrado otra forma diferente a esta, será interesantes que lo expongas para poder comentarlo.

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor QuijotescoXp » Jue Nov 26, 2009 10:19 am

Pues no conocía la página así que la voy a mirar más despacio, gracias por el enlace.

Ahora te propongo yo otro de alguien que pilota mucho de estos temas y aunque creo que ya no mantiene la página es siempre un buen punto de comienzo:

http://picmania.garcia-cuervo.net/proye ... yboard.php

Saludos y hasta pronto.
Existen 10 tipos de personas. Los que saben binario y los que no.
Avatar de Usuario
QuijotescoXp
 
Mensajes: 33
Registrado: Sab Sep 19, 2009 10:46 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor biblioman » Jue Nov 26, 2009 12:04 pm

Ya conocía la página de RedPic, aunque no este ejemplo en concreto. Por lo que he visto ambos ejemplos utilizan el mismo principio (utilizar diferentes divisores de tensión para identificar la tecla pulsada). La última actualización del sitio que he visto es de este verano pasado, esperemos que sea un paréntesis transitorio y el sitio no desaparezca, por que como tú dices es un punto de referencia para todos los que nos gusta la programación de Microcontroladores.

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor myesid » Mar Feb 23, 2010 4:14 pm

hola a todos lo que yo quiero preguntar sin crear un nuevo tema es ¿Se puede controlar por medio del pic un teclado 4x4 sin usar otro integrado?, si la respuesta es positiva ¿Existe alguna libreria en ccs para manejar este tipo de teclado ?.

Espero que me puedan colaborar ya que estoy aprendiendo y tengo muchas ganas de aprender y conocer mas del tema; de por mas no sobran los ejemplos que puedan enviarme .

Un saludo fraterno desde Bogotà
myesid
 
Mensajes: 26
Registrado: Vie Feb 12, 2010 3:21 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor biblioman » Mar Feb 23, 2010 6:15 pm

Hola myesid. Te contesto rápidamente a tus preguntas:
myesid escribió:¿Se puede controlar por medio del pic un teclado 4x4 sin usar otro integrado?

Si.
myesid escribió:si la respuesta es positiva ¿Existe alguna libreria en ccs para manejar este tipo de teclado ?.


La librería que trae CCS es de 3X4, se puede modificar fácilmente a uno de 4X4. Pero si te has fijado, las librerías que trae CCS tienen copyrigt, por lo que no se pueden publicar en internet sin autorización. Hay muchas librerías ya hechas en Internet para controlar un teclado 4X4, en este foro concretamente hay una que funciona perfectamente. Echale un vistazo a este ejemplo:

http://www.aquihayapuntes.com/indice-practicas-pic-en-c/comuicacion-serie-asincrona-entre-dos-pics-con-la-usart.html.

Y también mira los comentarios a ese artículo en el foro, donde hay desarrollado un driver para el teclado 4X4:

http://www.aquihayapuntes.com/foro/viewtopic.php?f=11&t=31#p84

Espero haberte aclarado tus dudas.

Un saludo y hasta pronto
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Control teclado 4X4 con el codificador MM74C922

Notapor myesid » Vie Mar 05, 2010 5:06 pm

Biblioman

he estado probando la libreria que modificaste, pero no logro detectar una tecla en el la transmision serial; serias tan amable de descubrir en que fallo porque no lo puedo ver.

Código: Seleccionar todo
#include <16F877A.h>
#use delay (clock=4000000) // la configuracion del reloj siempre va primero sin importar si va un include despues
#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,bits=8)
#include <kbdd.c>
//!//#include <lcd.c>


void main()
{
   char s;
   kbdd_init();
    port_b_pullups(true);
   
   while (true)
   {
      s= kbdd_getc();
      if(s!=0)
      printf("la tecla es%s\r",s);
   }
   
}


te agradeceria enormemente me colaboraras porque me estoy estancando en mi aprender

Un saludo desde Bogota
myesid
 
Mensajes: 26
Registrado: Vie Feb 12, 2010 3:21 pm

Re: Control teclado 4X4 con el codificador MM74C922

Notapor biblioman » Vie Mar 05, 2010 8:14 pm

Hola myesid. Con respecto a tú pregunta, necesito que me especifiques un poco más algunas cosas para que pueda ayudarte.

La primera es que me confirmes la librería que estás utilizando. ¿es la que trae en sus librerías CCS?. ¿O es esta otra?.

Código: Seleccionar todo
    /******************************************************************************       
    *                                                                             *
    *  AUTOR      : QuijotescoXp                                                  *
    *                                                                             *
    *  EMAIL      : lrecueo1@alumno.uned.es                                       *
    *                                                                             *
    *  WEB        : www.aquihayapuntes.com                                        *
    *                                                                             *
    *  FECHA      : 08/11/09                                                      *
    *                                                                             *
    *  VERSIÓN    : 1.2                                                           *
    *                                                                             *
    *  LICENCIA   : GPL                                                           *
    *                                                                             *
    *  DESCRIPCIÓN: Librería para el manejo de un teclado matricial 4x4.          *
    *                                                                             *
    *  REVISIONES : ( 08/11/09 por Biblioman ) Se añade la posibilidad utilizar   *
    *                                                                             *
    *               indistintamente el Puerto B o D.                              *
    *                                                                             *
    ******************************************************************************/
    // Para el uso del puerto B se descomenta la siguiente línea
    //#define use_port_B TRUE

    #if defined use_port_B
        #byte port   = 6
        #bit  ROW_3  = 0x06.7  // Identificadores de bits puerto B
        #bit  ROW_2  = 0x06.6
        #bit  ROW_1  = 0x06.5
        #bit  ROW_0  = 0x06.4   
    #else
        #byte port   = 8
        #bit  ROW_3  = 0x08.7  // Identificadores de bits puerto D
        #bit  ROW_2  = 0x08.6
        #bit  ROW_1  = 0x08.5
        #bit  ROW_0  = 0x08.4
    #endif

    #if defined use_port_B
        #define set_tris_port( x ) ( set_tris_b( x ) )
    #else
        #define set_tris_port( x ) ( set_tris_d( x ) )
    #endif

    /* DEFINICIÓN DE CONSTANTES SIMBÓLICAS ****************************************/
    #define COLUMN_0         1
    #define COLUMN_1         2
    #define COLUMN_2         4
    #define COLUMN_3         8
    #define NUMBER_COLUMNS   4
    #define NUMBER_ROWS      4
    #define DEBOUNCER_DELAY 30         

    /* DEFINICIÓN DE CONSTANTES ************************************/
    char const matrixKeyBoard[ NUMBER_ROWS ][ NUMBER_COLUMNS ] =
    {
        /* Disposición del teclado */
        '1', '2', '3', 'F',
        '4', '5', '6', 'E',
        '7', '8', '9', 'D',
        'A', '0', 'B', 'C',
    };

    /* DEFINICIÓN DE VARIABLES LOCALES *******************************/
    static unsigned column;

    /* FUNCIONES PÚBLICAS *******************************************/
    void mkd_int( void )
    {
       set_tris_port( 0xF0 ); /* 4 MSB como entrada, 4 LSB como salida */
       port   = 0;
       column = 0;   
    }

    char mkd_keyPress( void )
    {         
        static char keyPress = '\0';
       
        /* Se ha de esperar aprox. 30 ms para evitar el rebote del teclado */
        delay_ms( DEBOUNCER_DELAY );   
       
        /* Se comienza activando una columna */
        switch( column )
        {
        case 0:
           /* Se pone a 1 la columna 0 */
           port = COLUMN_0;
           break;
        case 1:
           /* Se pone a 1 la columna 1 */
           port = COLUMN_1;
           break;
        case 2:
           /* Se pone a 1 la columna 2 */
           port = COLUMN_2;
           break;
        case 3:
           /* Se pone a 1 la columna 3 */
           port = COLUMN_3;
           break;
        }
       
        /* Se rastrea si hay pulsación en la columna activa */
        if( ROW_0 == 1 )
        {
           keyPress = matrixKeyBoard[ 0 ][ column ];
        }
        else if( ROW_1 == 1 )
        {
           keyPress = matrixKeyBoard[ 1 ][ column ];
        }
        else if( ROW_2 == 1 )
        {
           keyPress = matrixKeyBoard[ 2 ][ column ];
        }
        else if( ROW_3 == 1 )
        {
           keyPress = matrixKeyBoard[ 3 ][ column ];
        }   
       
        if( 3 == column )
        {
           /* Se completo un ciclo, reiniciamos nuevamente */
           column = 0;
        }
        else
        {
           column++;
        }
       
        return( keyPress );
    }



Si estás siguiendo los post del foro verás que hay varios ejemplos en danza con diferentes librerías para el teclado y no se muy bien cual has utilizado en tu ejemplo. Lo del nombre es lo de menos, porque cada usuario le ha puesto el nombre que ha querido. Entiendo que quieres utilizarla en un teclado 4X4. Cuando tenga todas estas cosas claras quizás mueva estas respuestas a un nuevo tema, para no volver a liarnos.

A parte de esperar a que me confirmes la librería que estas utilizando, el código que has puesto lo veo correcto.
Lo ideal para saber donde está el problema es que me adjuntes el DSN de proteus para que yo lo pueda simular.

myesid escribió:te agradeceria enormemente me colaboraras porque me estoy estancando en mi aprender


Cuenta con ello y espero que no te desanimes,

Un saludo
Avatar de Usuario
biblioman
 
Mensajes: 220
Registrado: Vie Mar 20, 2009 4:58 pm

Control teclado 4X4 con el codificador MM74C922

Notapor myesid » Vie Mar 05, 2010 9:45 pm

hola biblioman

mira los codigos que estoy usando son los siguientes

codigo de la libreria

Código: Seleccionar todo
///////////////////////////////////////////////////////////////////////////
////                     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.                        ////
////                                                                   ////



+++++Codigo editado por el moderador++++++++
este codigo no es mio lo encontre en un foro

y este es el programa que estoy desarrollando ademas este tiene la intencion de mostrar los valores del tecldo por la usart

Código: Seleccionar todo
#include <16F877A.h>
#use delay (clock=4000000) // la configuracion del reloj siempre va primero sin importar si va un include despues
#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,bits=8)
#include <kbdd.c>
//!//#include <lcd.c>


void main()
{
   char s;
   kbdd_init();
    port_b_pullups(true);
   
   while (true)
   {
      s= kbdd_getc();
      if(s!=0)
      printf("la tecla es%s\r",s);
   }
   
}
myesid
 
Mensajes: 26
Registrado: Vie Feb 12, 2010 3:21 pm

Siguiente

Volver a Programación PIC en C con CCS

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron