//// Катоды 1 группа
#define SEG_A1 28 // 33
#define SEG_B1 29 // 32
#define SEG_C1 30 // 31
#define SEG_D1 31 // 30
#define SEG_E1 23 // 26
#define SEG_F1 22 // 25
#define SEG_G1 21 // 24
//// Катоды 2 группа
#define SEG_A2 11 // 13
#define SEG_B2 12 // 14
#define SEG_C2 13 // 15
#define SEG_D2 14 // 16
#define SEG_E2 15 // 17
#define SEG_F2 18 // 21
#define SEG_G2 19 // 22
//// Катоды 3 группа
#define SEG_A3 1 // 44
#define SEG_B3 2 // 43
#define SEG_C3 3 // 42
#define SEG_D3 4 // 41
#define SEG_E3 5 // 1
#define SEG_F3 6 // 2
#define SEG_G3 7 // 3
//// Аноды
// 34:51:23 == HH:MM:SS большые цифры > 34:51:23 === номер транзистора Q1-Q5
#define AN_1 27 // 34
#define AN_2 26 // 35
#define AN_3 25 // 36
#define AN_4 24 // 37
#define AN_5 0 // 40
long oldPosition = -999, newPosition, times;
int an, segm1, segm2, segm3, i;
byte d1, d0, h1, h0, m1, m0, s1, s0, t1, t0, ms1, ms0, g0, g1, dn;
void setup() {
cli();
TCCR2 = 0;
TCNT2 = 0;
// (8000000/((155+1)x256))=200.32051282051 Hz
OCR2 = 155;
TCCR2 |= (1 << WGM21);
// Prescaler 256
TCCR2 |= (1 << CS22) | (1 << CS21);
TIMSK |= (1 << OCIE2);
sei();
pinMode(SEG_A1, OUTPUT);
pinMode(SEG_B1, OUTPUT);
pinMode(SEG_C1, OUTPUT);
pinMode(SEG_D1, OUTPUT);
pinMode(SEG_E1, OUTPUT);
pinMode(SEG_F1, OUTPUT);
pinMode(SEG_G1, OUTPUT);
pinMode(AN_1, OUTPUT);
pinMode(AN_2, OUTPUT);
pinMode(AN_3, OUTPUT);
pinMode(AN_4, OUTPUT);
pinMode(AN_5, OUTPUT);
pinMode(SEG_A2, OUTPUT);
pinMode(SEG_B2, OUTPUT);
pinMode(SEG_C2, OUTPUT);
pinMode(SEG_D2, OUTPUT);
pinMode(SEG_E2, OUTPUT);
pinMode(SEG_F2, OUTPUT);
pinMode(SEG_G2, OUTPUT);
pinMode(SEG_A3, OUTPUT);
pinMode(SEG_B3, OUTPUT);
pinMode(SEG_C3, OUTPUT);
pinMode(SEG_D3, OUTPUT);
pinMode(SEG_E3, OUTPUT);
pinMode(SEG_F3, OUTPUT);
pinMode(SEG_G3, OUTPUT);
}
void loop() {
d0 = 10; // дата _1
d1 = 10; // дата 1_
m0 = 10; // мин _0
m1 = 10; // мин 1_
h1 = 10; //
h0 = 10;
g1 = 10; // год 1_
g0 = 10; // год _1
ms1 = 10;
ms0 = 10;
s1 = 10;
s0 = 10;
t1 = 10;
t0 = 10;
dn = 10;
delay(1000);
}
ISR(TIMER2_COMPA_vect){
switch (i) {
// Q1
case 0: segm1 = 10; segm2 = 10; segm3 = 10; segment_1(); segment_2(); segment_3(); an = 5; anod(); delayMicroseconds(200);
segm2 = m0; segm1 = d0; segm3 = g1; an = 0; anod(); segment_1(); segment_2(); segment_3(); break;
// Q2
case 1: segm1 = 10; segm2 = 10; segm3 = 10; segment_1(); segment_2(); segment_3(); an = 5; anod(); delayMicroseconds(200);
segm2 = s1; segm1 = dn; segm3 = g0; an = 1; anod(); segment_1(); segment_2(); segment_3(); break;
// Q3
case 2: segm1 = 10; segm2 = 10; segm3 = 10; segment_1(); segment_2(); segment_3(); an = 5; anod(); delayMicroseconds(200);
segm1 = h1; segm2 = s0; segm3 = ms1; an = 2; anod(); segment_1(); segment_2(); segment_3(); break;
// Q4
case 3: segm1 = 10; segm2 = 10; segm3 = 10; segment_1(); segment_2(); segment_3(); an = 5; anod(); delayMicroseconds(200);
segm1 = h0; segm2 = t1; segm3 = ms0; an = 3; anod(); segment_1(); segment_2(); segment_3(); break;
// Q5
case 4: segm1 = 10; segm2 = 10; segm3 = 10; segment_1(); segment_2(); segment_3(); an = 5; anod(); delayMicroseconds(200);
segm1 = m1; segm2 = t0; segm3 = d1; an = 4; anod(); segment_1(); segment_2(); segment_3(); break;
}
i++; if (i > 4) {
i = 0;
}
}
void segment_1() {
switch (segm1) {
// A B C D E F G
case 0: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 0); ch(SEG_F1, 0); ch(SEG_G1, 1); break; // 0
case 1: ch(SEG_A1, 1); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 1); ch(SEG_E1, 1); ch(SEG_F1, 1); ch(SEG_G1, 1); break; // 1
case 2: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 1); ch(SEG_D1, 0); ch(SEG_E1, 0); ch(SEG_F1, 1); ch(SEG_G1, 0); break; // 2
case 3: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 1); ch(SEG_F1, 1); ch(SEG_G1, 0); break; // 3
case 4: ch(SEG_A1, 1); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 1); ch(SEG_E1, 1); ch(SEG_F1, 0); ch(SEG_G1, 0); break; // 4
case 5: ch(SEG_A1, 0); ch(SEG_B1, 1); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 1); ch(SEG_F1, 0); ch(SEG_G1, 0); break; // 5
case 6: ch(SEG_A1, 0); ch(SEG_B1, 1); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 0); ch(SEG_F1, 0); ch(SEG_G1, 0); break; // 6
case 7: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 1); ch(SEG_E1, 1); ch(SEG_F1, 1); ch(SEG_G1, 1); break; // 7
case 8: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 0); ch(SEG_F1, 0); ch(SEG_G1, 0); break; // 8
case 9: ch(SEG_A1, 0); ch(SEG_B1, 0); ch(SEG_C1, 0); ch(SEG_D1, 0); ch(SEG_E1, 1); ch(SEG_F1, 0); ch(SEG_G1, 0); break; // 9
case 10: ch(SEG_A1, 1); ch(SEG_B1, 1); ch(SEG_C1, 1); ch(SEG_D1, 1); ch(SEG_E1, 1); ch(SEG_F1, 1); ch(SEG_G1, 1); break; // пусто
}
}
void segment_2() {
switch (segm2) {
// A B C D E F G
case 0: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 0); ch(SEG_F2, 0); ch(SEG_G2, 1); break; // 0
case 1: ch(SEG_A2, 1); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 1); ch(SEG_E2, 1); ch(SEG_F2, 1); ch(SEG_G2, 1); break; // 1
case 2: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 1); ch(SEG_D2, 0); ch(SEG_E2, 0); ch(SEG_F2, 1); ch(SEG_G2, 0); break; // 2
case 3: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 1); ch(SEG_F2, 1); ch(SEG_G2, 0); break; // 3
case 4: ch(SEG_A2, 1); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 1); ch(SEG_E2, 1); ch(SEG_F2, 0); ch(SEG_G2, 0); break; // 4
case 5: ch(SEG_A2, 0); ch(SEG_B2, 1); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 1); ch(SEG_F2, 0); ch(SEG_G2, 0); break; // 5
case 6: ch(SEG_A2, 0); ch(SEG_B2, 1); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 0); ch(SEG_F2, 0); ch(SEG_G2, 0); break; // 6
case 7: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 1); ch(SEG_E2, 1); ch(SEG_F2, 1); ch(SEG_G2, 1); break; // 7
case 8: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 0); ch(SEG_F2, 0); ch(SEG_G2, 0); break; // 8
case 9: ch(SEG_A2, 0); ch(SEG_B2, 0); ch(SEG_C2, 0); ch(SEG_D2, 0); ch(SEG_E2, 1); ch(SEG_F2, 0); ch(SEG_G2, 0); break; // 9
case 10: ch(SEG_A2, 1); ch(SEG_B2, 1); ch(SEG_C2, 1); ch(SEG_D2, 1); ch(SEG_E2, 1); ch(SEG_F2, 1); ch(SEG_G2, 1); break; // пусто
}
}
void segment_3() {
switch (segm3) {
// A B C D E F G
case 0: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 0); ch(SEG_F3, 0); ch(SEG_G3, 1); break; // 0
case 1: ch(SEG_A3, 1); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 1); ch(SEG_E3, 1); ch(SEG_F3, 1); ch(SEG_G3, 1); break; // 1
case 2: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 1); ch(SEG_D3, 0); ch(SEG_E3, 0); ch(SEG_F3, 1); ch(SEG_G3, 0); break; // 2
case 3: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 1); ch(SEG_F3, 1); ch(SEG_G3, 0); break; // 3
case 4: ch(SEG_A3, 1); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 1); ch(SEG_E3, 1); ch(SEG_F3, 0); ch(SEG_G3, 0); break; // 4
case 5: ch(SEG_A3, 0); ch(SEG_B3, 1); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 1); ch(SEG_F3, 0); ch(SEG_G3, 0); break; // 5
case 6: ch(SEG_A3, 0); ch(SEG_B3, 1); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 0); ch(SEG_F3, 0); ch(SEG_G3, 0); break; // 6
case 7: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 1); ch(SEG_E3, 1); ch(SEG_F3, 1); ch(SEG_G3, 1); break; // 7
case 8: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 0); ch(SEG_F3, 0); ch(SEG_G3, 0); break; // 8
case 9: ch(SEG_A3, 0); ch(SEG_B3, 0); ch(SEG_C3, 0); ch(SEG_D3, 0); ch(SEG_E3, 1); ch(SEG_F3, 0); ch(SEG_G3, 0); break; // 9
case 10: ch(SEG_A3, 1); ch(SEG_B3, 1); ch(SEG_C3, 1); ch(SEG_D3, 1); ch(SEG_E3, 1); ch(SEG_F3, 1); ch(SEG_G3, 1); break; // пусто
}
}
void anod() {
switch (an) {
case 0: ch(AN_1, 1); ch(AN_2, 0); ch(AN_3, 0); ch(AN_4, 0); ch(AN_5, 0); break;
case 1: ch(AN_1, 0); ch(AN_2, 1); ch(AN_3, 0); ch(AN_4, 0); ch(AN_5, 0); break;
case 2: ch(AN_1, 0); ch(AN_2, 0); ch(AN_3, 1); ch(AN_4, 0); ch(AN_5, 0); break;
case 3: ch(AN_1, 0); ch(AN_2, 0); ch(AN_3, 0); ch(AN_4, 1); ch(AN_5, 0); break;
case 4: ch(AN_1, 0); ch(AN_2, 0); ch(AN_3, 0); ch(AN_4, 0); ch(AN_5, 1); break;
case 5: ch(AN_1, 0); ch(AN_2, 0); ch(AN_3, 0); ch(AN_4, 0); ch(AN_5, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}