TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Facundo en 15 de Noviembre de 2010, 18:24:17

Título: C18 + LCD
Publicado por: Facundo en 15 de Noviembre de 2010, 18:24:17
Hola gente!!!
Tengo un hard ya desarrollado donde el LCD está conectado en el puerto D (4 bit´s por la parte alta del puerto) de un 18F4550 y el control por el puerto E y el pin R/W esta puesto a GND.
La cosa es que esto todo está en CCS y estoy tratando de pasarlo a C18 pero me encuentro con problemas para hacer funcionar el LCD bajo estas condiciones que no son las que tiene la libreria para lcd del C18 ya que esta usa incluso un pin para R/W, si alguien me puede tirar una mano muy agradecido.

Un saludo para todos!!!

  Facundo
Título: Re: C18 + LCD
Publicado por: gary_servin en 15 de Noviembre de 2010, 19:09:09
Cual es el problema especifico? Para hacerlo funcionar primero debes modificar los archivos en donde se configuran los pines en C18, están normalmente en la carpeta C:/MCC18/src/pmc_common/xLCD, una vez que los hayas modificado, debes agregar todos los archivos modificados al proyecto y compilarlos. con respecto al R/W si mal no recuerdo, no debes incluir el archivo busyXLCD.c para que no trate de leer el estado del mismo.

Saludos
Título: Re: C18 + LCD
Publicado por: bigluis en 15 de Noviembre de 2010, 19:12:14
por aqui (http://www.todopic.com.ar/foros/index.php?topic=30225.msg252602#msg252602) puedes encontrar una libreria para lcd hecha para MikroC tendrás que adaptarla para C18.
Título: Re: C18 + LCD
Publicado por: Suky en 15 de Noviembre de 2010, 19:31:08
Aquí dejé una librería para C18 idéntica a flex_lcd que se usa en CCS:

http://www.todopic.com.ar/foros/index.php?topic=17017.msg251661#msg251661


Saludos!
Título: Re: C18 + LCD
Publicado por: Facundo en 16 de Noviembre de 2010, 08:45:31
Genial, gracias!!!!!!
Me voy a poner a investigar, el tema es que tengo todo en CCS pero estoy tratando de migrar varias cosas a C18 pero el hard ya esta construido y como comentaba no se ajusta a la libreria que tiene C18, lo que si me queda claro es que CCS es mucho mas simple de implementar que C18.

Como siempre muy agradecido cuando resuelva mas o menos el tema posteo los resultados.

 Saludos para todos.

     Fernando
Título: Re: C18 + LCD
Publicado por: gary_servin en 16 de Noviembre de 2010, 10:02:50
CCS es mas "amigable" jajajaja C18 es mas "ANSI" o estándar!

Saludos!
Título: Re: C18 + LCD
Publicado por: Facundo en 17 de Noviembre de 2010, 11:33:13
Hola gente linda!!!
Como ven esto.

Mi LCD esta conectado de la siguiente forma:
datos: D4,D5,D6,D7
E:       E2
RS:     E1
RW:    GND

Para  eliminar el pin RW que esta puesto a GND he cambiado lo siguiente en el archivo busyxlcd.c

unsigned char BusyXLCD(void)
{
Delay10TCYx(8);
return(0);
}

El archivo klc.h lo he cambiado de la siguiente forma:


//*****************************************
 #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT      PORTD
#define TRIS_DATA_PORT TRISD

/* CTRL_PORT defines the port where the control lines are connected.
 * These are just samples, change to match your application.
 */
#define RW_PIN   LATBbits.LATB6         /* No me importa en este momento en el LCD es GND */
#define TRIS_RW  TRISBbits.TRISB6    /* No me importa en este momento en el lCD es GND*/
#define RS_PIN   LATEbits.LATE1         /* PORT for RS */
#define TRIS_RS  TRISEbits.TRISE1    /* TRIS for RS */
#define E_PIN    LATEbits.LATE2         /* PORT for D  */
#define TRIS_E   TRISEbits.TRISE2    /* TRIS for E  */
//***************************************************

Todo compila sin problemas (y de todos los archivos desde puego he hecho copias) pero el asunto es que no funciona el LCD sigue sin inicializar.
El programa pincipal de prueba es basicamente del maestro suky

//****************************************
#include <p18f4550.h>
#include <delays.h>
#include "xlcd.h"

#pragma config FOSC = HS,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF

void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
   direccion = 0x40;
else
   direccion =0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}

