#define IRWRIN *(unsigned char volatile*)(_IO_BASE+0x60)
#define DR_WRITIN *(unsigned char volatile*)(_IO_BASE+0x61)
#define right 1
#define left 0



#define LIGNE_1      0x80                // position de la ligne 1
#define LIGNE_2      0xC0                // position de la ligne 2
#define LIGNE_3      0x94                // position de la ligne 3
#define LIGNE_4      0xD4                // position de la ligne 4

// I/O Port Addresses


#define _LCD_BASE 0x4000
#define LCDcmmd	*(unsigned char volatile *)(_LCD_BASE + 0x00)
#define LCDdata	*(unsigned char volatile *)(_LCD_BASE + 0x01)

void InitLCD()

#define LCD_CMD  *(unsigned char *)(_IO_BASE + 0xA5F0)
#define LCD_DAT  *(unsigned char *)(_IO_BASE + 0xA5F1)
#define AUX_A    *(unsigned char *)(_IO_BASE + 0xA5F4)
#define AUX_C    *(unsigned char *)(_IO_BASE + 0xA5F6)
#define AUX_CON  *(unsigned char *)(_IO_BASE + 0xA5F7)



/*
 * Commands that can be sent to the LCD
 */
#define LCD_CLEAR			0x01
#define LCD_HOME			0x02
#define LCD_ENTRY_MODE			0x04
#define LCD_ENTRY_CURSOR_RIGHT		0x02
#define LCD_ENTRY_DISPLAY_SCROLL 	0x01
#define LCD_CTRL_ON			0x0C
#define LCD_CTRL_CURSOR 		0x0A
#define LCD_CTRL_BLINK			0x09
#define LCD_SCROLL_CURSOR		0x10
#define LCD_SCROLL_DISPLAY 		0x18
#define LCD_SCROLL_RIGHT		0x04
#define LCD_SCROLL_LEFT			0x00 /* for completeness */
#define LCD_FCN_8BIT			0x30
#define LCD_FCN_4BIT			0x20
#define LCD_FCN_DUTY			0x08
#define LCD_FCN_BIG			0x04
#define LCD_CHAR_ADDR			0x40
#define LCD_CHAR_MASK			0x3F
#define LCD_DISP_ADDR			0x80
#define LCD_DISP_MASK			0x7F

#define    LCD_16X1 	0
#define    LCD_16X2	1
#define    LCD_20X1	2
#define    LCD_20X2	3
#define    LCD_20X4	4
#define    LCD_40X2	5


// Passage en mode 4 bits	$20
//                 8 bits 
// Effacement		$01
// Retour au début de ligne $02
// Pas de curseur	$0C
// Curseur se déplace vers la droite	$06
// Passage en ligne suivante	$C0
// Retour en première ligne	$80
// Curseur clignotant 	0F

void lcd_initialise(void);
//void rtn_home(void);
//void lcd_on(void);
//void lcd_off(void);
//void lcd_shift(char nb_sh);
//void lcdwait(int cnt);
//void status(void);
//void lcd_cls(void);
//void curs_on(void);
//void curs_off(void);
//char getkey(void);

void lcd_initialise(void)
{
	IRWRIN=0x38; /* mode 8 bits */
	lcd_tempo(3);
	IRWRIN=0x06; /* mode */
	lcd_efface();	/* efface tout l'afficheur  */
	retour_chariot();
}

void retour_chariot(void)
{
	status();
	IRWRIN=0x02; 
}

void
lcd_on(void)
	{
	status();
	IRWRIN=0x0C; /* disp on */
	}

void
lcd_off(void)
	{
	status();
	IRWRIN=0xB; /* disp off */
	}

void curseur_ON(void)
	{
	status();
	IRWRIN=0x0F; 
	}
void curseur_off(void)
	{
	status();
	IRWRIN=0x0C;
	}

void
lcd_shift(char nbsh)
	{
	lcdwait(10);
	if (nb_sh)
	{
	status();
	IRWRIN=0x18;	/* shift à gauche */
	}
	else
	{
	status();
	IRWRIN=0x1F; 	/* shift à droite */
	}
	}
void status(void)		/* attend que l'afficheur soit pret à recevoir une commande */
	{
	while ((IRWRIN & 0x80)==0x80); /* attente busy */
	return;
	}

