Autor Tema: Pic18f4520 con lcd 1602gd1622y en CCS  (Leído 1413 veces)

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

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Pic18f4520 con lcd 1602gd1622y en CCS
« en: 22 de Diciembre de 2015, 08:16:03 »
Hola a tod@s,

Hacía tiempo que no escribía por aquí, por suerte en mi trabajo estoy retomando algun proyecto que tengo que hacer electrónica de nuevo.
Tengo un problema con un lcd, se trata del modelo 1602gd1622y, comprado en RS, es un 2x16, lo estoy programando en CCS y uso la librería lcd.c (la de siempre vamos...). En la PCB que diseñé no me funcionaba correctamente, y lo que hice fue montar en una protoboard un circuito con el micro y el LCD y un led que parpadea para corroborar que el micro funciona.
Lo que me sucede, después del rollo que os solté, es que el lcd se comporta como un 2x8, es decir, me corta lo que escribo mostrando sólo 8 caractéres por línea.
No entiendo bien que pasa, porque en simulación en proteus, el mismo programa funciona correctamente. Os pongo el código a continuación, está bastante sucio porque he ido probando mil cosas antes de escribir aquí).
Código: [Seleccionar]
#include <18f4520.h>
#fuses XT, NOWDT, PUT, NOWRT
#use delay(clock=4000000)
#define LCD_DATA_PORT getenv("SFR:PORTD")
#include <lcd.c>
#use fast_io(B)
#byte TRISB = 0xF93
#byte PORTB = 0xF81
int retardo = 0;
int retardo2 = 0;
int enter = 0;

void main()
{
   set_tris_b(0x07);       //Entradas RB0, RB1, RB2
   //TRISB = 0x07;
   lcd_init();
   delay_ms(100);
   printf(lcd_putc,"\f");
   printf(lcd_putc," retardo1 = %d\n\rretardo2 = %d",retardo,retardo2);
   while(TRUE)
   {
      //lcd_gotoxy(0,0);
      //Aquí leo el valor del potenciómetro, para asignarlo al retardo
      //retardo = 0.00390625*read_adc()+6;
      //OUTPUT_B(0x80);
      bit_set(PORTB,7);
      delay_ms(1000);
      printf(lcd_putc,"\f");
      printf(lcd_putc,"Encendido");
      bit_clear(PORTB,7);
      delay_ms(1000);
      printf(lcd_putc,"\f");
      printf(lcd_putc,"\nApagado");
      //OUTPUT_B(0x00);
      if(input(PIN_B0)==1)
      {
         enter = 1;
         printf(lcd_putc,"\f");
         delay_ms(100);
         while(input(PIN_B0)==1)
         {
            delay_ms(20);
         }
         while(enter == 1)
         {

            if(input(PIN_B1)==1)
            {
               //Se pulsa DOWN
               delay_ms(100);
               if(retardo>0)
               {
                  retardo--;
               }
               printf(lcd_putc,"\f");
               //lcd_gotoxy(0,0);
               printf(lcd_putc," retardo1 = %d\n\rretardo2 = %d",retardo,retardo2);
               while(input(PIN_B1)==1)
               {
                  delay_ms(20);
               }
            }
            if(input(PIN_B2)==1)
            {
               //Se pulsa UP
               delay_ms(100);
               if(retardo<10)
               {
                  retardo++;
               }
               printf(lcd_putc,"\f");
               //lcd_gotoxy(0,0);
               printf(lcd_putc," retardo1 = %d\n\rretardo2 = %d",retardo,retardo2);
               while(input(PIN_B2)==1)
               {
                  delay_ms(20);
               }
            }
            if(input(PIN_B0)==1)
            {
               //Este es el pulsado de Enter para aceptar y salir del bucle
               delay_ms(100);
               enter=2;
               while(input(PIN_B0)==1)
               {
                  delay_ms(20);
               }
               while(enter == 2)
               {

                  if(input(PIN_B1)==1)
                  {
                     //Se pulsa DOWN
                     delay_ms(100);
                     if(retardo2>0)
                     {
                        retardo2--;
                     }
                     printf(lcd_putc,"\f");
                     //lcd_gotoxy(0,0);
                     printf(lcd_putc," retardo1 = %d\n\rretardo2 = %d",retardo,retardo2);
                     while(input(PIN_B1)==1)
                     {
                        delay_ms(20);
                     }
                  }
                  if(input(PIN_B2)==1)
                  {
                     //Se pulsa UP
                     delay_ms(100);
                     if(retardo2<10)
                     {
                        retardo2++;
                     }
                     printf(lcd_putc,"\f");
                     //lcd_gotoxy(0,0);
                     printf(lcd_putc," retardo1 = %d\n\rretardo2 = %d",retardo,retardo2);
                     while(input(PIN_B2)==1)
                     {
                        delay_ms(20);
                     }
                  }
                  if(input(PIN_B0)==1)
                  {
                     //Este es el pulsado de Enter para aceptar y salir del bucle
                     delay_ms(100);
                     enter=0;
                     while(input(PIN_B0)==1)
                     {
                        delay_ms(20);
                     }
                  }
               }
            }
         }
      }
      //TODO operar para que el retardo sea lineal entre 6 y 10 ms con el valor
      //recogido del adc.
      delay_ms(10);
      //set_adc_channel(0);
   }
}

La conexión física es la clásica (D4-D7 con el PORTD(4 a 7), después RD0 -> E, RD1 -> RS, RD2 -> RW.

Agradezco cualquier ayuda.
Saludos!

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re:Pic18f4520 con lcd 1602gd1622y en CCS
« Respuesta #1 en: 12 de Enero de 2016, 12:06:53 »
Hola a tod@s,
Me he vuelto a poner con el tema y sigo sin dar con la solución, a nadie le ha pasado esto?.
Lo que voy a hacer es adquirir otro display, porque no le veo sentido que funcione correctamente en proteus y no en un montaje en protoboard, tras haber revisado con multímetro la continuidad de todas las conexiones y que todo está bien puesto.
Agradezco cualquier ayuda.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pic18f4520 con lcd 1602gd1622y en CCS
« Respuesta #2 en: 12 de Enero de 2016, 13:46:25 »
Probaste poner un

lcd_gotoxy(1,0);

Creo que asi es para la siguiente linea.
Si ya asi no funciona seguro que tendra que ver con algo de la inicializacion. Y es hora de que hagan su propia libreria.


 

anything