Problemas con Display LCD en CCS

Ya he probado el código que me pasaste D@rkbytes, sólo que sigue sin mostrar nada mi LCD.
Ya chequé los pines de mi dsPIC y funcionan bien, ya que si tienen salida.
Lo que vi es que la LCD utiliza un controlador HD44780
Ya busqué en el foro acerca de este controlador y he encontrado algunos, pero cuando los pruebo me salen errores.
Estoy usando el puerto D para los datos y el F para E, RS y RW.

Esta es la librería que encontré.
C:
// Definición de Puertos Pantalla LCD 40x20 Hitachi 44780

#bit lcd_db4 = PORTD.4

#bit tris_lcd_db4 = TRISD.4

#bit lcd_db5 = PORTD.5

#bit tris_lcd_db5 = TRISD.5

#bit lcd_db6 = PORTD.6

#bit tris_lcd_db6 = TRISD.6

#bit lcd_db7 = PORTD.7

#bit tris_lcd_db7 = TRISD.7

#bit lcd_en = PORTD .0

#bit tris_lcd_en = TRISD.0

#bit lcd_rw = PORTD.2

#bit tris_lcd_rw = TRISD.2

#bit lcd_rs = PORTD.1

#bit tris_lcd_rs = TRISD.1



// lcd_init() Inicialización del LCD (debe utilizarse al principio,

// antes de trabajar con el LCD).

//

// lcd_putc(c) Imprime un caracter en el LCD.

//

// lcd_gotoxy(x,y) Selecciona la nueva posicion de escritura en el LCD.

// (la esquina superior izquierda es 1,1)

//

// lcd_getc(x,y) Devuelve el caracter de la posicion x,y del LCD.

//

// void lcd_erase_line(x) Borra una cantidad de caracter hacia la derecha


// Conexion a la pantalla LCD 40x4

// RB0 <---> LCD DB4

// RB1 <---> LCD DB5

// RB2 <---> LCD DB6

// RB3 <---> LCD DB7

// RA0 <---> LCD ENEABLE

// RA1 <---> LCD R/W

// RA2 <---> LCD RS

//


#define LCD_DATO 1

#define LCD_INST 0


#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea

#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea

#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea

#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea


#define chr_1 0x00

#define chr_2 0x01

#define chr_3 0x02

#define chr_4 0x03

#define chr_5 0x04

#define chr_6 0x05

#define chr_7 0x06


// 7 6 5 4 3 2 1 0

// Function Set 0b 0 0 1 B L F 0 0

// Bus size, B:0=4 bits, B:1=8 bits

// Line Number, L:0=1 Line, L:1=2 Lines

// Font size F:0=5x8, F:1=5x10

#define LCD_FUNCTION_SET 0b00101000 // Bus=4bit, Line=2 & Font=5x8


// 7 6 5 4 3 2 1 0

// Display/Cursor 0b 0 0 0 0 1 D U B

// Set Display on/off, D:0=off, D:1=on

// Underline cursor, U:0=off, U:1=on

// Blinking cursor, B:0=off, B:1=on

#define LCD_DISPLAY_CURSOR 0b00001100 // Display=on, Scroll=off, Blinkin=off


// 7 6 5 4 3 2 1 0

// Entry Mode 0b 0 0 0 0 0 1 M S

// Cursor direction, M:0=left, 1=right

// Display Scroll, S:0=no scroll, S:1=scroll

#define LCD_ENTRY_MODE 0b00000110 // Increment cursor, no disp shift


void lcd_set_write() {

tris_lcd_db4 = 0; //

tris_lcd_db5 = 0; //

tris_lcd_db6 = 0; //

tris_lcd_db7 = 0; //---> Set portb RB0-RB3 mode output

}


void lcd_set_read() {

tris_lcd_db4 = 1; //

tris_lcd_db5 = 1; //

tris_lcd_db6 = 1; //

tris_lcd_db7 = 1; //---> Set portb RB0-RB3 mode input

}


int8 lcd_read() {

int8 valor=0; // Crea e inicializa una variable de 8 Bits

lcd_set_read(); // Prepara el puerto DB4-DB7 como entrada

lcd_rw = 1; // Habilita modo de lectura

delay_cycles(1); // nop

lcd_en = 1; // Habilita LCD Enable

delay_cycles(1); // nop

if (lcd_db4) // Lectura de DB4

bit_set(valor,4); //

if (lcd_db5) // Lectura de DB5

bit_set(valor,5); //

if (lcd_db6) // Lectura de DB6

bit_set(valor,6); //

if (lcd_db7) // Lectura de DB7

bit_set(valor,7); //---> Recoge los datos MSB

lcd_en = 0; // Deshabilita LCD Enable

delay_cycles(1); // nop

lcd_en = 1; // Habilita LCD Enable

delay_us(2); // Espera 2 uSeg.

if (lcd_db4) //

bit_set(valor,0); //

if (lcd_db5) //

bit_set(valor,1); //

if (lcd_db6) //

bit_set(valor,2); //

if (lcd_db7) //

bit_set(valor,3); //---> Recoge los datos LSB

lcd_en = 0; // Deshabilita LCD Enable

delay_cycles(1); // nop

lcd_set_write(); // Prepara el puerto DB4-DB7 como salida

return (valor);

}


