# Pantalla LCD con PIC18F4550 y CCS



## Nagem (Jul 30, 2011)

Buenos días, 
resulto que llevo varios días con el proyecto, y ayudándome de esta y otras webs. 
Construí un robot, la placa del cual tiene un bootloader incorporado que reprogramo por usb. Lógicamente, cogí el código de otra web y lo modifiqué. El problema está en que no soy capaz de ver ni un sólo carácter en la pantallita. He probado mil y un tipos de librerías y visitado mil foros más, y nada de nada que me pueda ayudar.

Conecté los pines de la siguiente forma:

RS    D2
E      D3
DB4   D4
DB5   D5
DB6   D6
DB7   D7

RW, a GND.

El código original que me daban para no sobreescribir el bootloader y que parpadeara un led fue el que cogí de base. Simplemente le añadí las librerías ya modificadas con mis nuevos pines y puse la funcion para escribir en la LCD.



```
/*****************************************************************************/
/*   18F4550 Application Demo for usage of MCHPUSB Bootloader                */
/*                                                                           */
/*   Author:   Christian Stadler                                             */
/*   Date:     18.08.2010                                                    */
/*   Version:  1.0                                                           */
/*                                                                           */
/*   Purpose:  Demo application for usage of MCHPUSB bootloader to show the  */
/*             special requirements of an application which shall be flashed */
/*             via Microchip MCHPUSB bootloader.                             */
/*                                                                           */
/*             Requirements for bootloader:                                  */
/*             - reserve boot block area (0x000-0x7FF)                       */
/*             - map reset vector from 0x000 to 0x800                        */
/*             - map interrupt vector from 0x008 to 0x808                    */
/*                                                                           */
/*             The demo application itself is very simple. It just toggles   */
/*             an I/O pin based a counter derived from Timer1 interrupt.     */
/*                                                                           */
/*****************************************************************************/

/* make compiler case sensitive */
#pragma case

/* --- configuration bits -------------------------------------------------- */
#include <18F4550.h>
#device adc=8

/* systm clock is 48 MHz */
#use delay(clock=48000000,RESTART_WDT)

#include <flex_lcd.c>

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES WDT128                    //Watch Dog Timer uses 1:128 Postscale
#FUSES HSPLL                     //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT                 //Code not protected from reading
#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 NOWRTD                    //Data EEPROM not write protected
#FUSES IESO                      //Internal External Switch Over mode enabled
#FUSES FCMEN                     //Fail-safe clock monitor enabled
#FUSES PBADEN                    //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                    //configuration not registers write protected
#FUSES NOWRTB                    //Boot block not write protected
#FUSES NOEBTR                    //Memory not protected from table reads
#FUSES NOEBTRB                   //Boot block not protected from table reads
#FUSES NOCPB                     //No Boot Block code protection
#FUSES MCLR                      //Master Clear pin enabled
#FUSES LPT1OSC                   //Timer1 configured for low-power operation
#FUSES NOXINST                   //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL3                      //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV2                   //System Clock by 2
#FUSES USBDIV                    //USB clock source comes from PLL divide by 2
#FUSES VREGEN                    //USB voltage regulator enabled
#FUSES ICPRT                     //ICPRT enabled




/* --- BEGIN: changes required for bootloader ------------------------------ */

/* ------------------------------------------------------------------------- */
/* map reset vector and interrupt vector                                     */
/* 0x000-0x7FF is used by the bootloader. The bootloader maps the original   */
/* reset vecotr (0x000) to 0x800 and the reset vector (0x008) to 0x800.      */
/* ------------------------------------------------------------------------- */
#build (reset=0x800, interrupt=0x808)

/* ------------------------------------------------------------------------- */
/* reserve boot block area                                                   */
/* This memory range is used by the bootloader, so the application must not  */
/* use this area.                                                            */
/* ------------------------------------------------------------------------- */
#org 0, 0x7FF {}

/* --- END: changes required for bootloader -------------------------------- */



/* timer 1 reload value (@ 48MHz) to get a 1ms interrupt on timer 1 overflow */
/* => CPU clock = 48MHz => instruction cycle = 83ns => prescaler = 1:        */
/*    reload value = 0xFFFF - (1ms / 83ns) */
#define TIMER1_RELOAD_VAL     (0xFFFF - (1000000/83))

/* 1ms counter derived from Timer1 interrupt */
static int16 cnt_1ms = 0;


/* ------------------------------------------------------------------------- */
/* isr_timer1                                                                */
/* Timer1 overflow interrupt service routine. Increments 1ms counter.        */
/* ------------------------------------------------------------------------- */
#INT_TIMER1
void isr_timer1(void)
{
   /* reload timer 1 */
   set_timer1(TIMER1_RELOAD_VAL);
   
   cnt_1ms++;
}


/* ------------------------------------------------------------------------- */
/* main                                                                      */
/* Toggles I/O pin                                                           */
/* ------------------------------------------------------------------------- */
void main()
{
    setup_adc_ports(NO_ANALOGS|VSS_VDD);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_wdt(WDT_OFF);
    setup_timer_0(RTCC_INTERNAL);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
   
    /* init timer 1 as 1ms timer */
    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
    set_timer1(TIMER1_RELOAD_VAL);

    /* enable interrupts */
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_TIMER1);

    delay_ms(30);
    lcd_init();
    delay_ms(20);
    lcd_putc("hola");
    delay_ms(20);
    while (TRUE)
    {
        /* toggle I/0 pin every second */
       lcd_putc("hola");
       delay_ms(20);
       lcd_gotoxy(1,2);
       delay_ms(20);
       lcd_putc("aaaa");
       
       if (cnt_1ms < 1000)
        {
            output_low(PIN_C0);
        }
        else if (cnt_1ms < 2000)
        {
            output_high(PIN_C0);
            lcd_putc("ences");
        }
        else
        {
            cnt_1ms = 0;
        }
    }
}
```


