Autor Tema: GLCD(KS0108) + TECLADO 4X4 + 18F6722  (Leído 2191 veces)

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

Desconectado matias29

  • PIC10
  • *
  • Mensajes: 13
GLCD(KS0108) + TECLADO 4X4 + 18F6722
« en: 14 de Junio de 2015, 16:29:33 »
Hola comunidad buenas tardes  :P, estoy realizando un proyecto el cual utiliza un microcontrolado pic 18F6722, teclado 4x4 y una glcd GDM12864(KS0108), la programacion del microcontrolador sera mediante el software ccs. La problematica se encuentra en que el teclado 4x4 utiliza el puerto B y la glcd (libreria proporcionada por ccs HDM64GS12.c) utiliza el puerto B y D.

Distribucion de pines libreria HDM64GS12.c :

////////////////////////////////////////////////////////////////////////
////  * 1: VSS is connected to GND                                   ////
////  * 2: VDD is connected to +5V                                   ////
////  * 3: V0  - LCD operating voltage (Constrast adjustment)        ////
////  * 4: D/I - Data or Instruction is connected to B2              ////
////  * 5: R/W - Read or Write is connected to B4                    ////
////  * 6: Enable is connected to B5                                 ////
////  *7-14: Data Bus 0 to 7 is connected to port d                  ////
////  *15: Chip Select 1 is connected to B0                          ////
////  *16: Chip Select 2 is connected to B1                          ////
////  *17: Reset is connected to C0                                  ////
////  *18: Negative voltage is also connected to the 20k Ohm POT     ////
////  *19: Positive voltage for LED backlight is connected to +5V    ////
////  *20: Negavtive voltage for LED backlight is connected to GND   ////
///////////////////////////////////////////////////////////////////////////////////

se podra modificar o si existiese alguna libreria para la GLCD que no utilize el puerto B, ya que para el teclado 4x4 he intentado y buscado librerias para hacerla funcionar en algun otro puerto y no lo he podido conseguir. muchas gracias cualquier informacion me ayudaria.  :P :P :P :P :P

« Última modificación: 16 de Junio de 2015, 00:01:16 por matias29 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: GLCD(KS0108) + TECLADO 4X4 + 18F6722
« Respuesta #1 en: 14 de Junio de 2015, 16:55:48 »
Bueno empezemos no podes poner el codigo por que esta protegido por el copyright y te pido que le edites y lo saques.

Citar
//// compiler.  This source code may only be distributed to other       ////
//// licensed users of the CCS C compiler.  No other use, reproduction  ////
//// or distribution is permitted without written permission.
         ////


Si quisieras cambiar el puerto solo deberias modificar esta parte de esa libreria:


Código: C
  1. // Un-comment the following define to use port B
  2. #define use_portb_kbd TRUE
  3.  
  4. // Make sure the port used has pull-up resistors (or the LCD) on
  5. // the column pins
  6.  
  7.  
  8. #if defined(__PCH__)
  9. #if defined use_portb_kbd
  10.    #byte kbd = 0xF81              // This puts the entire structure
  11. #else
  12.    #byte kbd = 0xF83              // This puts the entire structure
  13. #endif
  14. #else
  15. #if defined use_portb_kbd
  16.    #byte kbd = 6                  // on to port B (at address 6)
  17. #else
  18.    #byte kbd = 8                  // on to port D (at address 8)
  19. #endif
  20. #endif
  21.  
  22. #if defined use_portb_kbd
  23.    #define set_tris_kbd(x) set_tris_b(x)
  24. #else
  25.    #define set_tris_kbd(x) set_tris_d(x)
  26. #endif

Por algo asi... Ojo esto tiene hasta puerto E, asi que sos vos el encargado de seleccionar correctamente el puerto, ya que el programa no sabe si existe o no el puertoE
Asi como esta estaria en el puertoB

Código: C
  1. // Sacar el comment para seleccionar el puerto, sino por default es PORTE
  2. ;#define use_porta_kbd TRUE
  3. #define use_portb_kbd TRUE
  4. ;#define use_portc_kbd TRUE
  5. ;#define use_portd_kbd TRUE
  6.  
  7. // Make sure the port used has pull-up resistors (or the LCD) on
  8. // the column pins
  9.  
  10.  
  11. #if defined(__PCH__)              // Caso PIC18
  12. #if defined use_porta_kbd
  13.    #byte kbd = 0xF80              // Direccion PORTA
  14. #elif defined use_portb_kbd
  15.    #byte kbd = 0xF81              // Direccion PORTB
  16. #elif defined use_portc_kbd
  17.    #byte kbd = 0xF82              // Direccion PORTC
  18. #elif defined use_portd_kbd
  19.    #byte kbd = 0xF83              // Direccion PORTD
  20. #else
  21.    #byte kbd = 0xF84              // Direccion PORTE
  22. #endif
  23. #else                             // Caso PIC16
  24. #if defined use_porta_kbd
  25.    #byte kbd = 5                  // on to port A
  26. #elif defined use_portb_kbd
  27.    #byte kbd = 6                  // Direccion PORTB
  28. #elif defined use_portc_kbd
  29.    #byte kbd = 7                  // Direccion PORTC
  30. #elif defined use_portd_kbd
  31.    #byte kbd = 8                  // Direccion PORTD
  32. #else
  33.    #byte kbd = 9                  // on to portE
  34. #endif
  35. #endif
  36.  
  37. #if defined use_porta_kbd
  38.    #define set_tris_kbd(x) set_tris_a(x)
  39. #elif defined use_portb_kbd
  40.    #define set_tris_kbd(x) set_tris_b(x)
  41. #elif defined use_portc_kbd
  42.    #define set_tris_kbd(x) set_tris_c(x)
  43. #elif defined use_portd_kbd
  44.    #define set_tris_kbd(x) set_tris_d(x)
  45. #else
  46.    #define set_tris_kbd(x) set_tris_e(x)
  47. #endif
