Autor Tema: Cuadros negros segunda linea LCD  (Leído 1784 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Zai_Z

  • PIC10
  • *
  • Mensajes: 4
Cuadros negros segunda linea LCD
« en: 09 de Agosto de 2014, 03:06:30 »
Hola! Que tal!?   :lol:
 ¿Me podrían ayudar a resolver la falla de mi programa por favor?
Es un programa simple, un hola mundo pero por los puertos A y C de un PIC2550 en CCS.
Lo que hace es que aparecen y desaparecen los cuadros de la LCD por el delay, pero no el hola mundo.
Alguien tiene una sugerencia?

Uso flex_lcd.c
Lo único que modifiqué aquí son los puertos C y A.

Aquí el código:


--------------MAIN-----------------------------------------
--------------------------------------------------------------

#include <18f2550.h>
#DEVICE ADC=8 
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=48000000)

#define use_portc_lcd TRUE
//#include <lcd.c>
#include <flex_lcd.c>



void main ()
{
lcd_init();
//!set_tris_C(0x00);
//!set_tris_A(0x00);
//!
//!output_high(PIN_C7);
//!delay_ms(500);
//!output_low(PIN_C7);
//!delay_ms(500);
//!output_high(PIN_C7);
//!delay_ms(500);
//!output_low(PIN_C7);


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   //setup_psp (PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_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);
   
printf(LCD_PUTC, "\f");

while (1)

{
lcd_gotoxy(1,1);
delay_ms(700);
printf(LCD_PUTC,"HOLA MUNDO");
delay_ms(700);
printf(LCD_PUTC, "\f");
           
}

}


----------------------FLEX_LCD-----------------------------
--------------------------------------------------------------
// flex_lcd.c
 
 // These pins are for the Microchip PicDem2-Plus board,
 // which is what I used to test the driver.  Change these
 // pins to fit your own board.
 
 #define LCD_DB4   PIN_C0
 #define LCD_DB5   PIN_C1
 #define LCD_DB6   PIN_C2
 #define LCD_DB7   PIN_C4
 
 #define LCD_E     PIN_A1
 #define LCD_RS    PIN_A0
 #define LCD_RW    PIN_A2
 
 // If you only want a 6-pin interface to your LCD, then
 // connect the R/W pin on the LCD to ground, and comment
 // out the following line.
 
// #define USE_LCD_RW   1     
 
 //========================================
 
 #define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
 #define lcd_line_two 0x40 // LCD RAM address for the 2nd line
 
 
 int8 const LCD_INIT_STRING[4] =
 {
  0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
  0xc,                    // Display on
  1,                      // Clear display
  6                       // Increment cursor
  };
                               
 
 //-------------------------------------
 void lcd_send_nibble(int8 nibble)
 {
 // Note:  !! converts an integer expression
 // to a boolean (1 or 0).
  output_bit(LCD_DB4, !!(nibble & 1));
  output_bit(LCD_DB5, !!(nibble & 2)); 
  output_bit(LCD_DB6, !!(nibble & 4));   
  output_bit(LCD_DB7, !!(nibble & 8));   
 
  delay_cycles(1);
  output_high(LCD_E);
  delay_us(2);
  output_low(LCD_E);
 }
 
 //-----------------------------------
 // This sub-routine is only called by lcd_read_byte().
 // It's not a stand-alone routine.  For example, the
 // R/W signal is set high by lcd_read_byte() before
 // this routine is called.     
 
 #ifdef USE_LCD_RW
 int8 lcd_read_nibble(void)
 {
 int8 retval;
 // Create bit variables so that we can easily set
 // individual bits in the retval variable.
 #bit retval_0 = retval.0
 #bit retval_1 = retval.1
 #bit retval_2 = retval.2
 #bit retval_3 = retval.3
 
 retval = 0;
     
 output_high(LCD_E);
 delay_cycles(1);
 
 retval_0 = input(LCD_DB4);
 retval_1 = input(LCD_DB5);
 retval_2 = input(LCD_DB6);
 retval_3 = input(LCD_DB7);
   
 output_low(LCD_E);
     
 return(retval);   
 }   
 #endif
 
 //---------------------------------------
 // Read a byte from the LCD and return it.
 
 #ifdef USE_LCD_RW
 int8 lcd_read_byte(void)
 {
 int8 low;
 int8 high;
 
 output_high(LCD_RW);
 delay_cycles(1);
 
 high = lcd_read_nibble();
 
 low = lcd_read_nibble();
 
 return( (high<<4) | low);
 }
 #endif
 
 //----------------------------------------
 // Send a byte to the LCD.
 void lcd_send_byte(int8 address, int8 n)
 {
 output_low(LCD_RS);
 
 #ifdef USE_LCD_RW
 while(bit_test(lcd_read_byte(),7)) ;
 #else
 delay_us(60); 
 #endif
 
 if(address)
    output_high(LCD_RS);
 else
    output_low(LCD_RS);
       
  delay_cycles(1);
 
 #ifdef USE_LCD_RW
 output_low(LCD_RW);
 delay_cycles(1);
 #endif
 
 output_low(LCD_E);
 
 lcd_send_nibble(n >> 4);
 lcd_send_nibble(n & 0xf);
 }
 
 //----------------------------
 void lcd_init(void)
 {
 int8 i;
 
 output_low(LCD_RS);
 
 #ifdef USE_LCD_RW
 output_low(LCD_RW);
 #endif
 
 output_low(LCD_E);
 
 delay_ms(15);
 
 for(i=0 ;i < 3; i++)
    {
     lcd_send_nibble(0x03);
     delay_ms(5);
    }
 
 lcd_send_nibble(0x02);
 
 for(i=0; i < sizeof(LCD_INIT_STRING); i++)
    {
     lcd_send_byte(0, LCD_INIT_STRING);
     
     // If the R/W signal is not used, then
     // the busy bit can't be polled.  One of
     // the init commands takes longer than
     // the hard-coded delay of 60 us, so in
     // that case, lets just do a 5 ms delay
     // after all four of them.
     #ifndef USE_LCD_RW
     delay_ms(5);
     #endif
    }
 
 }
 
 //----------------------------
 
 void lcd_gotoxy(int8 x, int8 y)
 {
 int8 address;
 
 if(y != 1)
    address = lcd_line_two;
 else
    address=0;
 
 address += x-1;
 lcd_send_byte(0, 0x80 | address);
 }
 
 //-----------------------------
 void lcd_putc(char c)
 {
  switch(c)
    {
     case '\f':
       lcd_send_byte(0,1);
       delay_ms(2);
       break;
     
     case '\n':
        lcd_gotoxy(1,2);
        break;
     
     case '\b':
        lcd_send_byte(0,0x10);
        break;
     
     default:
        lcd_send_byte(1,c);
        break;
    }
 }
 
 //------------------------------
 #ifdef USE_LCD_RW
 char lcd_getc(int8 x, int8 y)
 {
 char value;
 
 lcd_gotoxy(x,y);
 
 // Wait until busy flag is low.
 while(bit_test(lcd_read_byte(),7)); 
 
 output_high(LCD_RS);
 value = lcd_read_byte();
 output_low(lcd_RS);
 
 return(value);
 }
 #endif




