#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
uint8_t position_y[2] = {0,64};
void checkbusy(void);
void peekaboo(void);
void send_command(unsigned char comamnd);
void send_data(unsigned char data);
void send_string(char *string);
void init_lcd(void);
void set_cursor(uint8_t x,uint8_t y);
int main(void)
{
init_lcd();
char positionstring[3];
while(1)
{
for(int y=0;y<2;y++)
{
for(int x=0;x<16;x++)
{
itoa(x,positionstring,10);
set_cursor(7,0);
send_string("X = ");
send_string(positionstring);
itoa(y,positionstring,10);
set_cursor(7,1);
send_string("Y = ");
send_string(positionstring);
set_cursor(x,y);
send_string("x");
_delay_ms(400);
set_cursor(x,y);
send_string(" ");
itoa(x,positionstring,10);
set_cursor(7,0);
send_string(" ");
itoa(y,positionstring,10);
set_cursor(7,1);
send_string(" ");
}
}
}
return 0;
}
void checkbusy(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)
{
checkbusy();
lcd_data = command;
lcd_ctrl &= ~(1 << RW | 1 << RS);
peekaboo();
lcd_data = 0;
}
void send_data(unsigned char data)
{
checkbusy();
lcd_data = data;
lcd_ctrl &= ~1 < RW;
lcd_ctrl |= 1 << RS;
peekaboo();
lcd_data = 0;
}
void send_string(char *string)
{
while(*string > 0)
{
send_data(*string++);
}
}
void init_lcd(void)
{
lcd_ctrl_dir |= 1 << EN | 1 << RW | 1 << RS;
_delay_ms(15);
send_command(0x01);
_delay_ms(2);
send_command(0x38);
_delay_ms(50);
send_command(0x0E);
_delay_ms(50);
}
void set_cursor(uint8_t x,uint8_t y)
{
send_command(0x80 + position_y[y] + x);
}