/*This file is to be #included in each source using xlcd100.lib */
#ifndef __XLCD_H
#define __XLCD_H

/* PIC18 XLCD peripheral routines.
 * 03/06 Arlotto : Add possibility to replace busy lcd bit testing
 *                 by a busy delay loop by definig BUSY_LCD_IS_A_DELAY
 * 01/05 Arlotto : Modified for PICDEM2 lcd module
 *
 *   Notes:
 *      - These libraries routines are written to support the
 *        Hitachi HD44780 LCD controller.
 *      - The user must define the following items:
 *          - The LCD interface type (4- or 8-bits)
 *          - If 4-bit mode
 *              - whether using the upper or lower nibble
 *          - The data port
 *              - The tris register for data port
 *              - The control signal ports and pins
 *              - The control signal port tris and pins
 *          - The user must provide three delay routines:
 *              - DelayFor18TCY() provides a 18 Tcy delay
 *              - DelayPORXLCD() provides at least 15ms delay
 *              - DelayXLCD() provides at least 5ms delay
 */
/* comment out this define if you don't use PICDEM */
#define PICDEM_LCD 
#define BUSY_LCD_IS_A_DELAY  // comment out this define to use busy bit tesing
/* comment out this define if you don't want the XLCD to be used as _H_USER */
#define _H_USER_IS_XLCD
/* Interface type 8-bit or 4-bit
 * For 8-bit operation uncomment the #define BIT8
 */
/* #define BIT8 */

/* When in 4-bit interface define if the data is in the upper
 * or lower nibble.  For lower nibble, comment the #define UPPER
 */
/* #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT      PORTD
#define TRIS_DATA_PORT TRISD

/* CTRL_PORT defines the port where the control lines are connected.
 * These are just samples, change to match your application.
 */
#define RW_PIN   PORTAbits.RA2   /* PORT for RW */
#define TRIS_RW  DDRAbits.RA2    /* TRIS for RW */
#define RS_PIN   PORTAbits.RA3   /* PORT for RS */
#define TRIS_RS  DDRAbits.RA3    /* TRIS for RS */
#define E_PIN    PORTAbits.RA1   /* PORT for E  */
#define TRIS_E   DDRAbits.RA1   /* TRIS for E  */

/* Display ON/OFF Control defines */
#define DON         0b00001111  /* Display on      */
#define DOFF        0b00001011  /* Display off     */
#define CURSOR_ON   0b00001111  /* Cursor on       */
#define CURSOR_OFF  0b00001101  /* Cursor off      */
#define BLINK_ON    0b00001111  /* Cursor Blink    */
#define BLINK_OFF   0b00001110  /* Cursor No Blink */

/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT    0b00010011  /* Cursor shifts to the left   */
#define SHIFT_CUR_RIGHT   0b00010111  /* Cursor shifts to the right  */
#define SHIFT_DISP_LEFT   0b00011011  /* Display shifts to the left  */
#define SHIFT_DISP_RIGHT  0b00011111  /* Display shifts to the right */

/* goto cmd defines for use with WriteCmdXLCD */
#define GOTO_CMD 0x80
#define GOTO_LINE_ONE GOTO_CMD+0x00
#define GOTO_LINE_TWO GOTO_CMD+0x40

/* goto cmd defines for use with gotoXLCD */
#define LCD_LINE_ONE 0x00
#define LCD_LINE_TWO 0x40
 
/* Function Set defines */
#define FOUR_BIT   0b00101111  /* 4-bit Interface               */
#define EIGHT_BIT  0b00111111  /* 8-bit Interface               */
#define LINE_5X7   0b00110011  /* 5x7 characters, single line   */
#define LINE_5X10  0b00110111  /* 5x10 characters               */
#define LINES_5X7  0b00111011  /* 5x7 characters, multiple line */
#define OPEN_PICDEM_LCD 0x28   /*Arlotto : the right value for picdem2+ lcd module ! */

#define PARAM_SCLASS auto
#define MEM_MODEL far  /* Change this to near for small memory model */

/* OpenXLCD
 * Configures I/O pins for external LCD
 */
void OpenXLCD(PARAM_SCLASS unsigned char);

/* SetCGRamAddr
 * Sets the character generator address
 */
void SetCGRamAddr(PARAM_SCLASS unsigned char);

/* SetDDRamAddr
 * Sets the display data address
 */
void SetDDRamAddr(PARAM_SCLASS unsigned char);

/* BusyXLCD
 * Returns the busy status of the LCD
 */
unsigned char BusyXLCD(void);

/* ReadAddrXLCD
 * Reads the current address
 */
unsigned char ReadAddrXLCD(void);

/* ReadDataXLCD
 * Reads a byte of data
 */
char ReadDataXLCD(void);

/* WriteCmdXLCD
 * Writes a command to the LCD
 */
void WriteCmdXLCD(PARAM_SCLASS unsigned char);

/* WriteDataXLCD
 * Writes a data byte to the LCD
 */
void WriteDataXLCD(PARAM_SCLASS char);

/* putcXLCD
 * A putc is a write
 */
#define putcXLCD WriteDataXLCD

/* putsXLCD
 * Writes a string of characters to the LCD
 */
void putsXLCD(PARAM_SCLASS char *);

/* putrsXLCD
 * Writes a string of characters in ROM to the LCD
 */
void putrsXLCD(PARAM_SCLASS const MEM_MODEL rom char *);
/* gotoXLCD set cursor position (add 0x40 for line2)
*/
void gotoXLCD(unsigned char pos);

void clearXLCD(void );

/* User defines these routines according to the oscillator frequency */
extern void DelayFor18TCY(void);  // 18 Tcy
extern void DelayPORXLCD(void);   // 15 ms
extern void DelayXLCD(void);      // At least 4.1ms



#endif