/* ---------------------------------------------------------------------------
* 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);