Autor Tema: Pantalla LCD no funciona con PIC16F876  (Leído 1253 veces)

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

Desconectado fabianbambam

  • PIC10
  • *
  • Mensajes: 15
Pantalla LCD no funciona con PIC16F876
« en: 17 de Junio de 2016, 12:59:37 »
Este es un tema que vengo realizando desde hace dias sin respuesta pero es algo que me frustra ya.

Tengo una pantalla LCD 16x2 con dos integrados en la parte de atras, un HD4478A00 y un LC7390 y al cargar proyectos en el PIC, estos no los puedo visualizar en la LCD, la LCD se queda con todos los cuadros negros encendidos y creo que es culpa de la libreria que estoy manejando. He utilizado la libreria propia del CCS <lcd.c> y <flex_lcd.c> sin resultados positivos, si me pueden echar una mano se los agradecería muchisimo.

Declaré e hice las conexiones siguientes en la LCD al protoboard:
1.Vss
2.VCC
3.GND
4.RS - RB5
5.R/W - GND
6. ENABLE - RB7
11. D4 - RB0
12. D5 - RB1
13. D6 - RB2
14. D7 - RB4

adjunto fotos de la pantalla LCD y de un proyecto sólo de prueba en el que estoy probando el funcionamiento de la LCD
Código: [Seleccionar]
#include <16f876.h>
#fuses hs,nowdt,noprotect,nolvp
#use delay(clock=20M)

#include "flex_lcd.c"

void main()
{
   
   while(true)
   {  lcd_init();
      lcd_gotoxy(1,1);
      printf(lcd_putc,"   HOLA MUNDO   ");
      delay_ms(1000);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"   BIENVENIDOS  ");
      delay_ms(1000);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"ELECTRONICAFACIL");
      delay_ms(1000);
   }
}

Esta es la libreria flex_lcd.c que utilice por si es de utilidad:

Código: [Seleccionar]
// 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_B0
#define LCD_DB5   PIN_B1
#define LCD_DB6   PIN_B2
#define LCD_DB7   PIN_B4

#define LCD_RS    PIN_B5
#define LCD_RW    PIN_B6
#define LCD_E     PIN_B7

// 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[i]);
   
    // 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pantalla LCD no funciona con PIC16F876
« Respuesta #1 en: 18 de Junio de 2016, 16:17:54 »
Por favor intenta no repetir mensajes, va en contra de las reglas del foro, y hace imposible aportar una ayuda si es que alguien puede proveerte la misma.

Desconectado fabianbambam

  • PIC10
  • *
  • Mensajes: 15
Re:Pantalla LCD no funciona con PIC16F876
« Respuesta #2 en: 19 de Junio de 2016, 13:06:26 »
Disculpen  el SPAM, la solución está en este tema: http://www.todopic.com.ar/foros/index.php?topic=46434.0