Загрузка данных


#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);
}