#define Seg_A 2
#define Seg_B 3
#define Seg_C 4
#define Seg_D 5
#define Seg_E 6
#define Seg_F 8
#define Seg_G 7
// пины для управления цифрами на индикаторе
#define Dig_1 9
#define Dig_2 10
#define Dig_3 11
#define Dig_4 12
int counter;
// массив с данными для индикатора, неработающий сегмент = 0
int Number[10][8] = {
{Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,0},
{0,Seg_B,Seg_C,0,0,0,0},
{Seg_A,Seg_B,0,Seg_D,Seg_E,0,Seg_G},
{Seg_A,Seg_B,Seg_C,Seg_D,0,0,Seg_G},
{0,Seg_B,Seg_C,0,0,Seg_F,Seg_G},
{Seg_A,0,Seg_C,Seg_D,0,Seg_F,Seg_G},
{Seg_A,0,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
{Seg_A,Seg_B,Seg_C,0,0,0,0},
{Seg_A,Seg_B,Seg_C,Seg_D,Seg_E,Seg_F,Seg_G},
{Seg_A,Seg_B,Seg_C,Seg_D,0,Seg_F,Seg_G},
};
void setup() {
// инициализация индикатора вместе с выбором
pinMode(Seg_A, OUTPUT);
pinMode(Seg_B, OUTPUT);
pinMode(Seg_C, OUTPUT);
pinMode(Seg_D, OUTPUT);
pinMode(Seg_E, OUTPUT);
pinMode(Seg_F, OUTPUT);
pinMode(Seg_G, OUTPUT);
pinMode(Dig_1, OUTPUT);
pinMode(Dig_2, OUTPUT);
pinMode(Dig_3, OUTPUT);
pinMode(Dig_4, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
for (counter = 0; counter < 9999; counter ++)
{
int a = counter / 1000;
int b = (counter % 1000) / 100;
int c = (counter % 100)/ 10;
int d = counter % 10;
Serial.print(String(a)+" ");
Serial.print(String(b)+" ");
Serial.print(String(c)+" ");
Serial.println(String(d)+" ");
// прижать общий контакт старшей цифры к земле
//digitalWrite(Dig_1, LOW);
// выдать первую цифру с минимальной задержкой
// Number_Take(a,20);
// поднять общий контакт - цифра погаснет
//digitalWrite(Dig_1, HIGH);
// аналогично прижать общий контакт младшей цифры
//digitalWrite(Dig_2, LOW);
// выдать вторую цифру и после поднять обратно общий контакт
Number_Take(b,20);
//digitalWrite(Dig_2, HIGH);
//digitalWrite(Dig_3, LOW);
// выдать вторую цифру и после поднять обратно общий контакт
//Number_Take(c,20);
//digitalWrite(Dig_3, HIGH);
digitalWrite(Dig_4, LOW);
// выдать вторую цифру и после поднять обратно общий контакт
Number_Take(d,20);
digitalWrite(Dig_4, HIGH);
// задержка 100 мс - цифры мигают, а 50 мс - нормально
delay(50);
}
}
// процедура выдачи нужной цифры с заданной задержкой
void Number_Take(int num, int del)
{
for(int i = 0; i<8; i++)
{
int a = Number[num][i];
if (a != 0)
{
digitalWrite(a, HIGH);
}
}
delay(del);
for(int i = 0; i<10; i++)
{
int a = Number[num][i];
if (a != 0)
{
digitalWrite(a, LOW);
}
}
}