void lcd_send_nibble(int8 n) {

if (bit_test(n,0)) //

lcd_db4 = 1; //

else //

lcd_db4 = 0; //


if (bit_test(n,1)) //

lcd_db5 = 1; //

else //

lcd_db5 = 0; //


if (bit_test(n,2)) //

lcd_db6 = 1; //

else //

lcd_db6 = 0; //


if (bit_test(n,3)) //

lcd_db7 = 1; //

else //

lcd_db7 = 0; //---> Set data nibble

delay_cycles(1); // nop

lcd_en = 1; // Habilita LCD Eneable __

delay_us(2); // Espera 2 uSeg. | |

lcd_en = 0; // Desabilita LCD Eneable __| |__

}


void lcd_send_byte (int1 select, int8 n) {

lcd_rs = 0; // Modo de instruccion

while (bit_test(lcd_read(),7)); // Espera que la pantalla se desabilite

lcd_rs = select; // Escoje entre RS=0 : Instruccion & RS=1 : Data

delay_cycles(1); // nop

lcd_rw = 0; // Habilita modo de escritura

delay_cycles(1); // nop

lcd_en = 0; // Desabilita LCD Eneable

lcd_send_nibble(n >> 4); // Envia los datos superiores MSB

lcd_send_nibble(n); // Envia los datos inferiores LSB

}



// Opcional por si quieres crear caracteres especiales, puedes crear hasta 8

void lcd_cgram() {

int8 i;

const int8 chr[56] = {0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x15, // chr_1

0x15,0x00,0x10,0x10,0x10,0x10,0x00,0x15, // chr_2

0x15,0x00,0x14,0x14,0x14,0x14,0x00,0x15, // chr_3

0x15,0x00,0x15,0x15,0x15,0x15,0x00,0x15, // chr_4

0x00,0x00,0x00,0x00,0x1F,0x0E,0x04,0x00, // chr_5

0x00,0x04,0x0E,0x1F,0x04,0x04,0x04,0x00, // chr_6

0x00,0x04,0x04,0x04,0x1F,0x0E,0x04,0x00}; // chr_7


lcd_send_byte(LCD_INST, 0x40);

for(i=0;i<=55;++i) {

lcd_send_byte(LCD_DATO, chr);

}

lcd_send_byte(LCD_INST,0x01); // Clear LCD

}


void lcd_init() {

int8 i, count=0;

lcd_set_write(); // Prepara el puerto DB4-DB7 como salida

tris_lcd_en = 0; //

tris_lcd_rw = 0; //

tris_lcd_rs = 0; //---> Set porta RA0, RA1 & RA2 mode output

lcd_en = 0; //

lcd_rw = 0; //

lcd_rs = 0; //---> Clear LCD_EN, LCD_RW & LCD_RS

delay_ms(25);

retry:

for(i=1; i<=3; ++i) {

lcd_send_nibble(0b0011); // 8 bit mode 3 times

delay_ms(5);

}

lcd_send_nibble(0b0010); // 4 bit mode

while (bit_test(lcd_read(),7)) { // Espera que la pantalla se desabilite

delay_us(100);

count++;

if (count>=200) {

count=0;

goto retry;

}

}

lcd_send_byte(LCD_INST, LCD_FUNCTION_SET); // Function Set

lcd_send_byte(LCD_INST, LCD_DISPLAY_CURSOR); // Display Cursor

lcd_send_byte(LCD_INST, LCD_ENTRY_MODE); // Entry Mode

}


void lcd_gotoxy(int8 x, int8 y) {

int8 const address[4]={LCD_LINEA1,LCD_LINEA2,LCD_LINEA3,LCD_LINEA4};

int8 pos;

pos=address[y-1]+(x-1);

lcd_send_byte (LCD_INST, pos);

}


char lcd_getc(int8 x, int8 y) {

char valor;

lcd_gotoxy(x,y);

lcd_rs = 1;

valor = lcd_read();

lcd_rs = 0;

return (valor);

}


/*void lcd_putc(char c) {

lcd_send_byte(LCD_DATO,c);

}*/


