const int dataPin = 11;
const int clockPin = 9;
const int latchPin = 12;
const int buttonUp = 2;
const int buttonDown = 3;
const int buzzer = 4;
const int digit1 = 5;
const int digit2 = 6;
// ПРАВИЛЬНАЯ маска для 7-сегментного дисплея
// Порядок сегментов: A B C D E F G DP
byte digits[10] = {
0b11111100, // 0 - ABCDEF
0b01100000, // 1 - BC
0b11011010, // 2 - ABDEG
0b11110010, // 3 - ABCDG
0b01100110, // 4 - BCFG
0b10110110, // 5 - ACDFG
0b10111110, // 6 - ACDEFG
0b11100000, // 7 - ABC
0b11111110, // 8 - ABCDEFG
0b11110110 // 9 - ABCDFG
};
int counter = 0;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(buttonUp, INPUT_PULLUP);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
digitalWrite(digit1, LOW);
digitalWrite(digit2, LOW);
// Тест цифр при запуске
testDigits();
}
void loop() {
displayNumber(counter);
checkButtons();
}
void displayNumber(int number) {
int leftDigit = number / 10;
int rightDigit = number % 10;
static bool showLeft = true;
static unsigned long lastSwitch = 0;
if (millis() - lastSwitch > 3) {
if (showLeft) {
digitalWrite(digit2, LOW);
digitalWrite(digit1, HIGH);
sendToDisplay(digits[leftDigit]);
} else {
digitalWrite(digit1, LOW);
digitalWrite(digit2, HIGH);
sendToDisplay(digits[rightDigit]);
}
showLeft = !showLeft;
lastSwitch = millis();
}
}
void sendToDisplay(byte data) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data);
digitalWrite(latchPin, HIGH);
}
void checkButtons() {
static unsigned long lastUpTime = 0;
static unsigned long lastDownTime = 0;
const unsigned long debounceTime = 200;
// Кнопка ВВЕРХ
if (digitalRead(buttonUp) == LOW && millis() - lastUpTime > debounceTime) {
if (counter < 99) counter++; else beep();
lastUpTime = millis();
}
// Кнопка ВНИЗ
if (digitalRead(buttonDown) == LOW && millis() - lastDownTime > debounceTime) {
if (counter > 0) counter--; else beep();
lastDownTime = millis();
}
}
void beep() {
digitalWrite(buzzer, HIGH);
delay(150);
digitalWrite(buzzer, LOW);
}
// Функция для тестирования - показывает цифры по порядку
void testDigits() {
for (int i = 0; i < 10; i++) {
// Показываем на левом дисплее
digitalWrite(digit1, HIGH);
digitalWrite(digit2, LOW);
sendToDisplay(digits[i]);
delay(800);
}
// Показываем 00
digitalWrite(digit1, HIGH);
digitalWrite(digit2, HIGH);
sendToDisplay(digits[0]);
}