TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: NoSepComo 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í).
#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!
-
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!
-
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.