//Entrees
//Memoire image
bool I[3];
//Identification des broches
const uint8_t bp1 = 2;
const uint8_t bp2 = 3;
const uint8_t bp3 = 4;
//Anti-rebonds
const uint8_t debounce_Delay = 20;
uint32_t I_Debounced;
uint32_t debounce_ST[3];
//Sorties
//Memoire image
bool O[1];
//Identification des broches
const uint8_t led = 5;
//Bits internes
bool B[6];
//Prototypes
bool LireEntree(bool, bool, uint8_t, uint8_t, uint8_t, int);
void setup() {
// Configuration des broches (entrees)
pinMode(bp1, INPUT_PULLUP);
pinMode(bp2, INPUT_PULLUP);
pinMode(bp3, INPUT_PULLUP);
// Initialisation pour anti-rebonds
I_Debounced = 0b11111111111111111111111111111111;
// Configuration des broches (sorties)
pinMode(led, OUTPUT);
// Initialisation des bits internes
memset(B, false, sizeof(B));
}
void loop() {
// Acquisition des entrees
I[0] = LireEntree(true,I[0],0,0,bp1,LOW);
I[1] = LireEntree(true,I[1],1,1,bp2,LOW);
I[2] = LireEntree(true,I[2],2,2,bp3,LOW);
//Traitement des bits internes
B[0] = I[0] && !(B[1]);
B[1] = I[0];
B[2] = I[1] && !(B[3]);
B[3] = I[1];
B[4] = I[2] && !(B[5]);
B[5] = I[2];
//Traitement des sorties
O[0] = !(O[0]) && (B[0] || B[2] || B[4]) || O[0] && !(B[0]) && !(B[2]) && !(B[4]);
// Ecriture des sorties
digitalWrite(led, O[0] ? HIGH : LOW);
}
bool LireEntree(bool toDebounce, bool imageEntree, uint8_t index, uint8_t index_debounce, uint8_t pin, int level)
{
if(toDebounce == false){
return (digitalRead(pin) == level);
}
if((I_Debounced & (1<<index)) != 0){
bool I_lu = (digitalRead(pin) == level);
if(imageEntree != I_lu){
debounce_ST[index_debounce] = millis();
I_Debounced = I_Debounced & ~(1<<index);
}
return I_lu;
}
else{
if((millis()- debounce_ST[index_debounce]) >= debounce_Delay){
I_Debounced = I_Debounced | (1<<index);
return LireEntree(toDebounce,imageEntree,index,index_debounce,pin,level);
}
else{
return imageEntree;
}
}
}