#include "i2c.h"
void twi_init(void)
{
TWCR |= (1 << TWEN);
TWBR = 0x48;
TWSR = 0x00;
}
void twi_start(void)
{
TWCR |= (1 << TWEN) | (1 << TWSTA) | (1 << TWINT);
while(!(TWCR & (1 << TWINT)));
}
void twi_stop(void)
{
TWCR |= (1 << TWEN) | (1 << TWSTO) | (1 << TWINT);
}
void twi_write(uint8_t data)
{
TWDR = data;
TWCR |= (1 << TWEN) | (1 << TWINT);
while(!(TWCR & (1 << TWINT)));
}
void lcd_data(uint8_t data)
{
uint8_t upper = (data & 0xF0) | lcd_en | lcd_rs;
uint8_t lower = ((data << 4) & 0xF0) | lcd_en | lcd_rs;
twi_start();
twi_write((lcd_addr << 1) | 0);
twi_write(upper);
_delay_ms(1);
twi_write(upper & ~lcd_en);
_delay_ms(100);
twi_write(lower);
_delay_ms(1);
twi_write(lower & ~lcd_en);
_delay_ms(2);
twi_stop();
}
void lcd_command(uint8_t command)
{
uint8_t upper = (command & 0xF0) | lcd_en;
uint8_t lower = ((command << 4) & 0xF0) | lcd_en;
twi_start();
twi_write((lcd_addr << 1) | 0);
twi_write(upper);
_delay_ms(1);
twi_write(upper & ~lcd_en);
_delay_ms(100);
twi_write(lower);
_delay_ms(1);
twi_write(lower & ~lcd_en);
_delay_ms(2);
twi_stop();
}
void lcd_init(void)
{
_delay_ms(50);
lcd_command(0x33);
_delay_ms(5);
lcd_command(0x33);
_delay_ms(100);
lcd_command(0x33);
lcd_command(0x32); // 4-bit mode
lcd_command(0x28); // 2 lines, 5x8 font
lcd_command(0x0E); // Display ON, cursor OFF
lcd_command(0x06); // Auto-increment cursor
lcd_command(0x01); // Clear LCD
_delay_ms(2);
}
void send_string(char *string)
{
while(*string != '\0')
{
lcd_data(*string++);
}
}
void set_cursor(uint8_t x,uint8_t y)
{
lcd_command(0x80 + x + column[y]);
}
int main(void)
{
lcd_init();
twi_init();
set_cursor(0,0);
send_string("anish");
while(1)
{
}
return 0;
}