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
}