#include <avr/io.h>
#include <util/delay.h>
//macros
#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
//function prototype
void peekaboo(void);
void chechbusy(void);
void send_command(unsigned char command);
void send_data(unsigned char data);
//main function
int main(void)
{
lcd_ctrl_dir |= 1 << RS | 1 << RW | 1 << EN;
_delay_ms(20);
send_command(0x01);
_delay_ms(2);
send_command(0x38);
_delay_ms(50);
send_command(0b00001110);
_delay_ms(50);
send_data(0x41);
send_data(0x4E);
send_data(0x49);
send_data(0x53);
send_data(0x48);
while(1)
{
}
return 0;
}
void peekaboo(void)
{
lcd_ctrl |= 1 << EN;
asm volatile("nop");
asm volatile("nop");
lcd_ctrl &= ~1 << EN;
}
void checkbusy(void)
{
lcd_data_dir = 0;
lcd_ctrl |= (1 << RW); //read
lcd_ctrl &= ~1 << RS; //command
while(lcd_data >= 0x80)
{
peekaboo();
}
lcd_data_dir = 0xFF;
}
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;
}