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í).
#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!