#define COMMON_CATHODE true // false, если общий анод
const byte segPins[7] = {2, 3, 4, 5, 6, 7, 8}; // A B C D E F G
const byte digPins[4] = {9, 10, 11, 12};
const byte btnPin = 13;
// A B C D E F G
const byte digits[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
int counter = 0;
bool lastBtn = HIGH;
unsigned long lastPress = 0;
void setup() {
for (byte i = 0; i < 7; i++) pinMode(segPins[i], OUTPUT);
for (byte i = 0; i < 4; i++) pinMode(digPins[i], OUTPUT);
pinMode(btnPin, INPUT_PULLUP);
}
void showDigit(byte pos, byte num) {
// выключить все разряды
for (byte i = 0; i < 4; i++)
digitalWrite(digPins[i], COMMON_CATHODE ? HIGH : LOW);
// выставить сегменты
for (byte s = 0; s < 7; s++) {
bool on = digits[num][s];
digitalWrite(segPins[s], COMMON_CATHODE ? on : !on);
}
// включить нужный разряд
digitalWrite(digPins[pos], COMMON_CATHODE ? LOW : HIGH);
delay(2);
}
void loop() {
// кнопка с защитой от дребезга
bool btn = digitalRead(btnPin);
if (lastBtn == HIGH && btn == LOW && millis() - lastPress > 200) {
counter++;
if (counter > 9999) counter = 0;
lastPress = millis();
}
lastBtn = btn;
// динамическая индикация
showDigit(0, counter / 1000);
showDigit(1, (counter / 100) % 10);
showDigit(2, (counter / 10) % 10);
showDigit(3, counter % 10);
}