Autor Tema: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech  (Leído 17887 veces)

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

Desconectado Mauricio_V

  • PIC10
  • *
  • Mensajes: 3
Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« 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
« Última modificación: 15 de Junio de 2009, 03:29:26 por un Moderador »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #1 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.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #2 en: 15 de Junio de 2009, 04:34:11 »
Magnífico estreno en el foro. Muchas gracias.

Desconectado Mauricio_V

  • PIC10
  • *
  • Mensajes: 3
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #3 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...

Desconectado nicolas8702

  • PIC10
  • *
  • Mensajes: 6
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #4 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

Desconectado Mauricio_V

  • PIC10
  • *
  • Mensajes: 3
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #5 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   //

Desconectado tinchosalamero

  • PIC12
  • **
  • Mensajes: 53
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #6 en: 15 de Diciembre de 2009, 11:38:18 »
Gracias por el aporte, lo vamos a usar seguro

Saludos

Desconectado nicolas8702

  • PIC10
  • *
  • Mensajes: 6
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #7 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

Desconectado moshell

  • PIC10
  • *
  • Mensajes: 1
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #8 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.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #9 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
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado apalau

  • PIC10
  • *
  • Mensajes: 3
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #10 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.

Desconectado apalau

  • PIC10
  • *
  • Mensajes: 3
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #11 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.
« Última modificación: 02 de Mayo de 2011, 18:26:31 por apalau »

Desconectado apalau

  • PIC10
  • *
  • Mensajes: 3
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #12 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.


Desconectado ciga19

  • PIC10
  • *
  • Mensajes: 1
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #13 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

Desconectado mikipic

  • PIC10
  • *
  • Mensajes: 19
Re: Teclado 4x4 funcional por interrupciones en CCS y Hi-Tech
« Respuesta #14 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");
}


 

anything