Problemas con Display LCD en CCS

hola, gracias por responder aquí te dejo el archivo adjunto :D
 

Adjuntos

  • 16f628a Display.rar
    33 KB · Visitas: 43
Prueba cambiando estas partes de la cabecera en tu programa por esto...
#use delay (internal = 4000000)
#define use_portb_lcd true
#include <lcd.c>

Suerte.
 
Prueba cambiando estas partes de la cabecera en tu programa por esto...
#use delay (internal = 4000000)
#define use_portb_lcd true
#include <lcd.c>

Suerte.

D@rkbytes problema solucionado, al parecer la librería CCS de la versión inferior a 4 causa problemas, la librería que te adjunte venia en una nueva versión de CCS la cual no había probado además me reconoció sin problemas la instrucción #use delay (internal = 4000000)

Gracias :D
 
Tengo una duda respecto a lo desarrollado en este tema, por ahí nombran la librería "flex_lcd.c", estaban hablando de la "lcd.c" de esta última sé que tiene algunas limitaciones, no se puede elegir libremente la asignación de los pines del micro con las líneas del LCD, si o si deben ir todas las líneas a un mísmo puerto, además las líneas datos 4 bit's, deben ser los bits más significativo del puerto.
Será que en "flex_lcd.c" esta limitación, no existe, y que tambien podría emplear pines de diversos puertos para conectar con el LCD, ¿es asi?, alguien me aclara...
 
Si se pueden modificar en la librería los pines de control y los de datos.
Léela un poco y verás que existen comentarios en ella mencionando lo que se tiene que hacer.

Personalmente yo la he modificado para usar la pantalla por el puerto A y con los pines que yo elija.

Y si, los pines que se usan en configuración de 4 Bits, son los bits más significativos del puerto,
pero también se puede usar por ejemplo RA3, RA2, RA1 y RA0 cómo el bus de datos de 4 Bits.

Saludos.
 
Última edición:
Hola buen dia a todos, como verán acá vuelvo con otro problema con mis queridos pics :cry:

Esta vez me toco con un pic 16f877a, aclaro que el pic funciona joya, siempre y cuando sea una rutina normal ej prender leds ..., ahora el problema es cuando quiero utilizar un Display de 16x2, declaro todo para el manejo del display.

#include <lcd.c>

#define LCD_DATA_PORT getenv("SFR:pORTD")

#define LCD_ENABLE_PIN PIN_D0 ////
#define LCD_RS_PIN PIN_D1 ////
#define LCD_RW_PIN PIN_D2 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7

Compila, todo bien, en proteus aclaro que anda, pero al grabar el PIC y querer hacerlo andar, ahí ni siquiera arranca. El display anda porque lo probé con un 16f84a, asi que de a poco fui borrando lineas para ver que onda, y me encontré que al compilar alguna instrucción de la librería del LCD el PIC no arrancaba ej:

void main()
{
lcd_gotoxy(1,1);
printf(lcd_putc,"hola");

while(true)
{
output_low(LED);
delay_ms(DELAY);
output_high(LED);
delay_ms(DELAY);
}

}

si pongo eso en el programa no arranca directamente, pero si borro las lineas que utilizan el lcd " lcd_gotoxy(1,1); printf(lcd_putc,"hola"); ", el pic arranca y hace parpadear el led :confused::confused:

El compilador que uso es el CCS " pic c compiler v4.130" y para grabar tengo un pickit2 clone.

Espero que alguien me pueda dar una mano con esto, mañana voy a seguir probando hasta que ande .... muchas gracias, Saludos a todos :).
 

Adjuntos

  • libreria LCD.txt
    13.9 KB · Visitas: 28
Hola buen dia a todos, como verán acá vuelvo con otro problema con mis queridos pics :cry:

Esta vez me toco con un pic 16f877a, aclaro que el pic funciona joya, siempre y cuando sea una rutina normal ej prender leds ..., ahora el problema es cuando quiero utilizar un Display de 16x2, declaro todo para el manejo del display.
Te falta inicializar la pantalla.
Tampoco es necesario que declares el puerto D y los pines para la pantalla.
Esa configuración es la que usa por defecto el compilador para el 16F877A
En el código tampoco se ven los fuses, el periodo para DELAY, ni que pin escogiste para el LED.

Quizás obviaste esos detalles al subir tu programa, y sólo por probar tu librería compilé tu programa, pero simplificado.

Le cambié el nombre al archivo que subiste por lcd_prueba.c y lo coloqué dentro de la carpeta del proyecto.
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)

