#define DATA 2
#define LATCH 3
#define CLOCK 4
#define D1 5
#define D2 6
#define D3 7
#define D4 8
#define BPLUS 9
#define BMINUS 10
#define MIN 0;
#define MAX 999;
byte digits[] {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110, // 9
};
int display = 1;
int num = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(BPLUS, INPUT);
pinMode(BMINUS, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
setDisplay();
setNumber();
displayNumber();
}
void setDisplay() {
switch (display) {
case 1:
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
display = 2;
break;
case 2:
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
display = 3;
break;
case 3:
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
display = 4;
break;
case 4:
digitalWrite(D1, LOW);
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
display = 1;
break;
}
}
void setNumber() {
if (digitalRead(BPLUS) == HIGH && num < 999) {
num++;
delay(250);
}
if (digitalRead(BMINUS) == HIGH && num > 0) {
num--;
delay(250);
}
}
void displayNumber() {
byte digit = getDigit();
// set the latch pin on low to notify the 74HC595 chip it is receiving data
digitalWrite(LATCH, LOW);
// send the data of the digit at the index corresponding to the user's input (from 0 to 15)
shiftOut(DATA, CLOCK, LSBFIRST, digit);
// set the latch pin on high to notify the 74HC595 chip that it is no longer receiving data
digitalWrite(LATCH, HIGH);
delay(500);
}
byte getDigit() {
int idx = 0;
switch (display) {
case 1:
idx = (num / 1000) % 10; // sélectionne l'index du digit des milliers
break;
case 2:
idx = (num / 100) % 10; // sélectionne l'index du digit des centaines
break;
case 3:
idx = (num / 10) % 10; // sélectionne l'index du digit des dizaines
break;
case 4:
idx = num % 10; // sélectionne l'index du digit des unités
break;
}
byte d = digits[idx];
Serial.print("display : ");
Serial.print(display);
Serial.print(" | num : ");
Serial.print(num);
Serial.print(" | idx : ");
Serial.print(idx);
Serial.print(" | d : ");
Serial.print(d);
Serial.print("\n");
return d;
}