Problemas con LCD 16X2

Trato de mover una LCD 16x2 backlight azul y me esta dando incovenientes, hace unos dias la probe con un programa y solo mostraba una linea mientras que en proteus mostraba las 2 lineas, y al dia siguiente no mostraba, verifique que recibiera los datos ,RS y E, antes habia tenido problemas con ella debido a que cuando habia una caida de tension se reiniciaba, probe con otra LCD de 20x2 backlight verde y el problema persiste, decidi verificar la tension de entrada del anodo VDD y llega 4.6V
 
No es el contraste, cambie la resistencia que lleva en V0 por un cable y se veían los cuadros negros pero de una linea, estoy consciente de que los pines de datos estan al reves ya que tengo la LCD al reves en el protoboard por cuestiones esteticas
 

Adjuntos

  • problema.png
    problema.png
    69.7 KB · Visitas: 23
No es el contraste, cambie la resistencia que lleva en V0 por un cable y se veían los cuadros negros pero de una linea, estoy consciente de que los pines de datos estan al reves ya que tengo la LCD al reves en el protoboard por cuestiones esteticas

Claro, eso es lo que hacen TODOS los LCD cuando NO RECIBEN DATOS COHERENTES.
Osea, si solo los alimentas y nada mas, hacen eso. Si los alimentas y mandas mal los datos también.
Si los pines están al revés tienes que darle la vuelta a todos los bytes que envíes.

Tu programa, tu conexionado o algo no van.

Offtopic
¿Estás poniendo diodos sin resistencia limitadora? Si es así romperás algo, el pin o el led
¿Estás usando resistencias pullup o pushdown externas? Ahorratelas y usa las internas que son gratis, esas resistencias las usas para los leds (con el valor adecuado)
 
Última edición:
Como dice "Scooter " todo es posible
Podrias poner el codigo?
Lo comento por el hecho de mandar por dos puertos el codigo
o figura que mandas al LCD
Asi como la configuracón de los puertos y el tipo de micro
Vaya que me lo quiero copiar para aprender ,hozù (es asì)
 
Última edición:
la solución está claro que la ha puesto scooter....con un solo pin cambiado ya no funciona el lcd y se ve una sola linea llena de cuadros, lo raro es que sabiendo que tienes muchos de ellos cambiados aún dudes de que está pasándote...saludos
 
Algunos LCDs baratos son más lentos que otros.
Si está todo bien conexionado pero sigue sin mostrar nada, repasa los delays, quizá tengas que aumentar alguno para dar tiempo al LCD a reaccionar.
 
Si se partio el vidrio, lo tienes perdido. Puede ser la goma conductora. Trata de limpiar bien con alcohol isopropilico, y evitar todo tipo de suciedad.
El desarme de ese tipo de LCD, tiende a tener problemas luego
 
Buenas a todos, tengo problemas con una lcd 16x2 wh1602L-ygb-st, no muestra los textos enviados por el pic, en los puertos del pic tengo conectados resistencias a gnd para evitar ruidos provocados por un relé; dichas resistencias inicialmente eran de 360Ω, y la lcd mostraba textos, aunque con errores, despues cambié esas resistencias por unas de 10kΩ y ya no mostró mas, solo la iluminacion y los pixeles de la lcd, ¿esto aqué se debe? consumo de corriente?, todo el circuito mide 180mA, o es que esta lcd consume mucha corriente, si tienen el datashet de esta lcd se los agradecería.
 
Yo seguiría el esquema oficial. Para hacer pruebas, desconecta todo lo demás y, para el relé, ponle protecciones adecuadas, pero en el propio relé. No creo que debas poner ninguna resistencia a GND en los puertos. En algunos casos se ponen a Vcc cuando usas la opción de colector abierto.
 
Aquí adjunto el esquema
Imagino que el relé lleva su dido volante y se excita con un transistor. Puedes subir esquema de lo que haces?
Te comento que le puse otro regulador 7805 solo para la lcd con un transistor de bypass y ahora muestra los textos, al parecer no resibía la suficiente corriente
 

Adjuntos

  • simulacion control de heladera.PDF
    21.6 KB · Visitas: 7
  • WhatsApp Image 2021-07-05 at 4.59.03 AM.jpeg
    WhatsApp Image 2021-07-05 at 4.59.03 AM.jpeg
    67.4 KB · Visitas: 7
Última edición:
Buenas a todos.
Les comento que la LCD en ocasiones muestra otro tipo de caracteres.
Al parecer es por la presencia de algún tipo de ruido eléctrico.

Intento controlar el motor de una heladera.
El código fuente es este:
C:
////////////////////////////////////////////////////////////////////////////////

//            CONTROLADOR PARA HELADERA                                       //