#include "[B]lcd_prueba.c[/B]" // [B]Librería bajo prueba[/B]

#define LED PIN_B7
#define DELAY 500

void main()
{
   lcd_init();
      lcd_putc("\fhola");

   while(true)
   {
      output_toggle(LED);
         delay_ms(DELAY);
      }
   }
Y físicamente funciona todo sin ningún problema.
Agrega la instrucción lcd_init(); en el main del código para que funcione tu programa.

Suerte.
 
Te falta inicializar la pantalla.
Tampoco es necesario que declares el puerto D y los pines para la pantalla.
Esa configuración es la que usa por defecto el compilador para el 16F877A
En el código tampoco se ven los fuses, el periodo para DELAY, ni que pin escogiste para el LED.

Quizás obviaste esos detalles al subir tu programa, y sólo por probar tu librería compilé tu programa, pero simplificado.

Le cambié el nombre al archivo que subiste por lcd_prueba.c y lo coloqué dentro de la carpeta del proyecto.
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)

#include "[B]lcd_prueba.c[/B]" // [B]Librería bajo prueba[/B]

#define LED PIN_B7
#define DELAY 500

void main()
{
   lcd_init();
      lcd_putc("\fhola");

   while(true)
   {
      output_toggle(LED);
         delay_ms(DELAY);
      }
   }
Y físicamente funciona todo sin ningún problema.
Agrega la instrucción lcd_init(); en el main del código para que funcione tu programa.

Suerte.

Hola buen dia D@rkbytes, gracias por contestar, ahi compiler el codigo que me pasaste y solo le fataba arriba de #include <lcd.c> esta linea " #define use_portD_lcd_TRUE " sino me tiraba error, lei por ahi y faltaba esa declaracion, lo programe y salio andando ... igual raro ayer estaba todo y no funcionaba jaja, medio raro pero bue ...
Dejo el codigo de como esta funcionando ahora:

-------------main.c--------------------------------------------------------------------

PHP:
#include <main.h>

#define use_portD_lcd_TRUE
#include <lcd.c> // Librería bajo prueba


void main()
{

      lcd_init();
      lcd_gotoxy(1,1);
      printf(lcd_putc,"hola");

   while(true)
   {
      output_toggle(pin_b1);
         delay_ms(200);
      }
   }

------------------------main.h--------------------------------------------------
PHP:
#include <16F877A.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=4000000)

Muchas gracias a todos, Saludos.
 
Última edición por un moderador:
Hola estoy haciendo un programita en el cual quiero grabar unas cadenas en variables y luego estas variables sacarlas por la pantalla de LCD pero no puedo lograrlo. Estoy usando CCS

esto es lo que estoy haciendo y no funciona:

unsigned char cadena;

cadena="Texto LCD";

printf(LCD_PUTC, "%s",cadena);
 
aver aver aver

deja me desenpolvo en C

tu programa deberia ser asi:

char cadena[10]="un perro"; // darle una longitud a la cadena

printf(lcd_putc,"%s",cadena); //hacer uso de lcd e imprimir la cadena


te explicare como hacer uso del PRINTF en CCS

PRINTF


el printf en CCS esta dado del siguiete modo

printf(funcion con char,"cadena con formato");

donde en realidad lo que hace este formato es meter el formato dentro de una funcion que escribe caracter por caracter.

en este caso la funcion sera: lcd_putc();
lo que hace esta funcion es imprimir solo 1 caracter
¿que es lo que hace el printf?
solo da formato a la cadena y caracter a caracter lo envia a la funcion lcd_putc()

¿como darle formato a una cadena entera?
usando SPRINTF como su nombre lo indica es un string printf, lo que hace a diferencia del printf es que da formato a una cadena entera y no caracter a caracter

¿como la uso?
debo declarar una cadena de caracteres y el sprintf lo que hace es darle formato a mi cadena pero no la imprime en la pantalla por que no estoy mandando llamar lcd_putc();

ejemplo:

char cadena[20];
int numero=10;

sprintf(cadena,"Trilobyte = %d",numero);

ahora la cadena de caracteres contiene todo el formato que seria
Trilobyte =10

y si queremos imprimirla en una LCD usariamos el printf con su funcion lcd_putc

quedaria asi:

printf(lcd_putc,"%s",cadena);
ahora lo que veriamos en la LCD seria :Trilobyte =10

¿por que saber esto? :eek:

