TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Mauricio_V en 14 de Junio de 2009, 18:49:58

Título: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: Mauricio_V en 14 de Junio de 2009, 18:49:58
Hola que tal, luego de matarme la cabeza tratando de programar la lectura de un teclado 4x4 por medio de interrupcion RB4 - RB7 quiero compartir mis resultados con ustedes. Utilice el método de inversion de puerto con resistencias de pull-up y antirrebote por software, el código es bastante sencillo asi que sin más preambulos...

Código: CSS
  1. ///////////////////////////////////////////////////////////////////////////
  2. ////                             keypad.c                                          ////
  3. ////                  Driver para teclado 4x4 generico                   ////
  4. ////                                                                                    ////
  5. ////  init_keypad()   Debe llamarse desde el programa principal ////
  6. ////                  antes de cualquier funcion                             ////
  7. ////                                             ////
  8. ////  scan_keypad()   Función de escaneo de teclado segun    ////
  9. ////            la matriz de teclado                     ////
  10. ////                                                                                    ////
  11. ////  read_keypad()       Encuentra la tecla por el metodo de inversion   ////
  12. ////              de puerto, espera a que se deje de pulsar y  ////
  13. ////                              retorna.          ////
  14. ////                                                                            ////
  15. ///////////////////////////////////////////////////////////////////////////
  16. ////        (C) Copyright 1996,2009 Custom Computer Services           ////
  17. //// This source code may only be used by licensed users of the CCS C  ////
  18. //// compiler.  This source code may only be distributed to other      ////
  19. //// licensed users of the CCS C compiler.  No other use, reproduction ////
  20. //// or distribution is permitted without written permission.          ////
  21. //// Derivative programs created using this software in object code    ////
  22. //// form are not restricted in any way.                               ////
  23. ///////////////////////////////////////////////////////////////////////////
  24. ////                                                                                                             
  25. ////    RB4 RB5 RB6 RB7                                                                          
  26. ////             ^   ^   ^   ^                                                                             
  27. ////             |   |   |   |                                                                             
  28. ////           |---|---|---|---|                El teclado se conecta sin          
  29. ////  RB0 ---> | 1 | 2 | 3 | A |                necesedad de resistencias ya  
  30. ////           |---|---|---|---|                que tiene las resistencias de  
  31. ////  RB1 ---> | 4 | 5 | 6 | B |                pull-up activadas                      
  32. ////           |---|---|---|---|                                                                       
  33. ////  RB1 ---> | 7 | 8 | 9 | C |                                                                           
  34. ////           |---|---|---|---|                                                                           
  35. ////  RB3 ---> | * | 0 | # | D |                                                                           
  36. ////           |---|---|---|---|                                                                           
  37. ////                                                                                                             
  38. ///////////////////////////////////////////////////////////////////////////
  39.  
  40.  
  41.  
  42. //Direcciones de los registros segun PDF del pic 16fXXX
  43.  
  44. #byte PORTB=0x06        //Pic 16f877a
  45. #byte TRISB=0x86        //
  46.  
  47. void init_keypad()     
  48. {
  49.         port_b_pullups (TRUE);  //Habilita pull-up internos del puerto B
  50.         TRISB=0xF0;
  51.         PORTB=0;       
  52.         enable_interrupts(INT_RB);              // Habilita la interrupcion del puerto B ( RB4 - RB7).
  53.         enable_interrupts(GLOBAL);              // Habilita las interrupciones globales.
  54. }
  55.  
  56. unsigned char scan_keypad()    
  57. {
  58.         unsigned char i=0,j=0,PORT,PORTH,PORTL,PH,PL,key;
  59.  
  60.         //Matriz de teclado
  61.         char keypad[4][4] =     { {'1','2','3','A'},
  62.                                                   {'4','5','6','B'},
  63.                                                   {'7','8','9','C'},
  64.                                                   {'E','0','F','D'} };
  65.         PORT=PORTB;
  66.         PORTH=PORT&0xF0;
  67.         PORTL=PORT&0x0F;
  68.        
  69.         for(j=0;j<4;j++)
  70.         {
  71.                 PH=~(0b00010000<<j)&0xF0;
  72.                 if(PORTH == PH)
  73.                 {
  74.                         for(i=0;i<4;i++)
  75.                         {
  76.                                 PL=~(0b00000001<<i)&0x0F;
  77.                                 if(PORTL == PL)
  78.                                 {
  79.                                         key=keypad[i][j];
  80.                                         while(PORT==PORTB);
  81.                                 }
  82.                         }
  83.                 }              
  84.         }
  85.         if(key)
  86.                 return(key);    //Si la tecla es encontrada retorna valor segun la matriz de teclado
  87.         else   
  88.                 return('/');    //Si la tecla no es encontrada retorna un caracter nulo
  89. }
  90.  
  91.  
  92. unsigned char read_keypad()
  93. {      
  94.         char read,key;
  95.  
  96.         read=PORTB;
  97.         TRISB=0x0F;
  98.         PORTB=read;
  99.         key=scan_keypad();
  100.         TRISB=0xF0;
  101.         return(key);
  102. }
  103.  
  104.  
  105. #if defined(__PCM__)                            // Preprocessor directive that chooses the compiler
  106. #include <16F877a.h>                            // Preprocessor directive that selects the chip
  107. #fuses HS,NOWDT,NOPROTECT,NOLVP                 // Preprocessor directive that defines the chip fuses
  108. #use delay(clock=20000000)                      // Preprocessor directive that specifies clock speed
  109. #endif
  110.  
  111. #include <lcd.c>
  112. #include <keypad.c>     //Libreria de teclado 4x4
  113.  
  114. unsigned char key;      //Variable global tecla
  115.  
  116. // Interrupcion RB4 - RB7 /////////////////////////////////////////////////////
  117.  
  118. #INT_RB
  119. void interrupt_keypad()                                
  120. {
  121.         key=read_keypad();                      //Asigna la tecla pulsada
  122.         clear_interrupt(INT_RB);        //Limpia bandera RBIF
  123.  
  124.         lcd_putc('\f');                         //
  125.         lcd_gotoxy(1,1);                        //Visualiza en el lcd
  126.     lcd_putc(key);                              //                                                                     
  127. }
  128.  
  129.  
  130. // Programa Principal /////////////////////////////////////////////////////////
  131.  
  132. void main()
  133. {
  134.         init_keypad();
  135.         lcd_init();
  136.  
  137.         lcd_putc("\fEsperando...\n");
  138.  
  139.         while(true)
  140.         {
  141.         }
  142. }

