/* ---------------------------------------------------------------------------
 * AVR_MLIB - HD 44780 LCD Display Driver Test Application
 * www.mlab.cz miho 2008
 * ---------------------------------------------------------------------------
 * Simple test application for lcd_hd44780.h LCD library. This code ilustates
 * how to use and configure the library functions.
 * ---------------------------------------------------------------------------
 * 00.00 2008/03/28 First Version
 * 00.01 2008/04/19 Improved
 * ---------------------------------------------------------------------------
 */


// Required Libraries
// ------------------

// Delay

#define F_CPU 1000000UL		// CPU Frequency
#include <util/delay.h>		// Delay Routines

// Standard Output Library

#include <stdio.h>			// For printf


// LCD Display Interface
// ---------------------

// LCD Port Settings

#define LCD_DATA			B		// 4 or 8 bits field (lsb port)
#define LCD_DATA_BIT		4

#define LCD_RS				D		// Register Select
#define LCD_RS_BIT			4		

#define LCD_E				D		// Enable
#define LCD_E_BIT			3

// 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			20		// usualy 16 or 20, important for 4 line display only

// LCD Library

#include "lcd_hd44780.h"


// Test Application
// ----------------


// Define Output Stream to LCD
static FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putc_stream, NULL, _FDEV_SETUP_WRITE);


// Main Program
int main ()
{
	int i;

	stdout = &lcd_stream;		// Connect stdout to LCD Stream

	lcd_init();					// Init LCD (interface and display module)

	// Print Lines
	for (i=1; i<=LCD_LINES;i++)
	{
		lcd_gotoxy(1,i);
		printf("Line %d", i);
		_delay_ms(1000);
	}

	// Show User Defined Symbols
	printf("\v" "\x10" LCD_CHAR_SPACE LCD_CHAR_SPACE "\v");		// You shold know that dispaly
	printf("\fBat Status \x10 \x11");							// does clear user defined chars
	_delay_ms(1000);											// on Power Up only
	printf("\v" "\x11" LCD_CHAR_UP "\v");
	printf("\v" "\x10" LCD_CHAR_BAT100 "\v");
	_delay_ms(1000);
	printf("\v" "\x10" LCD_CHAR_BAT50 "\v");
	_delay_ms(1000);
	printf("\v" "\x10" LCD_CHAR_BAT0 "\v");
	_delay_ms(1000);

	// Show Cursor
	lcd_cursor_on();
	_delay_ms(1000);
	lcd_cursor_right();
	_delay_ms(1000);
	lcd_cursor_left();
	_delay_ms(1000);
	lcd_cursor_left();
	_delay_ms(1000);

	// Print to the Next Line
	printf("\n   Hello World");
	_delay_ms(1000);

	// Count Down
	for(i=20;i>0;i--)
	{
		printf("\r%2d", i);
		_delay_ms(1000);
	}

	// End
	lcd_cursor_off();
	printf("\b\b X");
}