por que muchos se confunden y creen que el printf sirve para imprimir en la LCD o en el UART
pero en realidad NO en realidad imprimen una cadena con formato o una serie de caracteres con formato.

que se mande llamar una funcion dentro del printf es diferente.

bueno esto es util cuando no usamos CCS y queremos usar la LCD en otro compilador de otro microcontrolador ;)
 
Gracias por tu respuesta, pero me pareces que me falto explicar una cosa o no lo explique bien.
Esto es lo que tengo yo:

Código:
void escLCDProg(pos){
char texto[5];

texto[1]="1-texto1";
texto[2]="2-texto2";
texto[3]="3-texto3";
texto[4]="4-texto4";


             lcd_init();
             lcd_gotoxy(1,1);         //Visualiza en el lcd
             lcd_putc("\f");
             printf(LCD_PUTC, "%s", texto[pos]);
             
   
}

Es decir, dependiendo del valor de "pos" que imprima el texto correspondiente en el LCD
 
Código:
printf(LCD_PUTC, "%s", texto[pos]);
LCD_PUTC va en minusculas



Adjunto un mini codigo y circuito com sample

Código:
#include <16F877A.h> 
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOPUT,NODEBUG,NOBROWNOUT,NOCPD,NOWRT 
#use delay(clock=20000000) 
 
#include <LCD.C> 
 
#byte TRISA = 0x85 
#byte PORTA = 0x05 
#byte TRISB = 0x86 
#byte PORTB = 0x06 
 
INT FLAG=0, MEN=0x01, FLAG1=0; 
 
void presentacion() 
{ 
  printf(lcd_putc,"\f CLASE ROBOTICA"); 
  printf(lcd_putc,"\n SEXTO  CONTROL"); 
} 
 
