// inclusion
#include 
#include 


// augmenter la valeur si rebond multiples, diminuer si des pressions sont perdues
#define REBOND	0x40        
#define DELAI	0x10

// Prototypes
void clavier_init();
char scrute_clavier();
char recherche_touche();


// Constantes 
const char touche[17] = ".123A456B789C*0#D";		// clavier MATRICE 4x4

// Variables
unsigned char nouvelle, ancienne;

/********************************************/
void clavier_init()
{

// PortP[0-3] = output
// PortP[4-7] = input avec pull-down 
	
    DDRP = 0x0F;    	// direction (0=input, 1=output)
    PPSP = 0xF0;    	// front d'activation: rise=1 et fall=0
    PERP = 0xF0;    	// active resistance ce tirage
    
    nouvelle=0; 
    ancienne=0; 			// remise à 0 des variables
}
 /********************************************/
char scrute_clavier()
{
 	// renvoi 0 si aucune touche n'est pressée
    // sinon on retourne le code associé
	
	unsigned char colonne, compte_touche, statut_touche, retard;

    PORTP = 0x0F;     	//mise à 1 de toutes les colonnes
    statut_touche = PORTP;    	// passage de variable
    statut_touche &= 0xF0;  	// masque sur les lignes
    
    if(statut_touche != 0){ 	// si une touche est enfoncée

    	compte_touche=0;    
    
    	for(colonne = 0x01, colonne < 0x10; column <<= 1, compte_touche++)
           {
            PORTP = 0;    								// mise à 0 de toutes les colonnes
            PORTP = colonne;   							// passage de variable
            for(retard=0x20; retard > 0; retard--);		// temporisation   
            statut_touche = PTH;    
            statut_touche &= 0xF0;  					// masque les lignes
            if(statut_touche != 0)
              { 										// si la touche fait partie de la colonne
                statut_touche >>= 4;
                if(statut_touche == 0x04)
                  { statut_touche = 3;  }
                if(statut_touche == 0x08)
                  { statut_touche = 4;  }
                return(touche[(compte_touche*4) + statut_touche]);
              }
        }
    }
    return 0;   // aucune touche activée 

}
/********************************************/
char recherche_touche()
{
    long compte;  

    do{ nouvelle = scrute_clavier();   		// 
      }while(nouvelle == ancienne);   		// 

    for(compte=0; compte < REBOND ; compte ++)
       {   
         nouvelle = scrute_clavier();
         if(nouvelle == 0 || nouvelle != ancienne)
           {  compte=0; 					// remise à 0 du compteur
           }
        ancienne = nouvelle;    				// sauve la touche pour le prochain balayage
       }
    
    return(nouvelle);
}
/********************************************/


