/*********************
* PANTALLA LCD A 4 BITS
**********************/
byte pines[] = {23, 22, 21, 19}; // Pines de datos D4-D7
#define RS 5
#define EN 18
byte cuenta = 0;
void setup() {
// Configuración de pines como salida
for (byte i = 0; i < 4; i++) {
pinMode(pines[i], OUTPUT);
}
pinMode(RS, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
configuracion();
limpiar();
// Mensajes iniciales
cursor(0, 4);
Mensaje("Hola Mundo");
cursor(1, 5);
Mensaje("ESP32");
}
void loop() {
// Cambios en los mensajes con un contador
switch (cuenta) {
case 0:
cursor(0, 4);
Mensaje("Ciclo Uno");
cursor(1, 5);
Mensaje("Prueba");
break;
case 30:
cursor(0, 4);
Mensaje("Ciclo Dos");
cursor(1, 5);
Mensaje("LCD");
break;
case 90:
cursor(0, 4);
Mensaje("Ciclo Tres");
cursor(1, 5);
Mensaje("ESP32");
break;
}
cursor(1, 12);
Mensaje(String(cuenta));
delay(300);
cuenta++;
if (cuenta > 100) cuenta = 0;
}
void Mensaje(String M) {
byte D;
delay(10);
digitalWrite(RS, HIGH);
for (byte i = 0; M[i]; i++) {
D = (M[i] & 0b11110000) >> 4; // Nibble alto
EnviarDato(D);
D = M[i] & 0b00001111; // Nibble bajo
EnviarDato(D);
}
}
void EnviarDato(byte DT) {
digitalWrite(EN, HIGH);
salidas(DT);
digitalWrite(EN, LOW);
delay(1);
}
void configuracion() {
byte tiempos[] = {40, 5, 5, 5, 1, 1, 1, 1, 1, 1};
byte confi[] = {0x3, 0x3, 0x3, 0x2, 0x2, 0x8, 0x0, 0x6, 0x0, 0x0};
digitalWrite(RS, LOW);
for (byte i = 0; i <= 9; i++) {
delay(tiempos[i]);
digitalWrite(EN, HIGH);
salidas(confi[i]);
digitalWrite(EN, LOW);
}
}
void limpiar() {
digitalWrite(RS, LOW);
EnviarDato(0x0);
EnviarDato(0x1);
delay(2);
}
void cursor(byte N, byte M) {
byte direccion = (N == 0 ? 0x80 : 0xC0) + M;
digitalWrite(RS, LOW);
EnviarDato(direccion >> 4);
EnviarDato(direccion & 0x0F);
}
void salidas(byte N) {
for (byte k = 0; k < 4; k++) {
digitalWrite(pines[k], (N >> k) & 1);
}
}