void menu() 
{ 
    switch(MEN) 
    { 
        case 0x01:           //1234567890123456 
            printf(lcd_putc,"\f      MENU      "); 
            printf(lcd_putc,"\n%c   1 LED D4    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00001000; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x02:           //1234567890123456 
            printf(lcd_putc,"\f    1 LED D4   "); 
            printf(lcd_putc,"\n%c   2 LED D3    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000100; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x03:           //1234567890123456 
            printf(lcd_putc,"\f    2 LED D3   "); 
            printf(lcd_putc,"\n%c   3 LED D2    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000010; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
        case 0x04:           //1234567890123456 
            printf(lcd_putc,"\f    3 LED D2   "); 
            printf(lcd_putc,"\n%c   4 LED D1    ",0x7E); 
            if (FLAG1==2) 
            { 
                PORTB=0b00000001; 
                FLAG1=0; 
            } 
            else FLAG1=1; 
      break; 
    }     
} 
 
void teclado(void) 
{ 
  switch((PORTA & 0x3C)) 
  { 
    case 0x20: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          if (FLAG1==1) FLAG1=2; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x10: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          if (MEN<5) MEN++; 
          else MEN=0x04; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x08: 
      if (FLAG==1)  
      { 
          FLAG=0; 
          if (MEN<5) MEN--; 
          else MEN=0x01; 
          menu(); 
      } 
      else FLAG=1; 
      break; 
    case 0x04: 
      if (FLAG==1) 
      { 
          FLAG=0; 
          presentacion(); 
          PORTB=0b00000000; 
      } 
      else FLAG=1; 
      break; 
  } 
  if (FLAG==1) delay_ms(500); 
} 
 
void main(void) 
{ 
  lcd_init(); 
  TRISA = 0b00111100; 
  TRISB = 0x00; 
  PORTB = 0b00000000; 
  presentacion(); 
  WHILE(TRUE) 
  { 
      teclado(); 
    } 
}
4AAA=
 

Adjuntos

  • CTO_LCD.BMP
    79.9 KB · Visitas: 14
Última edición:
hola companeros
tengo problemas con un lcd 20x4 para controlarlo con un pic16f877A, lo que sucede es lo siguiente
el programa lo compilo con el CCS compiler y lo simulo con proteus hasta este punto se simula y se compila bien, pero cuando lo graba al pic y lo conecto en el protoboard no me muestra ningun mensaje solo se ven las lineas 1 y 3 todos los caracteres en negro.
para grabar el pic utilizo el master-prog+ (hasta ahora no me habia dado fallas)
adjunto la simulacion y el codigo



aqui estas los archivos:D
 

Adjuntos

  • display.txt
    9.1 KB · Visitas: 28
  • pic16f877a.jpg
    pic16f877a.jpg
    9.9 KB · Visitas: 21
  • lcd40x4.jpg
    lcd40x4.jpg
    114.4 KB · Visitas: 33
Última edición:
el controlador no se si afecte el lcd que utilzo es un AZ DISPLAYS modelo ACM2004D tambien probe un lcd AMPIRE modelo 204A-QW e hizo lo mismo, d aqui me salio otra duda si afecta que lo estoy manejando a 4bitsn adjuto los datos de lcd que manejo
el pic lo conecto como en la imagen del post 93 y el lcd esta configurado en el puerto D tal como esta en la simulacion con proteus

este es el datasheet del lcd
 

Adjuntos

  • DISPLAY_acm2004d.pdf
    787.9 KB · Visitas: 11
El controlador no sé si afecte el lcd que utilizo, es un AZ DISPLAYS modelo ACM2004D
También probé un lcd AMPIRE modelo 204A-QW e hizo lo mismo
La pantalla que estás usando, según la hoja de datos usa el controlador ST7066U-0A y el fabricante del controlador dice que es pin por pin compatible con el HD44780, el KS0066 y el SED1278.
Así que debe tener compatibilidad para trabajar con las librerías 4x20 que existen.

No tengo pantallas de ese tipo para hacer una prueba, pero mira si este ejemplo que adjunto con la librería LCD420.C de CCS modificada para trabajar con el puerto D, te funciona.
Esta librería se tiene que modificar directamente porque viene definida para usar el puerto B por defecto.

Nota que cambia la disposición de los pines de control. Espero te funcione.

Suerte.
 

Adjuntos

  • 16F877A LCD 20x4 SCH.jpg
    16F877A LCD 20x4 SCH.jpg
    99.8 KB · Visitas: 113
  • 16F877A LCD 20x4.rar
    39.1 KB · Visitas: 252
Hola a todos,tengo un problema al simular en proteus , no me muestra ningún carácter que envió en la pantalla lcd 2x16 cuando trabajo con el pic 18f2550 ,pero con otros micros como el 16f877a si se muestra los caracteres que envío .
No se cual sera el problema .

#include <18f2550.h>
#fuses HSPLL,NOWDT,NOMCLR
#use delay (clock=48000000)
#define use_portb_lcd TRUE
#include <lcd.c>


void main()
{
lcd_init();
setup_adc_ports(AN0_ANALOG );//pines digitales
while(true)
{lcd_gotoxy(1,1);
printf(lcd_putc,"PIC18F2550");


}
}
 

Adjuntos

  • l.jpg
    l.jpg
    102.5 KB · Visitas: 16
Hola a todos,tengo un problema al simular en proteus , no me muestra ningún carácter que envió en la pantalla lcd 2x16 cuando trabajo con el pic 18f2550 ,pero con otros micros como el 16f877a si se muestra los caracteres que envío .
No se cual sera el problema .

#include <18f2550.h>
#fuses HSPLL,NOWDT,NOMCLR
#use delay (clock=48000000)
Debes tener un problema con la palabra de configuración.
¿Estás usando directamente un cristal de 48MHz, u otro?

Como comentario, si únicamente quieres realizar una prueba de escritura, no lo hagas dentro del bucle while.
Puedes empezar a escribir "PIC18F2550" después de lcd_init(); y en el bucle while hacer parpadear un LED a un tiempo conocido para que te des cuenta si el PIC está trabajando a la frecuencia correcta.

Por ejemplo, así:

void main ()
{
lcd_init ();
lcd_putc ("\fPIC18F2550");

while (true)
{
output_toggle (pin_xx);
delay_ms (500);
}
}
 
yo tuve el mismo problema hace años
prueba estas lineas de codigo

#use delay(clock=48M)
#fuses XT,NOWDT,PLL5
#define LCD_DATA_PORT getenv("SFR:pORTB")
#include <lcd.c>
 
Hola D@rkbytes ,bueno la programación anterior ya me salio ahorra si me aparece los caracteres que envió ,recién estoy trabajando con el pic18f2550 y estaba pasándo algunos ejemplos que había hecho con el pic16.
Bueno cambie el cristal a 20Mhz ya que cuando estaba a 48Mhz no aperecía una letra ("P C18F2550"),pero ahorra para probar con retardos como dices D@rkbytes,cuando quiero hacer un contador de cada un segundo con lcd se demora y hasta también cuando quiero parpadear un led se demora como 3s en vez que sea 1s.:confused::confused: l
 
Última edición:
Atrás
Arriba