//**************************************
void main(void){
OpenXLCD(FOUR_BIT & LINES_5X7);
Delay1KTCYx(15);
comandXLCD(0x06);
comandXLCD(0x0C);
putrsXLCD("LCD en Puerto D");
gotoxyXLCD(1,2);
putrsXLCD("Linea 2");

for(;;){
}   
   }

//***************************************************

Saludos para todos!!!!!
 
Facundo
Título: Re: C18 + LCD
Publicado por: Facundo en 20 de Noviembre de 2010, 18:02:34
Holaaaa gente

Bueno luego de mucho dar vueltas finalmente logré que funcionara el LCD pero la migración de mis códigos de CCS a C18 termina ahí, al menos por ahora. Relamente una desilución el C18 si lo comparo con la practicidad del CCS. El código que intentaba pasar a C18 es de un control numérico de un torno. Aplicación construida toalmente en CCS y funcionando desde hace 3 años sin problemas.
Bueno imagino que aquí se aplica "Si funciona bien NO LO TOQUES "

Un saludo para todos y gracias por prestarme su tiempo.
 
  Facundo
Título: Re: C18 + LCD
Publicado por: Suky en 20 de Noviembre de 2010, 19:26:09
En el mensaje anterior te había mostrado una rutina que se podía usar en C18 tal como se usa en CCS.  ;-) Las compareciones, a gusto de cada uno  :mrgreen:


Saludos!
Título: Re: C18 + LCD
Publicado por: Vigo en 24 de Noviembre de 2010, 19:32:56
En el mensaje anterior te había mostrado una rutina que se podía usar en C18 tal como se usa en CCS.  ;-) Las compareciones, a gusto de cada uno  :mrgreen:


Saludos!

Hola Suky
Una consulta, en la rutina que has mostrado se pueden manejar float??
Esta buena, te felicito buen trabajo!!!!!

Saludos
       Vigo
Título: Re: C18 + LCD
Publicado por: Suky en 24 de Noviembre de 2010, 20:32:25
Es una librería para manejo de LCD, no para formatear datos. En el foro han subido un par de funciones para pasar una variable float a string, seguramente salen con el buscador.  ;-)


Saludos!
Título: Re: C18 + LCD
Publicado por: PICYO en 02 de Enero de 2011, 10:19:17
Hola, iba a poner nuevo tema, pero madre mia, no soy el único con problemas en LCD con C18 ( libreria XLCD.h). Bueno, estoy mirando bastantes links, y veo que hay varias modificaciones. Mi propósito es modificar lo menos posible el código original, e incluso adaptar el Hardware ( bueno, las Frecuencia de Oscilacion mas bien ) para que " funcione". Una vez lo haga, entonces si que modificaria yo a placer los pines y demás.

Bien, como no, he visto el manual de Suky, en otro hilo de otro foro : http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/tutorial-mplab-c18-desde-0/msg6854/#msg6854
Me gusta, porqué es lo mas parecido al original que he visto, quitando esas dos funciones agregadas ( y no me refiero a los delays).

Mi proposito era ir con un cristal de 20 MHz, pero para adecuarlo exactamente al ejemplo de Suky-Microchip, uso un cristal de 4MHz, y usando la misma Frec. de programa a 4MHz( correjidme si eso no es asi..)

Bueno, el reusltado, es que si, se enciende el LCD, pero se queda un guión bajo permanente. No hay mas. he creido que serian los delays, ya qie Microchip te dice que has de agregar unos delays especificos, y uno que temnga 18 veces el TCY. Es por eso que he cambiado la F de programa de momento a lo que he visto que a los demas ( Suky) les funciona.

