#define Ack	1
#define NotAck 	0

//Definition des bits sur le CPU
sbit  IntLpc14	 = P1 ^ 0;	//INT du LPC14
sbit  SDA 	 = P1 ^ 1;
sbit  SCL	 = P1 ^ 2;


/*****************Déclarations LCD*****************************/
#define clear_display  0x01 /*clears display and sets DDRAM @=0 */
#define return_home  0x02  /*sets DDRAM @=0 */
#define Ent_mod_set  0x06
#define displ_cont_curnotblink 0x0E
#define displ_cont_curblink 0x0F
#define funct_set4b_1l 0x20
#define funct_set4b_2l 0x28
#define jp_2elig 0xc0


/**************************I2C Manuel***************************************/

octet data i2c_mtd[10] ; /* tampon 10 octets à transmettre  en master trans*/ 
octet idata i2c_mrd[10] ; /* tampon 10 octets à recevoir  en master rec */

//Programme de base pour l'I2C en assembleur
//Voir I2C.A51
extern  bit EmisI2c(octet OctI2c);	//_EmisI2c(OctetAEnvoyer) retourne C=1 si octet envoyé est acquitté
//Attention,si pas ack,EmisI2c(octet OctI2c) fait le stop
extern  octet RecepI2c(octet Acqt);	//OctetAttendu=RecepI2c14m(0 ou 1) ,Acqt=0 pas d'acquit,Acqt=1 acquit
extern void StopI2c(); //Stop I2C
extern void StartI2c();//Start I2C
extern void Tempo5MicroS();//tempo 5 µS


//IntLpc14:broche du CPU relié à la broche INT du LPC14



/********************************************************************************/
/* Lecture de 1 octet frappé au clavier du LPC14 en manuel 			*/
/* a partir de l'adresse add  add= 71h si A0=0 ,retourne 0 si pb		*/
/* A effectuer quand INT du LPC14=0						*/
/* Caractere lu dans i2c_mrd[0],bit retourné=1 si OK 				*/
/* if(LecLpc14(0x71))...							*/
/********************************************************************************/
bit LecLpc14(octet add)
{
//bit ok;

StartI2c();
if(EmisI2c(add))    //Ecriture de l'adresse avec bit0=1 pour read=1
	{

     	i2c_mrd[0]=RecepI2c(Ack);//Rec et ack de l'octet
	
        StopI2c();
	
	return (Ack);
	}



else return(NotAck);


}
/**********************************************************/
/********** procedure clavLpc14 ret 00 ou caract **********/
/**********************************************************/
/* Retourne immédiatement le car lu sur Lpc14 ou 00 si aucun car entré au clavier */

octet ClavLpc14()
{
if(IntLpc14)
	return(0);
else {if(LecLpc14(0x71))
    return (i2c_mrd[0]);	
	else return(0);

      }


}
/********************************************************************************/
/* Attente de la frappe d'une touche sur LPC14					*/
/* a partir de l'adresse add/*avec add= 71h ,retourne le car frappé en ascii	*/
/* Resultat dans i2c_mrd[0],si pb i2c_mrd[0]=00                                 */
/********************************************************************************/
octet AcqCarLpc14(octet add)
{
while(IntLpc14);
if(LecLpc14(add))
    return (i2c_mrd[0]);	
else return(0);
}
/**********************************************************************************************/
/* Envoie un caractère de data dans le LPC14 pour aff LCD                                     */
/* if(AffLpc14(0x70,car)                                                                      */
/* Retourne bit=1 si OK									      */
/**********************************************************************************************/

bit AffCarLpc14(octet add,octet car)

{

bit ok;




StartI2c();
if(EmisI2c(add))    //Ecriture de l'adresse avec bit0=0 pour read=0
	{ ok=(EmisI2c(0xff)); 
	  if(!ok) return (ok);
	ok=(EmisI2c(car));
	    
	     if(!ok) return (ok);
	   

        StopI2c();


	}



else 
	ok=0;

return(ok);

}

/**********************************************************************************************/
/* Envoie un text dans le LPC14 pour aff LCD                                                  */
/* if(AffLpc14(0x70,&TextXX)                                                                  */
/* Retourne bit=1 si OK									      */
/* octet code TextXX[]={CR,LF,"text"};							      */
/**********************************************************************************************/

bit AffLpc14(add,octet code *ptr)

{

bit ok;



ok=1;
StartI2c();
if(EmisI2c(add))    //Ecriture de l'adresse avec bit0=0 pour read=0
	{ ok=(EmisI2c(0xff)); 
	  if(!ok) return (ok);
	for(;*ptr!=0;ptr++)
	    {	  ok=(EmisI2c(*ptr)); 
	     if(!ok) return (ok);
	    }

        StopI2c();


	}



else 
	ok=0;

return(ok);

}
/********************************************************************/

/**********************************************************************************************/
/* Envoie une instruction dans le LPC14 pour aff LCD                                          */
/* if(InstrLpc14(0x70,instr)                                                                  */
/* Retourne bit=1 si OK									      */
/**********************************************************************************************/

bit InstrLpc14(add,instr)

{
bit ok;

StartI2c();
if(EmisI2c(add))    //Ecriture de l'adresse avec bit0=0 pour read=0
	{ ok=(EmisI2c(0));    //Mode instruction
	 	  if(!ok) return (ok);
	  ok=(EmisI2c(instr));
	  	  if(!ok) return (ok);  

        StopI2c();
	}
else ok=0;

return(ok);
}
/**********************************************************************************************/
/* Envoie un saut de ligne au LPC14 pour aff LCD                                              */
/* ADDWrite=0x70                                                                              */
/* Retourne bit=1 si OK									      */
/**********************************************************************************************/

bit Saut2eLignLpc14(AddWrite)

{
if(InstrLpc14(AddWrite,jp_2elig))
return(1);
else return(0);
}
/**********************************************************************************************/
/* Envoie un effacement d'écran au LPC14  Prevoir tempo derrière                              */
/* Retourne bit=1 si OK									      */
/**********************************************************************************************/

bit ClearLpc14(AddWrite)

{
if(InstrLpc14(AddWrite,clear_display))
return(1);
else return(0);
}
/************************************************************************/
/*Set_DDRAM_add(add) mets le compteur d'@ du HD a l'@ voulue:add max 4fh */
/* Retourne bit=1 si OK							 */
/************************************************************************/
/*
bit SetDdramAddLpc14(octet AddWrite,octet add)     // 0<=add<=4F 

//cas de 1 seule ligne:ddram:00 a 4f utilisable,0 a 07 visualisé si 8 car 
//cas de 2 lignes 
//1° ligne:00 a 07 visible,00 a 27h utilisable 
//2° ligne:40 a 47 visible,40 a 67h utilisable 

{
add=(add | 0x80);       //Le bit d7=1 indique set DDRAM adresse
if(InstrLpc14(AddWrite,add))
return(1);
else return(0);
}
*/
/**********************************************************************************************/
/* Envoie un retour add0  au LPC14                                                            */
/* Retourne bit=1 si OK									      */
/**********************************************************************************************/

bit ReturnHomeLpc14(AddWrite)

{
if(InstrLpc14(AddWrite,return_home))
return(1);
else return(0);
}


//***************************************************************/
/*Effacement du LCD,attention a la tempo			*/
//***************************************************************/

void EffaceLcd()
{
if(!ClearLpc14(0x70))
       AffConstant(&Text102);      //Erreur lpc14
//Prevoir tempo 30mS pour clear LCD
}
//***********************************************************

