#include <avr/io.h>
#include <util/delay.h>
// Endereço I2C do LCD1602
#define I2C_ADDR 0x27
void i2c_init(){
TWSR = 0; // definir o prescaler
TWBR = ((F_CPU / 100000) - 16) / 2;
TWCR = (1 << TWEN);
}
// Função para enviar um byte via I2C
void i2cSendByte(uint8_t data, uint8_t isData) {
// Iniciar a transmissão
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
// Aguardar a conclusão da transmissão
while (!(TWCR & (1 << TWINT)));
// Enviar o endereço do dispositivo com a flag de escrita
TWDR = (I2C_ADDR << 1) | (isData ? 1 : 0);
TWCR = (1 << TWINT) | (1 << TWEN);
// Aguardar a conclusão da transmissão
while (!(TWCR & (1 << TWINT)));
// Enviar o byte de dados
TWDR = data; // registrador que armazena os dados
TWCR = (1 << TWINT) | (1 << TWEN);
// Aguardar a conclusão da transmissão
while (!(TWCR & (1 << TWINT)));
// Finalizar a transmissão
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
// Aguardar o final da transmissão
_delay_ms(1);
}
// Função para enviar um comando ao LCD1602
void lcdCommand(uint8_t value) {
i2cSendByte(value, 0);
_delay_ms(2);
}
// Função para enviar um caractere ao LCD1602
void lcdWrite(uint8_t value) {
i2cSendByte(0x40 | value, 1);
_delay_ms(1);
}
// Função de inicialização do LCD1602
void lcdInit() {
_delay_ms(1000); // Aguardar a inicialização do LCD
lcdCommand(0x30); // Inicialização
_delay_ms(5);
lcdCommand(0x30); // Inicialização
_delay_us(100);
lcdCommand(0x30); // Inicialização
_delay_us(100);
lcdCommand(0x20); // Modo 4 bits
_delay_ms(5);
lcdCommand(0x28); // 4 bits, 2 linhas
_delay_ms(2);
lcdCommand(0x0C); // Display ON, Cursor OFF, Blink OFF
_delay_ms(2);
lcdCommand(0x06); // Modo de entrada
_delay_ms(2);
lcdCommand(0x01); // Limpar display
_delay_ms(2);
}
// Função para posicionar o cursor no LCD1602
void lcdSetCursor(uint8_t col, uint8_t row) {
int row_offsets[] = {0x00, 0x40, 0x10, 0x50}; // Ajuste de offset para LCD1602
lcdCommand(0x80 | (col + row_offsets[row]));
}
void setup() {
i2c_init();
lcdInit();
lcdSetCursor(0, 1);
i2cSendByte('a',1);
}
void loop() {
// Seu código principal aqui
}
/*
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço I2C do LCD
#define I2C_ADDR 0x27
// Número de colunas e linhas do LCD
#define LCD_COLUMNS 16
#define LCD_ROWS 2
// Inicializa o objeto LCD
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_ROWS);
void setup() {
// Inicializa o LCD
lcd.begin(LCD_COLUMNS,LCD_ROWS);
// Escreve uma mensagem inicial no LCD
lcd.print("Hello, World!");
}
void loop() {
// Move o cursor para a segunda linha do LCD
lcd.setCursor(0, 1);
// Escreve algo na segunda linha
lcd.print("Arduino I2C LCD");
// Aguarda por um segundo
delay(1000);
// Limpa o LCD
lcd.clear();
// Aguarda por mais um segundo
delay(1000);
}*/