He encontrado distintas soluciones, como el delay necesario para que se encienda la pantalla, la no viabilidad en algunas librerias de la conexión a GND de RW... 

No sé si se debe o no a alguna mala configuración de los fuses.

Muchas gracias de antemano


----------



## dragondgold (Jul 30, 2011)

Y si quisieras encender un LED funciona? Para descartar haber si al menos el PIC esta arrancando, intentá desactivar el WDT. Por qué usas esa librería del LCD y no la que trae el CCS ?

Saludos!!


----------



## Nagem (Jul 30, 2011)

Tengo un led conectado para hacer comprobaaciones y si que se enciende. Cuando llegue a casa lo desactivare a ver que tal. Muchas gracias por la respuesta. 
Tambien he repasado muchas veces el connexionado con el pic y esta correcto.


----------



## Nagem (Jul 31, 2011)

Ya desactivé el WDT y tampoco funciona.
La librería que traía el CCS también la probé y nada de nada, tampoco permitía el no uso del rw. 

Hoy he probado otra librería que he encontrado y tampoco me funciona. No lo entiendo. Puede ser que el no uso del pin rw me esté dando problemas? Si es así, haré algún puente con un pin que me sobre a ver si así funciona.

Muchas gracias


----------



## dragondgold (Jul 31, 2011)

Probá la librería que ponen acá me parece que las librerias del CCS y la que colocas vos no van a funcionar si tenes el RW a masa...

https://www.forosdeelectronica.com/f24/programa-lcd-4-bits-sin-rw-12528/

Saludos!


----------



## Nagem (Jul 31, 2011)

Muchas gracias por tu respuesta.

Ya probé esta libreria y tampoco funciona. Seguro que es una tonteria, pero no soy capaz de hallarla. Además, usa los pines d0-d3, en lugar de los d4-d7. Voy a seguir investigando.


----------



## Nagem (Ago 16, 2011)

Al final desistí... y opté por comunicarme con el PC vía USB. Lo conseguí y ya puedo tratar con los datos que me envía el GPS con total facilidad. 
Ahora me trae problemas el L298, porque el PIC no me activa algunas salidas del puertoB... investigaré más a ver que tal. 
Si doy con la solución al problema de la pantalla no dudaré en postearlo.

Muchas gracias


----------



## arias887 (Sep 21, 2011)

Creo que la lcd esta mal conectada...
creo que es asi:

E       B0
RS     B1
RW    B2
N.C.   B4
DB4     D4
DB5     D5
DB6     D6
DB7     D7


----------



## Nagem (Sep 21, 2011)

Al final no era problema de la conexion de la pantalla, sino del PIC, que iba conectado a un zócalo defectuoso... 

Ya funciona el robot a las mil maravillas. Muchas gracias a todos.


----------



## danirebollo (Sep 21, 2011)

Con el problema ya solucionado aporto poco.. xd pero queria matizar que en el archivo flex_lcd.c viene la configuración de pines, igual que modificando este archivo se puede conseguir utilizar lcd's de diferentes configuraciones, como 1x16, 4x20...


----------



## skyleer32 (Oct 19, 2011)

Hola Nagem, yo tengo el mismo problema que tu tenías con la LCD, he intentado con muchas librerías y el resultado siempre es el mismo, no se despliega ningún carácter en la LCD, no sé por qué este fallando, en la simulación todo va perfecto pero a la hora de implementarlo en el proto no sale nada. Tengo una tarjeta desarrolladora donde programo mi PIC que es un 18F4550, para usar el bootloader el pic tiene programada las primeras 1000 direcciones no sé si esto afecte al programa te adjunto el programa y la librería que uso también la simulación y también como sale el LCD una vez ya implementado espero que me puedas ayudar ya que estoy desesperado llevo mucho tiempo intentando hacer funcionar el LCD. Uso el CCS espero que me puedan ayudar gracias


----------



## agurto (Sep 12, 2012)

Seguro estas trabajando con un lcd de 16 pines si te das cuenta en el proteus solo aparacen 14 pines.El pin 15 y 16 tambien van conectados a 5v y gnd.Adjunto una imagen con la descripcion de cada pin y su correspondiente conexion.
Chequea esto:
https://www.forosdeelectronica.com/f24/problemas-lcd-pic-16f877a-ccs-48421/


----------



## ilcapo (Abr 19, 2014)

hola gente del foro queria consultarles el significado dentro del parentesis despues del  % , solo sé que en C asi se escribe para mostrar los datos por el LCD pero no sé que significa cada cosa, si me pueden ayudar, gracias 

  printf(lcd_putc, "\fADC = %4ld", q);      // que significa  4ld ? lo que sé es que muestra el dato q

  printf(lcd_putc, "\nVoltage = %01.2fV", p); // que significa 01.2fV ? lo que sé es que muestra el dato p


----------



## TRILO-BYTE (Abr 19, 2014)

cuando un numero va antes del operador y despues del %

es por que delimitas el numero de elementos a imprimir
ejemplo

float pi=3.1426;

printf(lcd_putc, "%1.2f", pi);

imprimira 3.14  por que le indico imprimir 1 entero y 2 decimales

otro ejemplo:

int16 valor=1234;

printf(lcd_putc, "%3d", valor);
imprimira solo 3 enteros 

234 el cuarto valor no lo impimira


----------

