Problemas extraños con LCD (compatible con HD44780)

3

He intentado establecer una interfaz con una pantalla compatible con HD44780 (16x2) desde hace algunas horas, pero me he encontrado con algunos problemas de comportamiento extraños que no puedo resolver.

Mi configuración:

  • Estoy usando la pantalla LCD en modo de 4 bits (los cuatro bits superiores, D4-D7, como en Todas las guías que he encontrado, el orden es correcto (lo he comprobado varias veces).
  • La pantalla LCD se está ejecutando desde un suministro regulado de 5 v. (He probado 3.3v, mismo resultado, menos contraste)
  • La línea R / W está conectada a tierra con una resistencia desplegable (fijada en modo de escritura).
  • El contraste se establece mediante un bote y puedo obtener una línea de cuadrados visible al inicio.
  • Estoy usando tiempos muy lentos (~ 200 ms de espera - habilitar alta - ~ 200 ms - cambiar datos - ~ 200 ms - habilitar baja)

Mi secuencia de inicio:

(con RS bajo)

  • 0x03 - (tres veces) (enviado como un mordisco / byte)
  • 0x02: habilita el modo de cuatro bits (enviado como un mordisco / byte)
  • 0x28 - Conjunto de funciones (2 líneas, 4 bits) (enviado como dos nibbles, ms nibble primero)
  • 0x01 - Borrar (enviado como dos nibbles)
  • 0x06 - Establecer el modo de entrada (cursor de incremento en escritura, sin cambio de visualización) (enviado como dos nibbles)
  • 0x08 - Muestra, cursor y parpadea (enviado como dos nibbles)
  • 0x0F - Muestra, cursor y parpadea en (enviado como dos nibbles)

Aquí, algunas cosas no suceden como se esperaba:

  • El modo de dos líneas no parece habilitarse (no hay cuadros de fondo oscuro en la segunda línea, no se escriben caracteres allí)
  • claro no sucede
  • El cursor está en el tercer cuadrado en lugar del primero al final de esta secuencia de inicio

A continuación, trato de escribir algunos caracteres con RS alto, enviando 2 mordiscos por carácter.

Aquí también obtengo un comportamiento extraño: en lugar de escribir 1 carácter por 2 nibbles, escribe 2 (uno por nibble). Lo hice pasar por los caracteres 0-15 y obtengo símbolos aleatorios (por ejemplo, barra) y caracteres japoneses. Todos ellos son de lugares aleatorios en la tabla de caracteres, principalmente en la fila inferior, no en ningún orden normal, pero siempre se imprimen los mismos caracteres en el mismo orden.

Mi pregunta: Realmente me he quedado sin ideas para arreglar esto. ¿Me estoy perdiendo algo obvio? ¿Qué problemas podría tener y cómo puedo depurar más?

Editar: Esto es lo que veo en mi pantalla después del inicio, puede ser útil

Edit 2:

Mi código principal:

GPIOPin lcdEnablePin = PIN_B(11);
GPIOPin lcdRSPin = PIN_B(10);
GPIOPin lcdDataPins[] = {PIN_E(2), PIN_E(3), PIN_E(4), PIN_E(5)};

//Set all pins as outputs
GPIO::pinModeDigital(lcdEnablePin, 1);
GPIO::pinModeDigital(lcdRSPin, 1);
for(int i = 0; i < 4; i++)
 GPIO::pinModeDigital(lcdDataPins[i], 1);

GPIO::writePinDigital(lcdRSPin, 0); //Instruction register
lcdSendData4(lcdEnablePin, lcdDataPins, 2); //Enable 4 bit
lcdSendData8(lcdEnablePin, lcdDataPins, 40); //Function set, 2 line
lcdSendData8(lcdEnablePin, lcdDataPins, 1); //Clear and return home
lcdSendData8(lcdEnablePin, lcdDataPins, 2); //Entry Mode, Increment cursor position, No display shift
lcdSendData8(lcdEnablePin, lcdDataPins, 8); //All off
lcdSendData8(lcdEnablePin, lcdDataPins, 15); //All on

GPIO::writePinDigital(lcdRSPin, 1); //Data register
for(int i = 0; i < 16; i++) //Write test data, 4 bit because that's what seemed to work
 lcdSendData4(lcdEnablePin, lcdDataPins, i);

Mis funciones SendData:

void lcdSendData4(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 simpleBusy();

 //Set enable high
 GPIO::writePinDigital(lcdEnablePin, 1);

 simpleBusy();

 //Write data
 for(int i = 0; i < 4; i++)
  GPIO::writePinDigital(lcdDataPins[i], data & (1 << i));

 simpleBusy();

 //Falling edge
 GPIO::writePinDigital(lcdEnablePin, 0);
}

void lcdSendData8(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 lcdSendData4(lcdEnablePin, lcdDataPins, data >> 4); //Send MSB
 lcdSendData4(lcdEnablePin, lcdDataPins, data); //Send LSB
}
    
pregunta tehwalris

4 respuestas

1

En algunos modelos, debe enviar los comandos de configuración inicial varias veces. También algunos modelos que consumen energía de forma agresiva y por pulsos, así que tengo un condensador grande cerca de la fuente de alimentación (+ -) de la pantalla LCD para evitar el ruido del riel de alimentación.

    
respondido por el paul
0

No has mencionado la línea E hasta ahora.

E debe ser bajo, luego presentar datos, establecer E alto luego bajo, etc.

    
respondido por el Mark Atherton
0

¿Ha permitido los retrasos necesarios para la inicialización? La hoja de datos dice que debe esperar más de 4,1 ms después de enviar el primer 0x3.

    
respondido por el chamod
0

Tengo una pantalla una vez con un comportamiento similar. Necesitaba configurarlo en el modo de 8 bits tres veces y, una vez más, configurarlo en el modo de 4 bits para llevarlo "realmente" al modo de 4 bits. Esta fue la única forma en que funcionó en modo de 4 bits. Tal vez esto ayude.

    
respondido por el Jens

Lea otras preguntas en las etiquetas