/* Display LCD
Controlado sem biblioteca. E utilizando 8 bits
Versão 2 -- novidades:
Conversor de String para char, para realizar a impressão de String no display.
Versão 3 -- novidades:
Agora foi adicionada uma função para definir a posição do cursor, porém ela não
está funcionando corretamente, não conseguindo definir a coluna, mas consegue
mudar a linha. Então a partir dela foi criada a função "novaLINHA()", que apenas
muda a linha, para a segunda, ou de volta para a primeira.
Além destas alterações a função de conversor recebeu inúmeras modificações, para
mudar de linha automaticamente, caso a String seja muito grande para caber na
primeira linha, para mudar de linha ao receber o caractere "\n" no meio da String,
e seu nome foi alterado para "imprimir()".
Versão 3.1 -- novidades:
Não foi feita nenhuma alteração no código, apenas alterado as saídas dos leds,
que estavam invertidas, agora é possível ver o código binário corretamente.
Funcional.
Mais funções podem ser adicionadas posteriormente
*/
#define lcdRS 22
#define lcdEN 23
#define d0 2
#define d1 0
#define d2 4
#define d3 16
#define d4 5
#define d5 18
#define d6 19
#define d7 21
void escrever(unsigned char valor, int rs = 1){
saida(valor);
digitalWrite(lcdRS, rs);
pulseEN();
}
void saida(uint8_t valor){
digitalWrite(d0, (bool)((valor)&0x01));
digitalWrite(d1, (bool)((valor>>1)&0x01));
digitalWrite(d2, (bool)((valor>>2)&0x01));
digitalWrite(d3, (bool)((valor>>3)&0x01));
digitalWrite(d4, (bool)((valor>>4)&0x01));
digitalWrite(d5, (bool)((valor>>5)&0x01));
digitalWrite(d6, (bool)((valor>>6)&0x01));
digitalWrite(d7, (bool)((valor>>7)&0x01));
}
void pulseEN(){
digitalWrite(lcdEN, LOW);
delayMicroseconds(5);
digitalWrite(lcdEN, HIGH);
delayMicroseconds(5);
digitalWrite(lcdEN, LOW);
delayMicroseconds(5);
}
void configuraPINOdisplay(){
pinMode(lcdRS, OUTPUT);
pinMode(lcdEN, OUTPUT);
pinMode(d0, OUTPUT);
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(d5, OUTPUT);
pinMode(d6, OUTPUT);
pinMode(d7, OUTPUT);
}
void iniciaLCD(){
configuraPINOdisplay();
// Mudar configuração para 8 bits
escrever(0x03, 0);
delay(5);
escrever(0x03, 0);
delayMicroseconds(320);
escrever(0x03, 0);
delayMicroseconds(320);
// Fazer configuração do display
escrever(0x38, 0);
escrever(0x06, 0);
escrever(0x0C, 0);
escrever(0x03, 0);
escrever(0x01, 0);
}
void novaLINHA(uint8_t linha = 1){
uint8_t lin;
if(linha==1) lin = 0xC0;
else lin = 0x80;
escrever(lin, 0);
}
void imprimir(String texto) {
int tamanho = texto.length();
char textoC[tamanho + 1];
texto.toCharArray(textoC, tamanho + 1);
Serial.print("Texto: ");
Serial.println(texto);
Serial.print("Tamanho: ");
Serial.println(tamanho);
int tem_nova_linha = 0;
for(int i = 0; i < tamanho; i++){
if(textoC[i] == 0x0A) tem_nova_linha++; // o 0x0A coresponde ao \n em ascii.
else tem_nova_linha = 0;
}
if(tamanho > 16 && tem_nova_linha == 0) {
for(int i = 0; i < 16; i++){
Serial.println(textoC[i]);
escrever(textoC[i]);
}
novaLINHA();
for(int i = 16; i < tamanho; i++){
Serial.println(textoC[i]);
escrever(textoC[i]);
}
}
else
{
for(int i = 0; i < tamanho; i++){
Serial.println(textoC[i]);
if(textoC[i] == 0x0A){
novaLINHA();
} else {
escrever(textoC[i]);
}
}
}
}
void cursor(uint8_t coluna, uint8_t linha){
uint8_t col = 0x00;
uint8_t lin;
uint8_t res;
if(linha==1) lin = 0xC0;
else lin = 0x80;
for(int i = 0; i < coluna; col++);
Serial.println(lin);
Serial.println(col);
res = lin + col;
escrever(res, 0);
}
void setup() {
Serial.begin(115200);
Serial.println("Ligou");
iniciaLCD();
imprimir("esp 32 controle123");
novaLINHA(0);
imprimir("Texto");
novaLINHA();
imprimir("Texto");
}
void loop() {
}