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


5641AS общий анод
// Секундомер 1-60 секунд
// Arduino UNO


#define segA 2
#define segB 3
#define segC 4
#define segD 5
#define segE 6
#define segF 7
#define segG 8
#define segDP A0



#define digit1 13
#define digit2 12
#define digit3 11
#define digit4 10



#define buttonPin 9




byte numbers[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 displayNumber[4] = {0,0,0,0};

unsigned long oldTime = 0;

byte seconds = 0;

bool running = false;

byte clicks = 0;

bool oldButton = HIGH;

bool dotState = false;




void setup()
{
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  pinMode(segDP, OUTPUT);

  pinMode(digit1, OUTPUT);
  pinMode(digit2, OUTPUT);
  pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT);

  pinMode(buttonPin, INPUT_PULLUP);

  digitalWrite(segDP, HIGH);


  digitalWrite(digit1, LOW);
  digitalWrite(digit2, LOW);
  digitalWrite(digit3, LOW);
  digitalWrite(digit4, LOW);

  convertNumber();
}


void loop()
{
  checkButton();

  if(running)
  {
    if(millis() - oldTime >= 1000)
    {
      oldTime = millis();

      seconds++;


      if(seconds > 60)
      {
        seconds = 1;
      }


      dotState = !dotState;

      if(dotState)
        digitalWrite(segDP, LOW);
      else
        digitalWrite(segDP, HIGH);

      convertNumber();
    }
  }

  showDisplay();
}



void checkButton()
{
  bool button = digitalRead(buttonPin);
  if(oldButton == HIGH && button == LOW)
  {
    clicks++;

    if(clicks == 1)
    {
      running = true;
      oldTime = millis();
    }

    // 2 нажатие = STOP
    else if(clicks == 2)
    {
      running = false;
    }

    else if(clicks == 3)
    {
      running = false;
      seconds = 0;
      clicks = 0;

      dotState = false;
      digitalWrite(segDP, HIGH);

      convertNumber();
    }

    delay(200);
  }

  oldButton = button;
}



void convertNumber()
{
  displayNumber[0] = 0;
  displayNumber[1] = 0;

  displayNumber[2] = seconds / 10;
  displayNumber[3] = seconds % 10;
}



void showDisplay()
{
  int digs[4] =
  {
    digit1,
    digit2,
    digit3,
    digit4
  };

  for(int i = 0; i < 4; i++)
  {

    digitalWrite(digit1, LOW);
    digitalWrite(digit2, LOW);
    digitalWrite(digit3, LOW);
    digitalWrite(digit4, LOW);


    setSegments(displayNumber[i]);


    digitalWrite(digs[i], HIGH);

    delay(3);
  }
}


void setSegments(byte n)
{
  digitalWrite(segA, !numbers[n][0]);
  digitalWrite(segB, !numbers[n][1]);
  digitalWrite(segC, !numbers[n][2]);
  digitalWrite(segD, !numbers[n][3]);
  digitalWrite(segE, !numbers[n][4]);
  digitalWrite(segF, !numbers[n][5]);
  digitalWrite(segG, !numbers[n][6]);
}