void lcd_putc( char c) {

   switch (c) {

     case "f"   : lcd_send_byte(0,1);

                   delay_ms(2);

                                           break;

     case "

"   : lcd_gotoxy(1,2);        break;

     case ""   : lcd_send_byte(0,0x10);  break;

     default     : lcd_send_byte(LCD_DATO,c);     break;

   }

}


void lcd_clear() {

lcd_send_byte(LCD_INST,0x01);

}


void lcd_home() {

lcd_send_byte(LCD_INST,0x02);

}


void lcd_erase_line(int8 x) {

int8 i;

for(i=1;i<=x;++i) {

lcd_send_byte(LCD_DATO,32);

}

}
 
Última edición por un moderador:
Lo que vi es que la LCD utiliza un controlador HD44780
La mayoría de pantallas genéricas usan clones del chip de Hitachi HD44780 y también la mayoría de librerías usan las instrucciones para ese chip.
Lo que no has mostrado es el esquema de cómo estás conectando la pantalla.
Ya busqué en el foro acerca de este controlador y he encontrado algunos, pero cuando los pruebo me salen errores.
¿Qué errores te muestra el compilador?
 
Captura.PNG


me manda estos errores cuando lo compilo en mi programa. es que el kbd4.c del archivo no lo tengo. yo tengo el kbd4x4.c e intente cambiarlo pero me sale eso.

*** Error 12 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 46(15,20): Undefined identifier PIN_E0
*** Error 51 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 48(4,8): A numeric expression must appear here
*** Error 28 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 57(17,20): Expecting an identifier ALL_ROWS
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 57(29,30): Expecting a declaration
*** Error 48 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 64(4,9): Expecting a (
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 64(10,14): Expecting a declaration
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 64(14,15): Expecting a declaration
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 65(4,6): Expecting a declaration
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 65(6,7): Expecting a declaration
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 65(7,9): Expecting a declaration
*** Error 48 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 65(9,23): Expecting a (
*** Error 43 "C:\Program Files (x86)\PICC\Drivers\kbd4.c" Line 65(24,44): Expecting a declaration
 
es que el kbd4.c del archivo no lo tengo.
Esa librería viene por defecto con PIC C Compiler.
Los errores se deben a la configuración de pines en la librería y se tienen que cambiar por los que usas en el microcontrolador.
Que por cierto, no los muestras en el esquema que subiste.
Eso es importante y debes verificar si los pines que usas son Digital I/O
 
Hola, tengo un problema, en la simulación el LCD muestra todo!!!! pero cuando lo implemento en la protoboard nada!!!!
adjunto el diagrama y el codigo en CCS.
1527686414079.png1527686441540.png
ALGUNA SOLUCION? GRACIAS!!
Posdata: ya revise las paginas anteriores del foro y no he podido solucionar el problema
 
El pin de VEE de la pantalla no debe ir a tierra completamente o se verán cuadros negros.
Debes colocar en serie un potenciómetro (Preset) de unos 5 KOhms.

Nota: Es preferible que subas tu proyecto dentro de un archivo comprimido.
 
Hola amigos,pues eso,que me he cansado de hacer el circuito para mostrar una frase en LCD y no me funciona con el pic 16f648A,ni otro con el pic 16F84A.He comprado un pic 16F877A y me ha funcionado a la primera un esquema de la web de ELECTROALL.Voy a intentar subir el esquema y el código para que me digáis en que he fallado,o si el códifo está mal.


// Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) en la primera linea la
// frase 'hola mundo ;)' y en la segunda linea 'VsZeNeR'05'. Para ahorrar un
// pin conectamos RW a tierra(GND) y en nuestro programa generamos un retraso de
// 2ms para poder apreciarse todos los caracteres. La ventaja es que nos ahorramos
// 1 pin pero la desventaja es menor rapidez ya que empaquetamos en bloques de 4 bit.
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
//
// Conexiones: B0 -> E
// B1 -> RS
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd

///PROGRAMA
void main(void)
{
lcd_init(); //inicializa lcd
delay_ms(2); //retardo para apreciarse todos los caracteres
printf(lcd_putc,"hola mundo ;)\nVsZeNeR'05"); //muestra por pantalla el mensaje
}


Este es el código.

Denunciar
Mensaje automáticamente combinado:

Aquí subo el esquema en rar.
 

Adjuntos

  • frases en LCD.rar
    11.1 KB · Visitas: 9
La librería nativa lcd.c de CCS, no es apta para funcionar sin el pin RW.
Para que lo compruebes, conecta físicamente el pin RW de la pantalla al pin RB2 del PIC16F648A y verás que debe funcionar.
Para omitir el pin RW usa la librería flex_lcd.c
 
Atrás
Arriba