/* ---------------------------------------------------------------------------
 * AVR_MLIB - HD 44780 LCD Display Driver
 * www.mlab.cz miho 2008
 * ---------------------------------------------------------------------------
 * LCD display driver for standard Hitachi 1/2/4 line character LCD modules
 * for AVR processors. It uses 4 or 8 bit interface without readback.
 * In the Examples section there is a demo application for this library.
 * ---------------------------------------------------------------------------
 * 00.00 2008/03/28 First Version
 * ---------------------------------------------------------------------------
 */


// What should be set and done before here
// ---------------------------------------
//
// #include <stdio.h>                                   // If you want to use printf, ...
//
// #define LCD_DATA                             B               // 4 or 8 bits field (lsb bit of the port)
// #define LCD_DATA_BIT                 4
// 
// #define LCD_RS                               D               // Register Select (port and bit)
// #define LCD_RS_BIT                   4               
//
// #define LCD_E                                D               // Enable (port and bit)
// #define LCD_E_BIT                    3
//
//
// // LCD Display Parameters
// #define LCD_INTERFACE_BITS   4               // 4 or 8 bit interface
// #define LCD_LINES                    1               // 1 or 2 or 4 lines
// #define LCD_CHARS                    20              // usualy 16 or 20, important for 4 line display only
//
// #include "lcd_hd44780.h"                             // Use LCD Library
//
//
// How to use the library 
// ----------------------
//
// void lcd_init(void)          // Init LCD Display
//
// void lcd_home()                      // Goto Home
//
// void lcd_clear()             // Clear Display
//
// void lcd_clear_home()        // Clear Display and Goto Home with no Cursor
//
// void lcd_cursor_on() // Switch Cursor On
//
// void lcd_cursor_off()        // Switch Cursor Off
//
// void lcd_cursor_left()       // Move Cursor Left
//
// void lcd_cursor_right()      // Move Cursor Right
//
// void lcd_gotoxy(uint8_t x, uint8_t y)                // Move to Position (1,1 is the first position)
//
// int lcd_putc(char c) // LCD Char Output
//
// int lcd_putc_stream(char c, FILE *unused)    // LCD Char Output (for Stream Library)
//
//
// How to use printf
// -----------------
//
// 1) Define FILE structure
//
// static FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putc_stream, NULL, _FDEV_SETUP_WRITE);
//
// 2) Connect it with standard output
//
// stdout = &lcd_stream;                // Connect stdout to LCD Stream
//
// 3) Use printf
//
// printf("\fHello World!\n------------");
//
// 4) Use special chars
//
//              \f      - clear display and goto home
//              \n      - goto the beginning of the next line
//              \r      - goto to the beginning of curent line
//              \b      - backspace
//              \v      - start and end definition of user defined char
//
//
// How to use User Defined symbols
// -------------------------------
//
// That is easy. Just print the definition to lcd. Look at the example
//
// printf("\v" "\x10" LCD_CHAR_BAT50 "\v");             // definition (redefines CGRAM content of the LCD)
// printf("Battery Status \x10");                               // usage
//
//      \v                              starts the definition
//      \x10                    first (of eight) user defined char
//      LCD_CHAR_BAT50  half battery symbol, you can define more symbols here (up to 8)
//      \v                              end of definition
//

#include "global.h"
#include <avr/io.h>                                     // Device Specific Defines
#include <stdio.h>
#include <util/delay.h>                         // Delay Routines

// IO Pins MACROS
#define GLUE(a,b)                       a##b
#define PORT(a)                     GLUE(PORT,a)
#define PIN(a)                          GLUE(PIN,a)
#define DDR(a)                          GLUE(DDR,a)



// LCD Port Settings
#define LCD_DATA                        A               // 4 or 8 bits field (lsb port)
#define LCD_DATA_BIT            4

#define LCD_RS                          C               // Register Select
#define LCD_RS_BIT                      2               

#define LCD_E                           C               // Enable
#define LCD_E_BIT                       4

// LCD Display Parameters
#define LCD_INTERFACE_BITS      4               // 4 or 8 bit interface
#define LCD_LINES                       2               // 1 or 2 or 4 lines
#define LCD_CHARS                       18              // usualy 16 or 20, important for 4 line display only

// Goto Home
void lcd_home(void);

// Clear Display
void lcd_clear(void);

// Switch Cursor On
void lcd_cursor_on(void);

// Switch Cursor Off
void lcd_cursor_off(void);

// Clear Display and Goto Home with no Cursor
void lcd_clear_home(void);

// Move to Position (1,1 is the first position)
void lcd_gotoxy(uint8_t x, uint8_t y);

// Increment Position
void lcd_inc_pos(void);

// Decrement Position
void lcd_dec_pos(void);

// Move Cursor Left
void lcd_cursor_left(void);

// Move Cursor Right
void lcd_cursor_right(void);

// Init LCD Display
void lcd_init(void);

// LCD Char Output
int lcd_putc(char c);