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