« Última modificación: 14 de Junio de 2015, 16:58:16 por KILLERJC »

Desconectado matias29

  • PIC10
  • *
  • Mensajes: 13
Re: GLCD(KS0108) + TECLADO 4X4 + 18F6722
« Respuesta #2 en: 16 de Junio de 2015, 00:09:32 »
gracias KILLERJC por la respuesta y disculpa por lo del codigo no tenia idea, lo probare y te digo como me fue. muchas gracias

Desconectado matias29

  • PIC10
  • *
  • Mensajes: 13
Re: GLCD(KS0108) + TECLADO 4X4 + 18F6722
« Respuesta #3 en: 16 de Junio de 2015, 00:51:07 »
lo probe cambiando el codigo de la libreria para el puerto E pero no me funciono noce si me faltara definir algo:
Código: [Seleccionar]
// Sacar el comment para seleccionar el puerto, sino por default es PORTE
//#define use_porta_kbd TRUE
//#define use_portb_kbd TRUE
//#define use_portc_kbd TRUE
//#define use_portd_kbd TRUE
 
// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins
 
 
#if defined(__PCH__)              // Caso PIC18
#if defined use_porta_kbd
   #byte kbd = 0xF80              // Direccion PORTA
#elif defined use_portb_kbd
   #byte kbd = 0xF81              // Direccion PORTB
#elif defined use_portc_kbd
   #byte kbd = 0xF82              // Direccion PORTC
#elif defined use_portd_kbd
   #byte kbd = 0xF83              // Direccion PORTD
#else
   #byte kbd = 0xF84              // Direccion PORTE
#endif
#else                             // Caso PIC16
#if defined use_porta_kbd
   #byte kbd = 5                  // on to port A
#elif defined use_portb_kbd
   #byte kbd = 6                  // Direccion PORTB
#elif defined use_portc_kbd
   #byte kbd = 7                  // Direccion PORTC
#elif defined use_portd_kbd
   #byte kbd = 8                  // Direccion PORTD
#else
   #byte kbd = 9                  // on to portE
#endif
#endif
 
#if defined use_porta_kbd
   #define set_tris_kbd(x) set_tris_a(x)
#elif defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#elif defined use_portc_kbd
   #define set_tris_kbd(x) set_tris_c(x)
#elif defined use_portd_kbd
   #define set_tris_kbd(x) set_tris_d(x)
#else
   #define set_tris_kbd(x) set_tris_e(x)
#endif

lo probe con este codigo que hice:

Código: [Seleccionar]
#include <18F6722.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES BBSIZ1K                  //1K words Boot Block size

#use delay(clock=8000000)

#BYTE PORTA=0XF80
#BYTE PORTB=0XF81
#BYTE PORTC=0XF82
#BYTE PORTD=0XF83
#BYTE PORTE=0XF84
#BYTE PORTF=0XF85
#BYTE PORTG=0XF86
#BYTE TRISA=0XF92
#BYTE TRISB=0XF93     
#BYTE TRISC=0XF94
#BYTE TRISD=0XF95
#BYTE TRISE=0XF96
#BYTE TRISF=0XF97
#BYTE TRISG=0XF98

#include <lcd.c>
#include <kbde.c>

char a;                                                                         //Caracteres teclado 4x4
int b;

void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);     
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF);
lcd_init();
kbd_init();
set_tris_D(0x00);
set_tris_E(0xff);
printf(lcd_putc,"\f***BIENVENIDO***\n****************");                                   //Menu principal
delay_ms(2000);
printf(lcd_putc,"\fdigito:");

while(true)
{
a=kbd_getc();                                                                   //Comprueba si es pulsada alguna tecla
b=a-48;
if(a!=0){
printf(lcd_putc,"\fdigito:%u",b);
}
}
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: GLCD(KS0108) + TECLADO 4X4 + 18F6722
« Respuesta #4 en: 16 de Junio de 2015, 01:13:29 »
Basicamente si esta todo comentado se cumple que:

#byte kbd = 0xF84                                //(PORTE)
#define set_tris_kbd(x) set_tris_e(x)       //(TRISE)

Y todo el codigo que le sigue... es decir lo del kbd_getc() usa esa definicion, es decir el PORTE

Ahora lo que no se es como se maneja con PIC18. Ya que para escribir se hace con LATE y para leer el pin con PORTE
Esto quiere decir que se deba de modificar la libreria ?, es lo unico que se me ocurre que puede fallar. eso implica tambien modificar el codigo del kbd_getc() de esa forma reemplazar los kbd por uno distinto de lectura y otro de escritura.
No puedo usar output_x() e input_x() a no ser que este configurado como FAST_IO.. por eso debe hacerse separado para cada uno.
Pero si ese fuera el error significa que como estaba la libreria no funcionaba. Y eso es lo extraño. Imagino que funcionaba.
Lo unico que hice fue cambiarles la direccion del puerto y el comando del tris como podes ver.

Otra cosa:
Las columnas tienen resistores de pull-up puestas como pide el codigo?


« Última modificación: 16 de Junio de 2015, 01:18:15 por KILLERJC »

Desconectado matias29

  • PIC10
  • *
  • Mensajes: 13
Re: GLCD(KS0108) + TECLADO 4X4 + 18F6722
« Respuesta #5 en: 18 de Junio de 2015, 22:15:58 »
gracias compa no me funciono pero igual la intencion es lo que vale gracias  :) :) :)