#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define lcd_data PORTD
#define lcd_data_dir DDRD
#define lcd_ctrl PORTB
#define lcd_ctrl_dir DDRB
#define RS PB1
#define RW PB2
#define EN PB3
char column_y[2] = {0,64};
void lcd_init(void);
void send_command(unsigned char command);
void send_data(unsigned char data);
void set_cursor(uint8_t x,uint8_t y);
void send_integer_cursor(uint8_t x,uint8_t y,char lenght,int integer);
void send_string_cursor(uint8_t x,uint8_t y,char *string);
void check_busy(void);
void peekaboo(void);
void send_string(char *string);
int main(void)
{
char temp[3];
lcd_init();
// send_string_cursor(0,0,"anish");
// send_integer_cursor(6,0,3,69);
// send_string_cursor(9,0,"anantha");
while(1)
{
for(int y=0;y<2;y++)
{
for(int x=0;x<16;x++)
{
itoa(x,temp,10);
set_cursor(7,0);
send_string("X = ");
send_string(temp);
itoa(y,temp,10);
set_cursor(7,1);
send_string("Y = ");
send_string(temp);
set_cursor(x,y);
send_string("x");
_delay_ms(400);
set_cursor(x,y);
send_string(" ");
itoa(x,temp,10);
set_cursor(7,0);
send_string(" ");
itoa(y,temp,10);
set_cursor(7,1);
send_string(" ");
}
}
}
return 0;
}
void lcd_init(void)
{
lcd_ctrl_dir |= (1 << RS) | (1 << EN) | (1 << RW);
_delay_ms(15);
send_command(0x01);
_delay_ms(2);
send_command(0x38);
_delay_ms(50);
send_command(0x0E);
_delay_ms(50);
}
void check_busy(void)
{
lcd_data_dir = 0;
lcd_ctrl |= (1 << RW);
lcd_ctrl &= ~(1 << RS);
while(lcd_data >= 0x80)
{
peekaboo();
}
lcd_data_dir = 0xFF;
}
void peekaboo(void)
{
lcd_ctrl |= (1 << EN);
asm volatile("nop");
asm volatile("nop");
lcd_ctrl &= ~(1 << EN);
}
void send_command(unsigned char command)
{
check_busy();
lcd_data = command;
lcd_ctrl &= ~((1 << RS) | (1 << RW));
peekaboo();
lcd_data = 0;
}
void send_data(unsigned char data)
{
check_busy();
lcd_data = data;
lcd_ctrl &= ~(1 << RW);
lcd_ctrl |= (1 << RS);
peekaboo();
lcd_data = 0;
}
void set_cursor(uint8_t x,uint8_t y)
{
send_command(0x80 + x + column_y[y]);
}
void send_string(char *string)
{
while(*string != 0)
{
send_data(*string++);
}
}
void send_integer_cursor(uint8_t x,uint8_t y,char lenght,int integervalue)
{
char buffer[lenght];
itoa(integervalue,buffer,10);
for(int i=0;i<lenght;i++)
{
send_string(" ");
}
send_string_cursor(x,y,buffer);
}
void send_string_cursor(uint8_t x,uint8_t y,char *string)
{
set_cursor(x,y);
send_string(string);
}