#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>


#define RS_PORT PORTD
#define RS_PIN  PIND0
#define RS_DDR  DDD0


//#define RW_PORT PORTD
//#define RW_PIN  PIND1
//#define RW_DDR  DDD1


#define ENA_PORT PORTD
#define ENA_PIN  PIND1
#define ENA_DDR  DDD1

#define BIT4_PORT   PORTD
#define BIT4_PIN    PIND4
#define BIT4_DDR    DDD4


#define BIT5_PORT   PORTD
#define BIT5_PIN    PIND5
#define BIT5_DDR    DDD5

#define BIT6_PORT   PORTD
#define BIT6_PIN    PIND6
#define BIT6_DDR    DDD6

#define BIT7_PORT   PORTD
#define BIT7_PIN    PIND7
#define BIT7_DDR    DDD7

#define LED_PIN     PINC0
#define LED_PORT    PORTC
#define LED_DDR     DDC0

//LCD CONNECTIONS:
/*
 * VSS --> GND
 * VDD --> VCC
 * V0  --> POT --> GND
 * RS  --> PD0(AVR)
 * RW  --> GND
 * E   --> PD1(AVR)
 * D4  --> PD4(AVR)
 * D5  --> PD5(AVR)
 * D6  --> PD6(AVR)
 * D7  --> PD7(AVR)
 *
 * PURPOSE:
 * RS: register select,
 * RW: Read/Write select signal,
 * E:  Operation(data read/write) enable signal.
 * DB0~DB3: not used for 4bit operations.
 * DB4~DB7: high order three-state data lines.
 */


//#############################
//MACROS
//#############################

//already defined
//#define _BV(bit) (1 << bit)
#define setbit(port, bit) (port) |= (1 << (bit))
#define clearbit(port, bit) (port) &= ~(1 << (bit))

//#############################
//FUNCTION PROTOTYPES
//#############################


void init_lcd(void);
void cmd_lcd(uint8_t cmd);
void cmd_nibble_lcd(uint8_t cmd);
void clear_lcd(void);                                                                                               
static void led_blink(void);
void set_lcd_one_line_(void);
void set_lcd_two_line(void);
void return_home_lcd(void);
void turn_off_lcd(void);
void turn_on_lcd(void);
void set_cgram_lcd_address(uint8_t addr);
void set_ddram_lcd_address(uint8_t addr);
void write_lcd_address(uint8_t addr);
void set_entry_mode_increment_lcd(void);
void set_entry_mode_decrement_lcd(void);
void shift_right_lcd(void);
void shift_left_lcd(void);
void clear_buf_lcd();