Gracias de antemano!!  :)  :P  8)

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Cuadros negros segunda linea LCD
« Respuesta #1 en: 09 de Agosto de 2014, 07:50:28 »
hola compañero

como va eso...!

yo haria esto:

tu codigo en el main:

Citar
while (1)

{
lcd_gotoxy(1,1);
delay_ms(700);
printf(LCD_PUTC,"HOLA MUNDO");
delay_ms(700);
printf(LCD_PUTC, "\f");
            
}

}

y lo dejaria asi:

Citar
while (1)

{
printf(LCD_PUTC, "\f");                    //limpia pantalla
lcd_gotoxy(1,1);                             //situa cursor
delay_ms(700);                              //retardo si quieres ver el cursor
printf(LCD_PUTC,"HOLA MUNDO");  // mensaje
delay_ms(700);                             // retardo

}

}

recuerdo que la f a mi me daba errores y lo cambie por b

nos cuentas... los progresos

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Cuadros negros segunda linea LCD
« Respuesta #2 en: 09 de Agosto de 2014, 11:31:47 »
El Pin c4 sólo puede trabajar como entrada digital, prueba con el c6
un saludo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado Zai_Z

  • PIC10
  • *
  • Mensajes: 4
Re: Cuadros negros segunda linea LCD
« Respuesta #3 en: 09 de Agosto de 2014, 14:16:38 »
hola hola!
Ya he cambiado el código y la f pero aún salen cuadros en la segunda línea.
También he puesto #define use_porta_lcd TRUE y el portb pero tampoco ha funcionado así.

Cambié el puerto a C6 y nada.

Desconectado Zai_Z

  • PIC10
  • *
  • Mensajes: 4
Re: Cuadros negros segunda linea LCD
« Respuesta #4 en: 10 de Agosto de 2014, 14:07:10 »
Terminé cambiando de PIC al 4550, cambié los puertos al D pero seguía haciendo lo mismo, al final después de dolores de cabeza se me ocurrió poner un delay antes de inicializar la LCD, y así es como funcionó.  ¬¬    ¬¬    ¬¬
Puede que en el 2550 también necesite ese delay, pero así lo dejaré con este pic.

Les dejo el programa que me funcionó.

Código: [Seleccionar]
#include <18f4550.h>
#DEVICE ADC=8 
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay(clock=4000000)
#define use_portd_lcd TRUE
#include <lcd.c>



void main ()
{
set_tris_D(0x00);
set_tris_B(0x00);

delay_ms(700); //Retraso importante para que pueda inicializar la LCD
lcd_init();

while (1)

{
lcd_gotoxy(1,1);
printf(LCD_PUTC, "HOLA");
delay_ms(700);
lcd_gotoxy(1,2);
printf(LCD_PUTC, "MUNDO");
delay_ms(700);
}
}


 y les dejaría la imagen de las conexiones en PROTEUS pero soy nueva y no se como jeje
 alguien me dice?

Saludos!!

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 439
    • Mcu Tronics
Re: Cuadros negros segunda linea LCD
« Respuesta #5 en: 11 de Agosto de 2014, 12:06:23 »
Puedes usar el servicio de tinypic para subir tus imagenes:

http://es.tinypic.com/
Nunca se deja de aprender

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Cuadros negros segunda linea LCD
« Respuesta #6 en: 11 de Agosto de 2014, 12:11:35 »
Que cristal oscilador usas?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...