//  AUTOR: PABLO PARABA NUÑEZ                                                 //

//  FECHA: 12-JUN-2021                                                        //

////////////////////////////////////////////////////////////////////////////////

#include <16F877A.h>
#device adc=10  /*Configura el tamaño de retorno read_adc.
                  Por ejemplo, si usa un PIC con un A / D de 10 bits,
                  puede usar 8 o 10 para xx- 8 devolverá el byte más significativo,
                  10 devolverá la lectura A / D completa de 10 bits.*/

#fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,NOPROTECT
#use delay(clock = 20000000)


//DEFINO LOS PINES DE LA LCD
#define LCD_DATA_PORT getenv("SFR:pORTB")  //datos d4_d7
     #define LCD_RS_PIN      PIN_B1
     #define LCD_RW_PIN      PIN_B2
     #define LCD_ENABLE_PIN  PIN_B3

#include <lcd_16x4_selg.c>     //libreria de la lcd
#include <math.h>

#byte PORTA=5   //direccion portA(ver datashet)
#byte PORTB=6   //direccion portB(ver datashet)
#byte PORTD=8   //direccion portD(ver datashet)
#define motor  PORTD,0
#define on   1
#define off   0

const char grados[8]=   //dibuja un caracter
         {0b01100,
          0b10010,
          0b10010,
          0b01100,
          0b00000,
          0b00000,
          0b00000,
          0b00000
         };

float  vref=5.0;  //tension de referancia 5v
float res_fija= 10000.0 ; //resistenci auxiliar fija
float res_ntc_fija=10000.0;    //resistencia del sensor a 25º
float beta=3977.0;  // ganancia del sensor cuando la resistencia es infinita
float tension_in;
float res_ntc_actual;
float temperatura_k;
float temperatura_c;
int16 prom,muestras[10];
float set_point,histeresis;
int control_set;
char mensaje[]={"servicios electronicos y electricos        "}; //mensaje
char  asigna_sms[17]={""}; //asigna el mensaje a mostrar
int8 i,j,cont,col=16;
float v1;

 void lectura_analogica(x,y);
 void set_point_alcanzado();

void main()
{
    setup_adc_ports(ALL_ANALOG);     //sentencia del compilador para entrada de puertos analogicos(a0 y a7)ver tabla
    setup_adc(adc_clock_internal);   //habilita el módulo a / d
    set_tris_a(0b00000001); //configura el pin_a0 como entrada
    set_tris_b(0); //salidas
    set_tris_d(0); //salidas
    portd=0;  //salidas en bajo
    portb=0;
    lcd_init();
    CGRAM_x(1);             //para escribir caracteres
    for(j=0;j<=7 ;j++) lcd_send_byte(1,grados[j]); //envia los datos del caracter a la lcd
    lcd_gotoxy(4,1);
    lcd_putc("SELTRONIC");
    delay_ms(100);
    cont=0;

     while(cont<36)
    {
       for(i=0;i<16;i++)
       {
           asigna_sms=mensaje[i+cont];
       }

       lcd_gotoxy(1,2);
       printf(lcd_putc,"%s",asigna_sms);
       cont++;
       delay_ms(300);
    }

    lcd_putc('\f');
    set_point=0.0;
    control_set=off; //controla si alcazó el set_point
    histeresis=6.0;

    while(true) //bucle principal
    {    lectura_analogica(1,1); //lee e imprime
         if(temperatura_c<set_point)  set_point_alcanzado(); //si alcanzo el set point
    }
}

 void lectura_analogica(x,y)
 {    for(i=0;i<10;i++)
      {
         set_adc_channel(0);      //prepara el canal a ser leído
         muestras=read_adc();   //lee
         delay_ms(10);       
      }

      prom=muestras[0]+muestras[1]+muestras[2]+muestras[3]+muestras[4]+muestras[5]+muestras[6]+muestras[7]+muestras[8]+muestras[9];
      prom=prom/10;

      tension_in=(vref / 1024.0)*prom ;   //tension de entrada
       res_ntc_actual = res_fija / ((vref/tension_in)-1);
      temperatura_k = beta/(log(res_ntc_actual/res_ntc_fija)+(beta/298.0));
      temperatura_c=(temperatura_k-273.15);  //cnvierte a grados cel

      lcd_gotoxy(x,y);
      printf(lcd_putc,"Temp:%2.1f",temperatura_c); //imprime la temperatura actual
      CGRAM(1);
      lcd_putc("C");
      lcd_putc(" ");
      lcd_gotoxy(col,2);
      lcd_putc("Elmar Paraba ");
      col--;
      delay_ms(500);
      lcd_putc("             ");

      if(col==4)
      {
         col=16;
      lcd_gotoxy(4,2);
      lcd_putc("             ");
      }
 }   

 void set_point_alcanzado()
 {   
      while(histeresis>temperatura_c) //
      {
           bit_set(motor); //apaga  motor
           lectura_analogica(1,1); //muestra la temp
           lcd_gotoxy(1,2); //
           lcd_putc("off");
           delay_ms(250);
           lcd_gotoxy(1,2);
           lcd_putc("   ");
           delay_ms(250);

            if(temperatura_c>=histeresis)
            {
               lcd_putc('\f');  //borra la pantalla
            }
      }

      if(temperatura_c>histeresis)
      {    lectura_analogica(1,1); //muestra la temp
           bit_clear(motor); //prende  motor
           lcd_gotoxy(1,2); //
           lcd_putc("on");
           delay_ms(500);
      }
 }
 
