#define MASQUE_CLAVIER B00001111
#define MASQUE_AFFICHEUR B11111100
#define MASQUE_BP B11110000
#define POINT_DECIMAL B00000100
#define EXTINCTION B01111111
#define NETTOYAGE B10000111
#define CODE_ERREUR 255
byte clavier;
void setup(){
//Initialisation des directions de ports
DDRD = DDRD | MASQUE_AFFICHEUR; //Gestion afficheur
DDRB = DDRB & MASQUE_BP; //Gestion des BP
Serial.begin(9600);
}
void loop(){
//Lecture du clavier
clavier = lectureClavier();
Serial.print("Clavier : ");
Serial.println(clavier);
//Ecriture sur l'afficheur
ecritureAfficheur(clavier);
}
// FONCTIONS
//Fonction de lecture du clavier
byte lectureClavier(){
byte valeur;
valeur = PINB & MASQUE_CLAVIER;
// valeur = valeur >> 2; //On décale la valeur de 2 positions vers la droite pour avoir la valeur binaire correspondante
if(valeur > 9){
valeur=CODE_ERREUR; //En cas d'erreur, on renvoie un code
}
return(valeur);
}
//Fonction de gestion de l'affichage
void ecritureAfficheur(byte clav){
bool erreur=false;
//Gestion des erreurs
if(clav == CODE_ERREUR){
erreur=true;
}else{
erreur=false;
}
//allumage ou pas du point décimal (fonction de l'erreur)
gereErreur(erreur);
//Affichage valeur sur afficheur 7 seg.
afficheValeur(clav);
}
//Fonction de gestion d'erreur allumage point décimal
void gereErreur(bool err){
if(err){
PORTD = PORTD & EXTINCTION; //Extinction de l'afficheur
PORTD = PORTD | POINT_DECIMAL; //Allumage point décimal
}
else{
PORTD = PORTD | ~EXTINCTION;
PORTD = PORTD & ~POINT_DECIMAL;
}
}
void afficheValeur(byte val){
PORTD = PORTD & NETTOYAGE;//On nettoie (pour effacer précédente valeur)
PORTD = PORTD | (val << 3); // Le code du clavier est décalé de 3 positions pour correspondre aux bits de commande du CD4511
delay(500);
}