void lcd_efface(void)		/* effacement de l'afficheur */
{
	status();
	IRWRIN=1;	
}

void lcd_tempo(int cnt)
{
	int i;
	for(;cnt;cnt--)
	for(i=0;i<1000;i++);
}



//////////////////////////////////////////////////////////////////////
void main(void)
{
	

	// Initialize the LCD
    LCD_Commande(0x3C);                 // initialize command
    LCD_Commande(0x0C);                 // display on, cursor off
    LCD_Commande(0x06);
    LCD_Commande(0x01);

    // Display Header Information on LCD
    LCD_Command(LINE_1);               // goto lcd line 1
    LCDprint("Keypad Test");
    LCD_Command(LINE_2);               // goto lcd line 2
    LCDprint("Press Keys");
    LCD_Command(LINE_3);               // goto lcd line 3

	// main loop .. endless
	for( ; ;){

		if(kbhit()){				// if new key pressed
			cprint(NewKey);			// display it
		}

	}
}





/**************************************************************************/
/*    Initialisation de l'afficheur                                       */
/**************************************************************************/
void LCD_initialise(void)
{
    LCD_Commande (0x38) ; // modes 8 bits + 2 lignes
//	LCD_Commande (0x30) ; // modes 8 bits + 1 lignes
	
	LCD_Commande(0x0C);  // display on, cursor off
	LCD_Commande (0x14) ;
    LCD_Commande (0x0e) ;
    LCD_Commande (0x06) ;
    LCD_Commande (0x01) ; // efface tout l'écran
}

/************************************************************/
/*    Envoi d'une commande à l'afficheur                    */
/************************************************************/
void LCD_Commande(unsigned char cval)
{
    LCD_busy();                         
    LCD_CMD = cval;                     
}
/************************************************************/
/*    Attend que l'afficheur rende la main                  */
/************************************************************/
void LCD_busy()
{
    while ((LCD_CMD & 0x80) != 0x00) ;   //	on peut écrire aussi (LCD_CMD & 0x80) == 0x80);
}

/************************************************************/
/*    Affiche une chaîne de caractére                       */
/************************************************************/
void affiche_chaine(char *sptr)
{
	while( *sptr )
	    { affiche_caractere(*sptr);
		  ++sptr;
	    }
}
/************************************************************/
/*    Affiche un caractére    								*/
/************************************************************/
void affiche_caractere(char dval)
{
    LCD_busy();                         
    LCD_DAT = dval;                     
}
/********************************************************************************/
/*    Commande d'effacement de l'afficheur (curseur au début de la ligne 1)     */
/********************************************************************************/
void efface_LCD(void)
{
    LCD_Commande(0x01);
}
/********************************************************************************/
/*    Commande de décalage du curseur à gauche                                  */
/********************************************************************************/
void DECALE_GAUCHE(unsigned char Nbr_de_decalage)
{
    do
    {
        AFFICHEC (0x10) ;

        Nbr_de_decalage -- ;
    }
    while (Nbr_de_decalage > 0) ;
}

/********************************************************************************/
/*    Commande de décalage du curseur à droite                                  */
/********************************************************************************/
void DECALE_DROITE(unsigned char Nbr_de_decalage)
{
    do
    {
        AFFICHEC (0x14) ;

        Nbr_de_decalage -- ;
    }
    while (Nbr_de_decalage > 0) ;
}

/********************************************************************************/
/*    Affichage d'une chaine de caractère à la position actuelle du curseur     */
/********************************************************************************/
void CHAINE(unsigned char *chaine_de_caractere)
{
unsigned char nbr = 0, valeur_a_afficher ;

    while (chaine_de_caractere[nbr] != 0x00)
    {
        AFFICHED (chaine_de_caractere[nbr]) ;
        nbr ++ ;
    }
}

/********************************************************************************/
/*    Positionnement du curseur                                                 */
/********************************************************************************/
void gotoxy(unsigned char x, unsigned char y)
{
    x -- ;
    y -- ;
    AFFICHEC (0x80 + x + (y * 0x40)) ;
}
/********************************************************************************/
/*    Active le curseur                                                 */
/********************************************************************************/
void curseur_ON(void)
{
 	 LCD_Commande(0x0F);
}
/********************************************************************************/
/*    Cache le curseur                                                          */
/********************************************************************************/
void curseur_OFF(void)
{
 	 LCD_Commande(0x0C);
}







	