es necesario usar delay para mostrar en lcd 2 lineas

hola amigos, estoy leyendo un pote analogico por AN0 (PIC18F4520), y lo muestro en un display de 2 lineas en la variable tension. Mi problema es que si no uso:

delay_ms(500);

despues de la funcion:

printf(lcd_putc,"t=%lu v=%lu",tension .......

el lcd parapadea, osea muestra el dato y se manda a borrar y vuelve a mostrar el dato. Se puede eliminar el delay_ms(500) ? yo NO quiero usarlo por que en ese tiempo muerto necesito hacer otras cosas, ademas que me pone lerdo la visualizacion datos quiero que sea mas dinamica.
Ahi va el codigo completo, gracias.
Código:
-----------------------------------------------------------------------------------------
#include <18F4520.h>
#device adc=10    // Usa resolución de 10 bits
//#byte PORTB = 0X06
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#include<lcd.c> // libreria del LCD.
#use fast_io(b)

#byte   porta = 0xf80
   #byte   portb = 0xf81
   #byte   portc = 0xf82
   #byte   portd = 0xf83
   #byte   porte = 0xf84

unsigned int16 tension=0;
unsigned int16 valor;
void main()
{
   lcd_init(); //inicializa lcd
   setup_adc_ports(AN0);             //|VSS_VREF);
   setup_adc(ADC_CLOCK_DIV_32);//Tconv=64/48MHz=1.33us
   setup_adc(ADC_CLOCK_INTERNAL);
               // setup_adc(ADC_OFF|ADC_TAD_MUL_0);
  // setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
  // str_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
                                   //   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!

set_tris_c(0x00);
set_adc_channel(0);
delay_us(10);

while(1){
delay_us(10);
tension=read_adc();
delay_us(10);
valor=tension/127;
lcd_putc("\f TODO OK\n"); // Escribe en el lcd
printf(lcd_putc,"t=%lu v=%lu",tension, valor); //Escribo en la segunda fila del LCD.
 delay_ms(500);
 PORTc=0B11111111;
switch(valor){
case 0: PORTC=0B00000000;
         break;
case 1: PORTC=0B00000001;
       break;
case 2: PORTC=0B00000011;
       break;
case 3: PORTC=0B00000111;
       break;
case 4: PORTC=0B00001111;
       break;
case 5: PORTC=0B00011111;
       break;
case 6: PORTC=0B00111111;
       break;
case 7: PORTC=0B01111111;
       break;
case 8: PORTC=0B11111111;
       break;
}
}
}
 
Última edición por un moderador:
Buenas, parpadea porque estás mandando datos constantemente, lo que puedes hacer es meter todo el tema de escritura del lcd y la configuración de salida del puerto C en una interrupción de un timer así puedes programar cada cuanto quieres que refresque el dato y podrás verlo bien mientras haces otras cosas en el programa principal.

Un saludo.
 
Hola elchapafer, lo que te está sucediendo es debido a que estás borrando todo el tiempo la pantalla con la instrucción '\f'. Te recomiendo que en vez de eso, utilices la instrucción 'lcd_gotoxy(x,y)' con la que también puedes suprimir la instrucción '\n', de la siguente manera:

Código:
   .
   .
   lcd_gotoxy(1,1)           // Escribe a partir de la columna 1 en la línea 1.
   lcd_putc("TODO OK");      // Escribe en el lcd en la primera fila
   lcd_gotoxy(1,2)           // Escribe a partir de la columna 1 en la línea 2.
   printf(lcd_putc,"t=%lu v=%lu",tension, valor); //Escribo en la segunda fila del LCD.
   .
   .

La instrucción '\f' la puedes utilizar por ejemplo para hacer un borrado general de la pantalla cuando sea necesario, como por ejemplo al iniciar el programa antes del 'while()'

Código:
   lcd_putc("\f");     // Borro la pantalla.

Como ya te indicaron, también debes procurar que el código solo actualice la pantalla cuando haya algún cambio para mostrar.

Saludos!
 
Última edición:
Atrás
Arriba