#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL
#define lcd_addr 0x27
#define lcd_en 0x04
#define lcd_rs 0x01
#define lcd_rw 0x02
int column[2] = {0,64};
void twi_init(void)
{
TWSR |= (1 << TWPS1) | (1 << TWPS0);
TWCR |= (1 << TWEN);
TWBR = 0x48;
}
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_init(void)
{
_delay_ms(20);
lcd_command(0x33);
lcd_command(0x32);
lcd_command(0x28);
lcd_command(0x0F);
lcd_command(0x06);
lcd_command(0x01);
_delay_ms(2);
}
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(200);
twi_write(lower);
_delay_ms(1);
twi_write(lower & ~(lcd_en));
twi_stop();
}
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(200);
twi_write(lower);
_delay_ms(1);
twi_write(lower & ~(lcd_en));
twi_stop();
}
void send_string(char *string)
{
while(*string)
{
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);
lcd_data(0x44);
send_string("anish");
while(1)
{
}
return 0;
}