Adjunto los archivos tanto en ccs como hitech picc y la simulación en proteus 7.4 sp3
http://www.megaupload.com/?d=JYA8ZQTL
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: RedPic en 15 de Junio de 2009, 03:31:21
Muy bien Mauricio, enhorabuena.  :mrgreen:

Lo tendremos en cuenta para futuros trabajos. He modificado tu post para añadirle el GESHI y que se vea correctamente tu programa fuente.
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: Nocturno en 15 de Junio de 2009, 04:34:11
Magnífico estreno en el foro. Muchas gracias.
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: Mauricio_V en 15 de Junio de 2009, 10:28:15
De nada Nocturno, gracias Redpic no sabia como ponerlo para que quedara así. Seguire poniendo mis proyectos...
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: nicolas8702 en 31 de Agosto de 2009, 17:03:35
hola mauricio  que tal he probado tu programa con el pic 18f2550 y no me funciona  quiciera saber si me podrias ayudar a ver que tengo mal aqui adjunto lo  que he hecho hasta ahora te agradezco de antemano la ayuda
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: Mauricio_V en 15 de Diciembre de 2009, 09:17:48
hola mauricio  que tal he probado tu programa con el pic 18f2550 y no me funciona  quiciera saber si me podrias ayudar a ver que tengo mal aqui adjunto lo  que he hecho hasta ahora te agradezco de antemano la ayuda

El código no esta hecho con los registros del pic 18f2550 solo debes cambiar los valores que aparecen a continuación por los que correspondan al micro que usas segun el pdf.

42.//Direcciones de los registros segun PDF del pic 16fXXX43. 44.

#byte PORTB=0x06   //Pic 16f877a45.
#byte TRISB=0x86   //
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: tinchosalamero en 15 de Diciembre de 2009, 11:38:18
Gracias por el aporte, lo vamos a usar seguro

Saludos
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: nicolas8702 en 16 de Diciembre de 2009, 00:10:06
gracias por tu respuesta mauricio el problema no es de los registros sino  que el pic no regresa de  la interrupcion por eso  que ria saber si me podrias hechar una mano gracias
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: moshell en 23 de Diciembre de 2010, 13:22:15
He tratado de usar esta libreria, pero ps no he conseguido echarla a andar en un pic16f887, fisicamente no la he probado, pero en la simulacion de proteus no me funciona, aunque el complilador no marca ningun error u advertencia alguna. Se supone que deberia funcionar, ya que el puerto b de 16f887 y el del 16f877a estan en la misma direccion de RAM. Si alguno lo ha intentado, o quisiera echarme una mano con esto, la ayuda es bienvenida.
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: bigluis en 23 de Diciembre de 2010, 21:23:55
42.//Direcciones de los registros segun PDF del pic 16fXXX43. 44.

#byte PORTB=0x06   //Pic 16f877a45.
#byte TRISB=0x86   //


para que sea un codigo mas general puedes utilizar
Código: [Seleccionar]
#byte PORTB=getenv("SFR:PORTB") //Pic 16f877a45.
#byte TRISB=getenv("SFR:TRISB") //

o puedes utilizar la libreria para puertos que esta en este link.
http://www.todopic.com.ar/foros/index.php?topic=30662.0 (http://www.todopic.com.ar/foros/index.php?topic=30662.0)
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: apalau en 02 de Mayo de 2011, 08:21:14
Hola a todos.
Me gusta este programilla, pero no consigo hacerlo andar. Lo estoy simulando con el simulador Proteus y veo que no me hace la inversion, las filas se mantienen a 0(por lo tanto como salidas) y la columnas, conectadas a las pull-up internas(como entrada).
Como las filas(salidas) todas estan a 0, pues claro no puede retornar ningun caracter de la matriz.
No se pk no me hace la inversion de 0xF0 a 0x0F.