Hola, buenas. Les deseo un excelente fin de año.
Tengo un problema, espero me puedan ayudar, colegas.
Tengo el PIC16F886 y de momento quiero poner la típica frase en el LCD de hola mundo pero no me arroja ninguna letra.
El código me compila sin error en MPLab XC8
Les dejo el diagrama y el programa, se los agradezco mucho.
C:
#include <xc.h>

// Configuración de bits fuse
#pragma config FOSC = INTRC_NOCLKOUT // Oscilador interno, CLKOUT desactivado
#pragma config WDTE = OFF       // Watchdog Timer Enable
#pragma config PWRTE = OFF      // Power-up Timer Enable
#pragma config MCLRE = ON       // MCLR Pin Function Select bit->MCLR/VPP pin function is MCLR
#pragma config CP = OFF         // Code Protection bit
#pragma config CPD = OFF        // Data Code Protection bit
#pragma config BOREN = ON       // Brown-out Reset Selection bits
#pragma config IESO = OFF       // Internal External Switchover bit
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable
#pragma config LVP = ON         // Low-Voltage Programming Enable

#define _XTAL_FREQ 8000000

#define LCD_RS PORTBbits.RB0
#define LCD_EN PORTBbits.RB1
#define LCD_D4 PORTBbits.RB2
#define LCD_D5 PORTBbits.RB3
#define LCD_D6 PORTBbits.RB4
#define LCD_D7 PORTBbits.RB5

void LCD_Init(void);
void LCD_SendByte(char byte);
void LCD_Clear(void);
void LCD_PutChar(char c);
void LCD_PutString(const char *str);

void main(void)
{ 
    OSCCON = 0x70;  // Configura el oscilador interno a 8MHz

    LCD_Init();
    LCD_PutString("Hola, Mundo");

    while (1)
    {
    }
}

void LCD_Init(void)
{
    __delay_ms(15);

    TRISB0 = 0;
    TRISB1 = 0;
    TRISB2 = 0;
    TRISB3 = 0;
    TRISB4 = 0;
    TRISB5 = 0;

    LCD_RS = 0;
    LCD_EN = 0;
    LCD_D4 = 1;
    LCD_D5 = 1;

    LCD_SendByte(0x03);
    __delay_ms(5);
    LCD_SendByte(0x03);
    __delay_ms(5);

    LCD_SendByte(0x03);
    __delay_ms(5);

    LCD_SendByte(0x02);
    __delay_ms(5);
    LCD_SendByte(0x28);
    __delay_ms(5);
    LCD_SendByte(0x0C);
    __delay_ms(5);
    LCD_SendByte(0x06);
    __delay_ms(5);

    LCD_Clear();
}

void LCD_SendByte(char byte)
{
    LCD_D7 = (byte & 0x80) >> 7;
    LCD_D6 = (byte & 0x40) >> 6;
    LCD_D5 = (byte & 0x20) >> 5;
    LCD_D4 = (byte & 0x10) >> 4;
    LCD_EN = 1;
    __delay_us(5);
    LCD_EN = 0;
    LCD_D7 = (byte & 0x08) >> 3;
    LCD_D6 = (byte & 0x04) >> 2;
    LCD_D5 = (byte & 0x02) >> 1;
    LCD_D4 = (byte & 0x01);
    LCD_EN = 1;
    __delay_us(5);
    LCD_EN = 0;
    __delay_us(5);
}

void LCD_PutChar(char c)
{
    LCD_RS = 1;
    LCD_SendByte(c);
    __delay_ms(1);
}

void LCD_PutString(const char *str)
{
    while (*str != '\0')
    {
        LCD_PutChar(*str);
        str++;
    }
}

void LCD_Clear(void)
{
    LCD_SendByte(0x01);
    __delay_ms(5);
}
FB_IMG_1704137834122.jpg
 
Última edición por un moderador:
Atrás
Arriba