
#include "piccolo_all.h"
#include <stdio.h>
#include <delays.h>



#define LCD_RS			LATBbits.LATB5
#define LCD_RW			LATBbits.LATB6
#define LCD_E			LATBbits.LATB7

#define init_LCD_RS()	TRISBbits.TRISB5 = 0;
#define init_LCD_RW()	TRISBbits.TRISB6 = 0;
#define init_LCD_E()	TRISBbits.TRISB7 = 0;

#define LCD_dataport	LATD
#define LCD_BUSY_bit	PORTDbits.RD7
#define LCD_DATA_RD()	TRISD = 0xFF;	
#define LCD_DATA_WR()	TRISD = 0x00;


void LCD_E_pulse(void) {
	Delay10TCYx(2);
	LCD_E = 1;
	Delay10TCYx(2);
	LCD_E = 0;
	Delay10TCYx(1);
	}
	
void wait_LCD_busy(void) {
	unsigned char busy_flag;
	
	LCD_RS = 0;
	LCD_DATA_RD();
	LCD_RW = 1;
	
	do {
		LCD_E = 1;
		Delay10TCYx(2);
		busy_flag = LCD_BUSY_bit;
		LCD_E = 0;
		Delay10TCYx(2);		
		}
	while(busy_flag);
		LCD_RW = 0;
		LCD_DATA_WR();		
	}
	
void LCD_write_init(unsigned char init_data) {
	LCD_dataport =init_data;
	LCD_E_pulse;	
	}

void LCD_write_data(unsigned char data) {
	wait_LCD_busy();
	LCD_RS = 1;
	LCD_dataport = data;
	LCD_E_pulse;
	}
	
void LCD_write_command(unsigned char command) {
	wait_LCD_busy();
	LCD_RS = 0;
	LCD_dataport = command;
	LCD_E_pulse;
	}
	
void init_LCD(void) {
	LCD_RS = 0;
	LCD_RW = 0;
	LCD_E = 0;
	init_LCD_RS();
	init_LCD_RW();
	init_LCD_E();
	LCD_dataport = 0;
	LCD_DATA_WR();
	
	Delay10KTCYx(60);
	
	LCD_write_init(0x30);
	Delay10KTCYx(6);
	LCD_write_init(0x30);
	Delay1KTCYx(2);
	LCD_write_init(0x30);
	Delay1KTCYx(2);
	
	LCD_write_command(0x38);
	LCD_write_command(0x01);
	LCD_write_command(0x0C);
//	LCD_write_command(0x0F);
	}


void main(void) {
	init_LCD();
	LCD_write_data("4");
	LCD_write_data("5");
	LCD_write_data("5");
	LCD_write_data("0");
	while(1){
		}
	}