Las unicas diferencias aparentes ke tengo son ke utilizo un 18f4550 y no utilizo la directiva #ifdef.
Me entra bien en la interrupcion, en esa interrupcion la variable key tiene el valor '/'(de no haber encontrado ningun...)
si pongo un prinf(lcd,"%i",key).....  su valor en el registro es '@'

claro en lugar de ej: PORTB=0b1110 1101(entrando en el scan_keypad())
kreo me entra ej: PORTB= 0b1101 0000(sin hacerme la inversion del TRISB, cuando entra en el scan_keypad() )
O ESO ES LO KE YO CREO

los warnings ke me salen en el compilador son: Interrupts disabled during call to prevent re-entrancy:(@delay_ms1)
                                                                    Interrupts disabled during call to prevent re-entrancy:(lcd_send_nibble)
                                                                    Interrupts disabled during call to prevent re-entrancy:(lcd_send_byte)
                                                                    Interrupts disabled during call to prevent re-entrancy:(lcd_putc)


                                                                   

bueno gracias, "aspiro" a ke alguien me pueda ayudar.
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: apalau en 02 de Mayo de 2011, 18:24:29
Os dejo la imagenes capturadas en proteus.

Mi imagen del 18f4550, sin conseguir ke funcione la inversion en el TRISB(TECLADOKO.JPG)
- Como veis las filas tienen el valor 0000(siempre).

Y la imagen del 16f877A subido por nuestro compañero Mauricio_V, funcionando...(TECLADOOK.JPG)

Muchas gracias.
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: apalau en 05 de Mayo de 2011, 19:04:13
Hola Buenos dias,
Mi pregunta es ¿pk con el PIC18F877A rula bien?
¿y con el 18F4550 no?

cambie esto, pero no es suficiente.....
#byte PORTB=0x06   X  #byte PORTB=0xF81   
#byte TRISB=0x86    X  #byte TRISB=0XF93 

gracias.

Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: ciga19 en 01 de Junio de 2011, 02:17:59
hola amigo, me puedes decir que cambios necesito hacer para conectar el tu teclado en otros puertos que no sea el B??? por ejemplo en el puerto A o en el D, el c no por que lo utilizo para el tx(rs232) pero ps ssi se puede tambien  :mrgreen: ... espero me ayudes amigo!!! saludos
Título: Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
Publicado por: mikipic en 10 de Octubre de 2012, 00:32:00
holaa probe el programa con el 16f877a y todo perfecto. pero quise hacerle unas modificaciones, para permitir solamente el ingreso de 3 numeros por teclado( para luego intentar hacer un pograma como un control de acceso )  ... pero no he tenido exito ::(   aqui esta el codigo aver si alguien puede ayudarme a corregirlo


#include <16f877a.h>                              // Preprocessor directive that selects the chip
                         // Conversion a 8 bits
#fuses XT,NOWDT,NOPROTECT,NOLVP,              // Preprocessor directive that defines the chip fuses
#use delay(clock=4000000)                        // Preprocessor directive that specifies clock speed

#use fast_io(C)

//#include ".\librerias\keypad.c"
#include <interkey.c>                  // es la misma libreria de Mauricio_V , le cambie el nombre para no confundirme
#include <lcd.c>                         // es la libreria que brinda ccs
   //Libreria de teclado 4x4

unsigned char key;   //Variable global tecla

int cont=0;  // contador de las veces que presiono una tecla
int flag=0; 
// Interrupcion RB4 - RB7 /////////////////////////////////////////////////////

#INT_RB
void interrupt_keypad()               
{
 
  // solo debo permitir el ingreso de 3 digitos por el  teclado
 
  if (cont<3)
   {
   key=read_keypad();         //Asigna la tecla pulsada
   
   cont++;
   
   lcd_putc('\f');            //
   lcd_gotoxy(1,1);         //Visualiza en el lcd
   lcd_putc(key); 
   
   }
   
   else {flag=1;}    // si ya se ingresaron 3  pongo el falg=1
  clear_interrupt(INT_RB);
 
         }
 
 
     
   

   
     
   
       
    //disable_interrupts(INT_RB);



// Programa Principal /////////////////////////////////////////////////////////

void main()
{

int cont=0;
flag=0;
SET_TRIS_C(0X00);
   init_keypad();
   lcd_init();

   lcd_putc("\fEsperando...\n");

   while(flag==0) // mientras el contador no llegue a 3 se queda en el bucle
   
   {
   
 
   
   }
   
   
   // cuando el contador es igual a 3 ( osea se ingresaron 3 numeros por teclado) el fag=1
   
   printf(lcd_putc,"\f se ingresaron 3 digitos por teclado y acaba el programa xd");
}