/******************************************************************************* 
   \file LCD_30.h
   \version: 1.0
   
   \author Suky. 
   \web www.infopic.comlu.com
   \mail inf.pic.suky@live.com.ar
   \date 18/01/10
********************************************************************************/

#if defined(__dsPIC30F__)
#include <p30fxxxx.h>
#elif defined(__dsPIC33F__)
#include <p33Fxxxx.h>
#elif defined(__PIC24H__)
#include <p24Hxxxx.h>
#elif defined(__PIC24F__)
#include <p24Fxxxx.h>
#endif 

#ifndef _LCDPIC24_H
#define _LCDPIC24_H

#warning "Se ha definido valor de FCY para realización de demoras!!!"
#define FCY 10000000UL 
//#define FCY 2000000UL 
#include <libpic30.h>


/* ** El siguiente modo no utiliza el PIN RW** */
#define USE_3PINES		// Se utiliza registro de desplazamiento para DATA[0..3] y RS.
/* ** Para no utilizar el PIN RW comentar la siguiente definición ** */
//#define USE_RW 

#ifndef USE_3PINES
	/* ** Pines tolerables a 5V para usar RW ** */
	#define DATA_PIN_7 	LATBbits.LATB11
	#define DATA_PIN_6 	LATBbits.LATB10
	#define DATA_PIN_5 	LATBbits.LATB9
	#define DATA_PIN_4 	LATBbits.LATB8
	
	#define READ_PIN_7	PORTBbits.RB11
	#define READ_PIN_6	PORTBbits.RB10
	#define READ_PIN_5	PORTBbits.RB9
	#define READ_PIN_4	PORTBbits.RB8
	
	
	#define TRIS_DATA_PIN_7       TRISBbits.TRISB11
	#define TRIS_DATA_PIN_6       TRISBbits.TRISB10
	#define TRIS_DATA_PIN_5       TRISBbits.TRISB9
	#define TRIS_DATA_PIN_4       TRISBbits.TRISB8
	
	
	#define E_PIN	LATBbits.LATB2 
	#define RS_PIN	LATBbits.LATB0 
	#ifdef USE_RW
		#define RW_PIN	LATBbits.LATB1 
	#endif
	
	#define TRIS_E	TRISBbits.TRISB2 
	#define TRIS_RS	TRISBbits.TRISB0  
	#ifdef USE_RW 
		#define TRIS_RW	TRISBbits.TRISB1 
	#endif 
#else
	#define DATA_PIN  LATBbits.LATB15
	#define CLOCK_PIN LATBbits.LATB14
	#define E_PIN	  LATBbits.LATB13

	#define TRIS_DATA	TRISBbits.TRISB15
	#define TRIS_CLOCK	TRISBbits.TRISB14
	#define TRIS_E		TRISBbits.TRISB13
#endif


/* Definiciones generales */
// Encendido display.
#define D_ON        0x0C
#define D_OFF       0x08
#define CURSOR_ON   0x0E
#define BLINK_ON    0x0F
#define C_ON_BLINK	0x0D
// Control.
#define D_CLEAR		0x01
#define SET_INIT	0x02
/*;--- Modos de Entrada
; Incrementa Direccion, Display fijo	0x06
; Decrementa Direccion, Display fijo	0x04
; Incrementa Direccion, Cursor fijo		0x07
; Decrementa Direccion, Cursor fijo		0x05
;--- Corriemiento Cursor
; Cursor a la Izquierda					0x10
; Cursor a la Derecha					0x14
; Display a la Izquierda				0x18
; Display a la Derecha					0x1C
;--- Fijar Sistema
; Bus 8 bits, 1 línea, 5x7				0x30
; Bus 8 bits, 1 linea, 5x10				0x34
; Bus 8 bits, 2 líneas, 5x7				0x38
; Bus 4 bits, 1 línea, 5x7				0x20	
; Bus 4 bits, 1 linea, 5x10				0x24
; Bus 4 bits, 2 líneas, 5x7 			0x28*/

/* Definiciones para OpenLCD */
#define LINEA_5X7   0b00000000  /* 5x7 characters, single line   */
#define LINEA_5X10  0b00000100  /* 5x10 characters               */
#define LINEAS_5X7  0b00001000  /* 5x7 characters, multiple line */

/* Funciones */
void OpenLCD(unsigned char LcdType) __attribute__ ((section (".libperi")));

unsigned char BusyLCD(void) __attribute__ ((section (".libperi")));

void WriteCmdLCD(unsigned char cmd) __attribute__ ((section (".libperi")));

void WriteDataLCD(char data) __attribute__ ((section (".libperi")));

#define putcLCD WriteDataLCD

void putsLCD(char *buffer) __attribute__ ((section (".libperi")));

void GotoxyLCD(unsigned char x,unsigned char y) __attribute__ ((section (".libperi")));

#endif