mi main es el siguiente :
Código: C
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //                                                                                                                                                                              //
  3. //                                                                                                                                                                              //
  4. //      Proposoito:guardar una configuracion(programacion) y visualizar en LCD 2 lineas     //
  5. //                                                                                                                                                                              //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7.  
  8.  
  9. //////////////////////////////////////////////////////////////////////////////////////////
  10. //                                                                                      //
  11. // Usaré, de momento, un cristal de 4MHz, para usar en memoria interna de programa, tam-//
  12. // bién de 4MHz, con propósito de usar el mismo tiempo de Delays que veo en manuales.   //
  13. //                                                                                                                                                                              //
  14. //////////////////////////////////////////////////////////////////////////////////////////
  15.  
  16.  
  17.  
  18. #include <p18f4550.h>
  19. #include <p18cxxx.h>
  20. #include <stdio.h>
  21. #include <xlcd.h>
  22. #include <delays.h>
  23.  
  24.  
  25. #pragma config FOSC = HS
  26. #pragma config CPUDIV = OSC1_PLL2
  27. #pragma config VREGEN = OFF //Disabled  USB power
  28. #pragma config WDT = OFF// HW Disabled - SW Controlled  
  29.  
  30.  
  31.  
  32.  
  33. /////////// PROTOTIPO FUNCIONES PARA DELAYS y XLCD /////////////
  34. //
  35. void DelayFor18TCY(void){  // TCY=4/Frec.Trabajo
  36.         Delay10TCYx(2);        // Mi TCY para F_trabajo=4MHz es de 1mS. El retardo que piden será pues de 18*TCY=18mS
  37. }                          // 10*x*(4/4MHz)=18uS; aislamos x, y x=1,8, por eso se pone 2. Seria algo mas de 18 TCY.
  38.  
  39.  
  40. void DelayPORXLCD(void){
  41.         //Delay1KTCYx(15);       // 1000*15*(4/4MHz)= 0,015 s
  42.       Delay1KTCYx(18);
  43. }
  44. void DelayXLCD(void){
  45.         Delay1KTCYx(2);        // 1000*2*(4/4MHz)= 0,002 s
  46. }
  47.  
  48. // Envia comando al LCD
  49. void comandXLCD(unsigned char a){
  50.         BusyXLCD();            
  51.         WriteCmdXLCD(a);
  52. }
  53. // Ubica cursor en (x = Posicion en linea, y = nº de linea)
  54. void gotoxyXLCD(unsigned char x, unsigned char y){
  55.         unsigned char direccion;
  56.  
  57.         if(y != 1)
  58.                 direccion = 0x40;
  59.         else
  60.                 direccion=0;
  61.        
  62.         direccion += x-1;
  63.         comandXLCD(0x80 | direccion);
  64. }
  65.  
  66.  
  67. ///////////////////////////////////////////////////////////////////
  68. void main(){
  69.  
  70. char datoLCD={"Esto es 1 string"};
  71. unsigned char ocupado;
  72.  
  73. TRISA = 0x00;  //Define  puerto A como pines de salida.
  74. OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.-
  75. comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
  76. comandXLCD(0x0C);                       // Encendemos LCD.-
  77. putrsXLCD("Hola");
  78. gotoxyXLCD(1,2);                        //Pasamos al oriden del Linea 2.-
  79. putrsXLCD("Mundo!");
  80. while(1) {
  81.  
  82. }
  83. }

