He estado tratando de interactuar con una pantalla compatible con HD44780 (16x2) durante algunas horas, pero me he encontrado con algunos problemas de comportamiento extraños que no puedo resolver.
Mi configuración:
Mi secuencia de inicio:
(con RS bajo)
Aquí, algunas cosas no suceden como se esperaba:
A continuación intento escribir algunos caracteres con RS alto, enviando 2 nibbles por carácter.
Aquí también, tengo un comportamiento extraño: en lugar de escribir 1 carácter por 2 mordiscos, escribe 2 (uno por mordisco). Hice que pasara por los caracteres 0-15 y obtuve símbolos aleatorios (por ejemplo, barra oblicua) y caracteres japoneses. Todos ellos son de lugares aleatorios en la tabla de caracteres, principalmente 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 de iniciar, puede ser útil
Edición 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
}
En algunos modelos, debe enviar los comandos de configuración inicial varias veces. Además, algunos modelos que tengo consumen energía de manera agresiva y pulsada, así que tenga un condensador grande cerca de la fuente de alimentación (+ -) de la pantalla LCD para evitar el ruido del riel de alimentación.
No has mencionado la línea E hasta ahora.
E debe ser bajo, luego presentar datos, configurar E alto y luego bajo, etc.
¿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.
Una vez obtuve una pantalla con un comportamiento similar. Necesitaba configurarlo en modo de 8 bits tres veces y una vez más configurarlo en modo de 4 bits para llevarlo "realmente" al modo de 4 bits. Esta fue la única forma en que conseguí que funcionara en modo de 4 bits. Tal vez esto ayude.
Spehro Pefhany
Ignacio Vázquez-Abrams
tehwalris
tehwalris
venny
venny
tehwalris
tehwalris
venny
tehwalris
venny
tehwalris
tehwalris