#include <68hc11.h>
#include <stdio.h>


/******************************************************************/

#define _IO_BASE 0x4000
#define LCD_CMD *(unsigned char volatile*)(_IO_BASE+0x60)	/* registre de controle */
#define LCD_DATA *(unsigned char volatile*)(_IO_BASE+0x61)/* registre de données */


#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

/*
 * 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

pokeb(LCD_CMD,0x38);  /* get attn */
   pokeb(LCD_CMD,0x38);  /* set 2 line disp */
   pokeb(LCD_CMD,0x06);  /* character entry right */
   pokeb(LCD_CMD,0x0E);  /* display control on, cursor on */
   pokeb(LCD_CMD,0x01);  /* set cursor home */



/******************************************************************/


void lcd_initisalise(void);
void lcd_retour_home(void);
void lcd_retour_home(void);
void lcd_on(void);
void lcd_off(void);
///////   void lcd_decalage_caractere(char nb);
void lcd_tempo(int cnt);
void lcd_status(void);
void lcd_efface(void);
void lcd curseur_on(void);
void lcd_curseur_off(void);
void lcd_affiche_caractere(unsigned char valeur_a_afficher);
void lcd_affiche_chaine(unsigned char *chaine_de_caractere);
void lcd_decale_gauche(unsigned char Nbr_de_decalage);
void lcd_decale_droite(unsigned char Nbr_de_decalage)

void beep(int cnt);




/******************************************************************/
void lcd_status(void)		
	{
	 /*  boucle de test : attente du changement de l'état du bit busy */
  while ((LCD_CMD & 0x80)==0x80); 
	return;
	}
	
/* autre possibilité 
while ((control_aff & 0x80) != 0x00) ;

mais aussi

if(LCD_CMD & 0x80) == 0 )
      return 1;
   else
      return 0;
}
*/
/******************************************************************/
void lcd_initisalise()
{
	
	LCD_CMD=0x38; /* mode 8 bits */
	lcd_tempo(3);
	LCD_CMD=0x06; /* mode */
	lcd_efface();	/* efface le display */
	lcd_retour_home();
	
	/*(0x38) 
  (0x14) 
  (0x0e) 
  (0x06) 
  (0x01)*/ 
	
	
	}
/******************************************************************/
void lcd_tempo(int cnt)
{
	int i;
	for(;cnt;cnt--)
	for(i=0;i<1000;i++);
}	
/******************************************************************/
void lcd_cls(void)		
	{
	lcd_status();
	LCD_CMD=0x01;	
	}
/******************************************************************/
void lcd_retour_home();
	{
	lcd_status();
	LCD_CMD=0x02; 
	}
/******************************************************************/
void lcd_on(void)
	{
	lcd_status();
	LCD_CMD=0x0C; 
	}
/******************************************************************/
void lcd_off(void)
	{
	lcd_status();
	LCD_CMD=0xB; 
	}
/******************************************************************/
void curseur_on(void)
	{
	lcd_status();
	LCD_CMD=0x0F; 
	}
/******************************************************************/
void curseur_off(void)
	{
	lcd_status();
	LCD_CMD=0x0C;
	}
/******************************************************************/
void curseur_clignotant(void)
	{ /* blink */
	lcd_status();
	
	///////////////////////////// a implementer LCD_CMD=;
	}
/******************************************************************/
void lcd_decalage_caractere(char nb)
	{
	
	lcd_tempo(10);
	
	if(nb)
	{
	lcd_status();
	LCD_CMD=0x18;	/* shift à gauche */
	}
	else
	{
	lcd_status();
	LCD_CMD=0x1F; 	/* shift à droite */
	}
	
	}
/******************************************************************/
void beep( int cnt)
	{
		do
		{
		PORTG ^=01;
		wait(7);
		PORTG ^=01;
		wait(4);
		}
		while(--cnt);
	}
/******************************************************************/
void lcd_affiche_caractere(unsigned char valeur_a_afficher)
{
    lcd_status();

    LCD_DATA = valeur_a_afficher ;	
}    
/******************************************************************/
void lcd_affiche_caractere(unsigned char valeur_a_afficher)
{
    lcd_status();

    LCD_DATA = valeur_a_afficher ;	
}    
/******************************************************************/
void lcd_affiche_chaine(unsigned char *chaine_de_caractere)
{
unsigned char nbr = 0;

    while (chaine_de_caractere[nbr] != 0x00)
    {
        lcd_affiche_caractere(chaine_de_caractere[nbr]) ;
        nbr ++ ;
    }
}
/******************************************************************/
void lcd_decale_gauche(unsigned char Nbr_de_decalage)
{
    do
    {
         lcd_status();
    		 LCD_CMD= 0x10;

        Nbr_de_decalage -- ;
    }
    while (Nbr_de_decalage > 0) ;
}
/******************************************************************/
void lcd_decale_droite(unsigned char Nbr_de_decalage)
{
    do
    {               
        lcd_status();
    		LCD_CMD= 0x14;

        Nbr_de_decalage -- ;
    }
    while (Nbr_de_decalage > 0) ;
}
/******************************************************************/

    

	
	
	
	

	
	








 