pongo los archivos que uso para el proyecto
(http://img408.imageshack.us/img408/8324/listadoarchivos.jpg)
y el esquema electrico que uso
(http://img407.imageshack.us/img407/4973/esquemah.jpg)

cabe decir que no he modificado ( de momento, porque lo querré hacer una vez funcione con el original) la libreria XLCD.h, uso los pines tal cual pone ahí.
Tengía la duda de si UPPER, se refiere a los pines del puerto B ( uso los bajos, por eso UPPER sigue comentado), pero está solventada al ver que Suky dejaba descomentado el #define UPPER .
Otra duda que tengo, es acerca de esas funciones extra hechas por Suky, para el manejo del LCD. He leido el manual, desde el Proteus ( la opcion que te deja descargar manual - si está- del componente que estés viendo , en pripiedades) y veo una serie de órdenes, que se corresponden a su codificacion en hexadecimal:

(http://img521.imageshack.us/img521/1298/ordeneslcd.jpg)
y he ido comparando, por ejemplo, con esto :
Código: C
  1. comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
  2. comandXLCD(0x0C);                       // Encendemos LCD.-
y bueno, tampoco entiendo muy bien por que 0x06 es la orden de incremento de direccion ( estoy viendo pues el manual correcto?)
Bueno, en resumidas cuentas, qué parte no hago bien ??
Título: Re: C18 + LCD
Publicado por: PICYO en 04 de Enero de 2011, 16:48:18
me hecha alguien una mano...? En que medida he de cambiar delays? Si es eso....( no creo, pq uso los mismos componentes en Proteus..). Si todos hemos de hacer algun cambio que otro..es que hay gato escondido, no ?
Título: Re: C18 + LCD
Publicado por: PICYO en 06 de Enero de 2011, 07:36:55
bueno, para ver que pasaba, me he bajado el datasheet del controlador de Hitachi, y me he fijado en una figura, donde pone un ejmeplo de data bit transfer. he puesto el osciloscopio, para ver si  la información que hay en ese ejemplo se corresponde con la sdel osciloscopio. Comento los pasos que he hecho por si alguien se encuentra con el mismo problema que yo, que las cosas, aunque lo parezcan, a veces no son tan obvias...
 en el datasheet aparece esta informacion:

(http://img811.imageshack.us/img811/4710/4bittransfer.jpg)

y la he ido comparando con mi circuito :

(http://img696.imageshack.us/img696/7082/osci1c.jpg)

He ido comparando la secuencia de bits con la del datasheet, y a atrves de aqui es como me he dado cuenta del error. enable no aparecia como señal, bueno, estaba en 0 siempre. Eso ya se ve el el Proteus sin usar osciloscopio ( nunca se ve el pin rojo), pero con el osciloscopio te das cuenta de cuando si deberia ser. Entonces lo veo..uhm..por qué nunca se activa?? debe ser demasiado tiempo de espera?? A lo que he ido a los archivos correspondientes al XLCD.h En efecto... esta la cabecera en el programa, pero si leemos ...en ningun lado dice donde estan los archivos "x.c", esos también se han de agregar al proyecto! estan en "C:\Program Files\Microchip\MCC18\src\pmc_common\XLCD"
Y ahora ¡ aparece "mi ola mundo!" Ojo, he escrito ola y no hola... porque aún no está bien, pero entre eso y nada...¡ hay un abismo! Ahora al aparecer el mensaje veo esto en el osciloscopio:
(http://img190.imageshack.us/img190/4066/12857122.jpg)


(http://img148.imageshack.us/img148/1111/osci2.jpg)
Título: Re: C18 + LCD
Publicado por: PICYO en 06 de Enero de 2011, 07:43:20
ok, solucionado del todo. Como no, faltaba "gotoxyXLCD(1,1);" antes de escribir la primera linea.
Título: Re: C18 + LCD
Publicado por: snogol33 en 28 de Enero de 2011, 03:26:50
hola modifique una libreria que encontre en el foro de http://www.todopic.com.ar/foros/index.php?topic=17017.msg119694#msg119694 le hice unas modificaciones para que funcionara para cualquier pin del pic aqui se las dejo,!ojo hay que modificar los retardos dependiendo de las frecuencia que manejes¡


#include <p18f4550.h>
#include <delays.h>
/******************************************************/
/*
/* Manejo de un Display de Cristal Liquido LCD 16X4   */
/* de 16 caracteres por 4 lineas, con una interface   */
/* de 4 lineas:                                       */
/*
/*   LCD                  PIC
/* ------------------------------------
/*   D4  (11)      -->   RB0
/*   D5  (12)      -->   RB1
/*   D6  (13)      -->   RB2
/*   D7  (14)      -->   RB3
/*
/*   RS  (4)         -->   RC0
/*   RW  (5)         -->   RC1
/*   E   (6)         -->   RC2
/*
/******************************************************/
/* Conexiones del LCD al Microcontrolador */
#define   PIN_RS   LATDbits.LATD7   // Define la Columna 1
#define   PIN_RW   LATDbits.LATD6   // Define la Columna 2
#define   PIN_E   LATDbits.LATD5   // Define la Columna 3
#define   TRIS_PIN_RS   TRISDbits.TRISD7   // Define la Columna 1
#define   TRIS_PIN_RW   TRISDbits.TRISD6   // Define la Columna 2
#define   TRIS_PIN_E   TRISDbits.TRISD5   // Define la Columna 3
#define   Bit1_LCD   LATDbits.LATD0
#define   Bit2_LCD   LATDbits.LATD1
#define   Bit3_LCD   LATDbits.LATD2
#define   Bit4_LCD LATDbits.LATD3
#define   Bit1_tris_LCD TRISDbits.TRISD0
#define   Bit2_tris_LCD TRISDbits.TRISD1
#define   Bit3_tris_LCD TRISDbits.TRISD2
#define   Bit4_tris_LCD TRISDbits.TRISD3
 
/* Configuracion del Display y cursor */
#define DON            0b00001111  /* Display encendido   */
#define DOFF         0b00001011  /* Display apagado     */
#define CURSOR_HOME      0b00000010  /* Cursor encendido    */
#define CURSOR_ON      0b00001111  /* Cursor encendido    */
#define CURSOR_OFF      0b00001101  /* Cursor apagado      */
#define BLINK_ON      0b00001111  /* Cursor con parpadeo */
#define BLINK_OFF      0b00001110  /* Cursor sin parpadeo */
#define CLEAR         0b00000001  /* Display encendido   */
 
/* Modo de entrada */
#define INCREMENT      0b00000110  /* Incrementa la posicion del cursor */
#define DECREMENT      0b00000100  /* Decrementa la posicion del cursor */
 
 
/* Configuracion de los desplazamientos del cursor y del Display*/
#define SHIFT_CUR_LEFT      0b00010011  /* Corrimiento del cursor a la izquierda  */
#define SHIFT_CUR_RIGHT      0b00010111  /* Corrimiento del cursor a la derecha    */
#define SHIFT_DISP_LEFT      0b00011011  /* Corrimiento del display a la izquierda */
#define SHIFT_DISP_RIGHT   0b00011111  /* Corrimiento del display a la derecha   */
 
 
/* Funciones de inicializacion */
#define NIBLE            0b00000010  /* interface a 4 bits */
#define FOUR_BIT         0b00101111  /* Interface a 4-bit  */
#define EIGHT_BIT         0b00111111  /* Interface a 8-bit  */
#define LINE_5X7         0b00110011  /* Una linea, caracter 5x7 */
#define LINE_5X10         0b00110111  /* Una linea, caracter 5x10 */
#define LINES_5X7         0b00111011  /* Dos lineas. character 5x7 */
 
 
/* Lineas de trabajo */
#define DDRAM_LINEA_1      0b10000000   /* Linea 1 */
#define DDRAM_LINEA_2      0b11000000   /* Linea 2 */
#define DDRAM_LINEA_3      0b10010000   /* Linea 3 */
#define DDRAM_LINEA_4      0b11010000   /* Linea 4 */
 
 
/* Configuracion del puerto */


 
/* Prototipos de funciones */
void Flex_port(unsigned char data);
void Inicializa_LCD(void);      /* Inicializa LCD */
void Comando_LCD(char);         /* Indica al LCD un comando */
void Dato_LCD(char);         /* Indica al LCD un caracter */
void Datos_LCD(const rom char *buffer);   /* escribe una cadena desde la memoria de programa al LCD */
void Dato_String_LCD(char *buffer);      /* escribe una cadena desde la memoria de datos al LCD */


 
//**********************************************************
/* Inicializacion del LCD segun fabricante */
//**********************************************************
void Inicializa_LCD(void){
   //int i;
   Bit1_tris_LCD = 0;
   Bit2_tris_LCD = 0;
   Bit3_tris_LCD = 0;
   Bit4_tris_LCD = 0;
   TRIS_PIN_RS   = 0;
       TRIS_PIN_RW   =0;
       TRIS_PIN_E = 0;
   Delay10TCYx(110);         /* Retardo mayor a 100 useg. */
   Flex_port(NIBLE);      
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
 
   Delay1KTCYx(5);            /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Delay1KTCYx(15);         /* Retardo de 15 mseg. */
 
   /* Funcion set,  DL = 0, N = 1, F = 0 */
   /* Dos lineas, caracter de 5X7 e interface a 4 bits */   
   Comando_LCD(LINES_5X7 & FOUR_BIT);
 
   /* Display ON, D = 1, C = 1, B = 1 */
   /* Display encendido, cursor encendido con parpadeo */
   Comando_LCD(DON & CURSOR_ON & BLINK_ON);
 
   /* limpia el display */
   Comando_LCD(CLEAR);
 
   /* Entry Mode Set */
   /* Incremento del cursor */
   Comando_LCD(INCREMENT);
   return;
}
 
//**********************************************************
/* Indica al LCD comandos */
//**********************************************************
void Comando_LCD(char dato)
{
   char temp;                  /* variable auxiliar */
    
   Delay1KTCYx(10);            /* Retardo de 10 mseg. */
   temp = dato;               /* Respaldo del dato original */
   dato = dato >> 4;            /* Corrimiento del nible alto */
   Flex_port(dato);   
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Flex_port(temp);
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   return;
}
 
//**********************************************************
/* Manda datos al LCD */
//**********************************************************
void Dato_LCD(char dato)
{
   char temp;                  /* variable auxiliar */
 
   Delay1KTCYx(10);            /* Retardo de 10 mseg. */
   temp = dato;               /* Respaldo del dato original */
   dato = dato >> 4;            /* Corrimiento del nible alto */
   Flex_port(dato);
   PIN_RS = 1;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Flex_port(temp);
   PIN_RS = 1;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   return;
}
//**********************************************************
//   Escribe una cadena desde memoria de programa al LCD
//**********************************************************
void Datos_LCD(const rom char *buffer)
{
   while(*buffer)                  // Write data to LCD up to null
    {
      Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
        Dato_LCD(*buffer); // Write character to LCD
        buffer++;               // Increment buffer
   }
    return;
}
//**********************************************************
//   Escribe una cadena desde memoria de datos al LCD
//**********************************************************
void Dato_String_LCD(char *buffer)
{
   while(*buffer)                  // Write data to LCD up to null
    {
      Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
        Dato_LCD(*buffer); // Write character to LCD
        buffer++;               // Increment buffer
   }
    return;
}
 
 void Flex_port(unsigned char data){
   Bit1_LCD = 0;
   Bit2_LCD = 0;
   Bit3_LCD = 0;
   Bit4_LCD = 0;
   if ((data & 0b00000001)){ Bit1_LCD = 1;}   
   if ((data & 0b00000010)){ Bit2_LCD = 1;}
   if ((data & 0b00000100)){ Bit3_LCD = 1;}
   if ((data & 0b00001000)){ Bit4_LCD = 1;}   
   return;   
}

 y ejemplo de uso el mismo del link pasado


#include "main.h"
 

void ISR(void);
char mensaje[]="snogol33";
void main(void){

 PORTB = 0;
   Inicializa_LCD();
   Comando_LCD(CURSOR_OFF & BLINK_ON);
   Dato_LCD('#');//un dato
   Datos_LCD("Mexico modifico");//una cadena desde la memoria de programa
   Dato_String_LCD(mensaje);//una cadena desde la memoria de datos
 
   //con este comando pasamos a la linea 2 del LCD
   Comando_LCD(DDRAM_LINEA_2);
   Datos_LCD("poca mami");
   while(1);   
     




#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void)
{ _asm goto ISR _endasm }

#pragma code // Cerramos seccion.-
// Rutina de Interrupcion.-

#pragma interrupt ISR

void ISR(void)
{
   if(PIR1bits.RCIF==1)
      {
   
      }
}

Título: Re: C18 + LCD
Publicado por: snogol33 en 28 de Enero de 2011, 03:29:54

modificacion de la libreria de http://www.todopic.com.ar/foros/index.php?topic=17017.msg119694#msg119694 por "poca mami" mexico



#include <p18f4550.h>
#include <delays.h>
 
/* Conexiones del LCD al Microcontrolador pueden ser los pines que quieras */
#define   PIN_RS   LATDbits.LATD7   // Define la Columna 1
#define   PIN_RW   LATDbits.LATD6   // Define la Columna 2
#define   PIN_E   LATDbits.LATD5   // Define la Columna 3
#define   TRIS_PIN_RS   TRISDbits.TRISD7   // Define la Columna 1
#define   TRIS_PIN_RW   TRISDbits.TRISD6   // Define la Columna 2
#define   TRIS_PIN_E   TRISDbits.TRISD5   // Define la Columna 3
#define   Bit1_LCD   LATDbits.LATD0
#define   Bit2_LCD   LATDbits.LATD1
#define   Bit3_LCD   LATDbits.LATD2
#define   Bit4_LCD LATDbits.LATD3
#define   Bit1_tris_LCD TRISDbits.TRISD0
#define   Bit2_tris_LCD TRISDbits.TRISD1
#define   Bit3_tris_LCD TRISDbits.TRISD2
#define   Bit4_tris_LCD TRISDbits.TRISD3
 
/* Configuracion del Display y cursor */
#define DON            0b00001111  /* Display encendido   */
#define DOFF         0b00001011  /* Display apagado     */
#define CURSOR_HOME      0b00000010  /* Cursor encendido    */
#define CURSOR_ON      0b00001111  /* Cursor encendido    */
#define CURSOR_OFF      0b00001101  /* Cursor apagado      */
#define BLINK_ON      0b00001111  /* Cursor con parpadeo */
#define BLINK_OFF      0b00001110  /* Cursor sin parpadeo */
#define CLEAR         0b00000001  /* Display encendido   */
 
/* Modo de entrada */
#define INCREMENT      0b00000110  /* Incrementa la posicion del cursor */
#define DECREMENT      0b00000100  /* Decrementa la posicion del cursor */
 
 
/* Configuracion de los desplazamientos del cursor y del Display*/
#define SHIFT_CUR_LEFT      0b00010011  /* Corrimiento del cursor a la izquierda  */
#define SHIFT_CUR_RIGHT      0b00010111  /* Corrimiento del cursor a la derecha    */
#define SHIFT_DISP_LEFT      0b00011011  /* Corrimiento del display a la izquierda */
#define SHIFT_DISP_RIGHT   0b00011111  /* Corrimiento del display a la derecha   */
 
 
/* Funciones de inicializacion */
#define NIBLE            0b00000010  /* interface a 4 bits */
#define FOUR_BIT         0b00101111  /* Interface a 4-bit  */
#define EIGHT_BIT         0b00111111  /* Interface a 8-bit  */
#define LINE_5X7         0b00110011  /* Una linea, caracter 5x7 */
#define LINE_5X10         0b00110111  /* Una linea, caracter 5x10 */
#define LINES_5X7         0b00111011  /* Dos lineas. character 5x7 */
 
 
/* Lineas de trabajo */
#define DDRAM_LINEA_1      0b10000000   /* Linea 1 */
#define DDRAM_LINEA_2      0b11000000   /* Linea 2 */
#define DDRAM_LINEA_3      0b10010000   /* Linea 3 */
#define DDRAM_LINEA_4      0b11010000   /* Linea 4 */
 
 
/* Configuracion del puerto */


 
/* Prototipos de funciones */
void Flex_port(unsigned char data);
void Inicializa_LCD(void);      /* Inicializa LCD */
void Comando_LCD(char);         /* Indica al LCD un comando */
void Dato_LCD(char);         /* Indica al LCD un caracter */
void Datos_LCD(const rom char *buffer);   /* escribe una cadena desde la memoria de programa al LCD */
void Dato_String_LCD(char *buffer);      /* escribe una cadena desde la memoria de datos al LCD */


 
//**********************************************************
/* Inicializacion del LCD segun fabricante */
//**********************************************************
void Inicializa_LCD(void){
   //int i;
   Bit1_tris_LCD = 0;
   Bit2_tris_LCD = 0;
   Bit3_tris_LCD = 0;
   Bit4_tris_LCD = 0;
   TRIS_PIN_RS   = 0;
       TRIS_PIN_RW   =0;
       TRIS_PIN_E = 0;
   Delay10TCYx(110);         /* Retardo mayor a 100 useg. */
   Flex_port(NIBLE);      
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
 
   Delay1KTCYx(5);            /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Delay1KTCYx(15);         /* Retardo de 15 mseg. */
 
   /* Funcion set,  DL = 0, N = 1, F = 0 */
   /* Dos lineas, caracter de 5X7 e interface a 4 bits */   
   Comando_LCD(LINES_5X7 & FOUR_BIT);
 
   /* Display ON, D = 1, C = 1, B = 1 */
   /* Display encendido, cursor encendido con parpadeo */
   Comando_LCD(DON & CURSOR_ON & BLINK_ON);
 
   /* limpia el display */
   Comando_LCD(CLEAR);
 
   /* Entry Mode Set */
   /* Incremento del cursor */
   Comando_LCD(INCREMENT);
   return;
}
 
//**********************************************************
/* Indica al LCD comandos */
//**********************************************************
void Comando_LCD(char dato)
{
   char temp;                  /* variable auxiliar */
    
   Delay1KTCYx(10);            /* Retardo de 10 mseg. */
   temp = dato;               /* Respaldo del dato original */
   dato = dato >> 4;            /* Corrimiento del nible alto */
   Flex_port(dato);   
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Flex_port(temp);
   PIN_RS = 0;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   return;
}
 
//**********************************************************
/* Manda datos al LCD */
//**********************************************************
void Dato_LCD(char dato)
{
   char temp;                  /* variable auxiliar */
 
   Delay1KTCYx(10);            /* Retardo de 10 mseg. */
   temp = dato;               /* Respaldo del dato original */
   dato = dato >> 4;            /* Corrimiento del nible alto */
   Flex_port(dato);
   PIN_RS = 1;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   Flex_port(temp);
   PIN_RS = 1;
   PIN_RW = 0;
   PIN_E = 1;
   Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
   PIN_E = 0;
   return;
}
//**********************************************************
//   Escribe una cadena desde memoria de programa al LCD
//**********************************************************
void Datos_LCD(const rom char *buffer)
{
   while(*buffer)                  // Write data to LCD up to null
    {
      Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
        Dato_LCD(*buffer); // Write character to LCD
        buffer++;               // Increment buffer
   }
    return;
}
//**********************************************************
//   Escribe una cadena desde memoria de datos al LCD
//**********************************************************
void Dato_String_LCD(char *buffer)
{
   while(*buffer)                  // Write data to LCD up to null
    {
      Delay1KTCYx(5);               /* Retardo de 5 mseg. */   
        Dato_LCD(*buffer); // Write character to LCD
        buffer++;               // Increment buffer
   }
    return;
}
 
 void Flex_port(unsigned char data){
   Bit1_LCD = 0;
   Bit2_LCD = 0;
   Bit3_LCD = 0;
   Bit4_LCD = 0;
   if ((data & 0b00000001)){ Bit1_LCD = 1;}   
   if ((data & 0b00000010)){ Bit2_LCD = 1;}
   if ((data & 0b00000100)){ Bit3_LCD = 1;}
   if ((data & 0b00001000)){ Bit4_LCD = 1;}   
   return;   
}