//Задание 1: Без использования библиотек вывести на 4х разрядный 7-сегментный дисплей
// счетчик. Если в COM порт послать число, то счетчик должен начать отсчет от
// этого числа, и до 0.
int A = 4;
int B = 8;
int C = 9;
int D = 10;
int E = 11;
int F = 12;
int G = 7;
int my_counter = 0;
unsigned long previousMillis;
const unsigned long interval = 500;
void setup() {
Serial.begin(115200);
Serial.println("Введите число: ");
// Initialize the pins of the 4 digits for the multiplexed signals.
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
}
void switch_segment(int Digit)
{
switch(Digit)
{
case 0:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
break;
case 1:
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 2:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(G, LOW);
break;
case 3:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(G, LOW);
break;
case 4:
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 5:
digitalWrite(A, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 6:
digitalWrite(A, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 7:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
break;
case 8:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 9:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
}
}
void clear_segment(){
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
}
void ShowNumber_on_Display(int l_igit, int th_digit, int sec_digit, int f_digit)
{
clear_segment();
digitalWrite(2, HIGH);
switch_segment(l_igit);
digitalWrite(2, LOW);
delay(20);
clear_segment();
digitalWrite(6, HIGH);
switch_segment(th_digit);
digitalWrite(6, LOW);
delay(20);
clear_segment();
digitalWrite(5, HIGH);
switch_segment(sec_digit);
digitalWrite(5, LOW);
delay(20);
clear_segment();
digitalWrite(3, HIGH);
switch_segment(f_digit);
digitalWrite(3, LOW);
delay(20);
clear_segment();
}
//данные в строковом массиве, 10 элементов
char s[10];
// значение предыдущего счетчика
int pred_val = 0;
void loop() {
if(Serial.available()> 0)
{
for(int i=0; i<(sizeof(s)/sizeof(s[0])); i++)
{
char data = Serial.read();
if (data != "\n")
{
s[i] = data;
}
}
my_counter = atoi(s);
Serial.println("Введенное число: " + String(my_counter));
}
// в случае не положительного и не отрицательно числа
if (my_counter >= 0 and my_counter < 10000)
{
unsigned long currentMillis = millis();
int lastdigit = my_counter % 10;
int third_digit = (my_counter / 10) % 10;
int second_digit = (my_counter / 100) % 10;
int first_digit = my_counter / 1000;
// первый варинат
// if (my_counter<1000)
// {
// first_digit = -1;
// }
// if (my_counter<100)
// {
// second_digit = -1;
// }
// if (my_counter<10)
// {
// third_digit = -1;
// }
// второй вариант более изощренный
if (my_counter / 1000 == 0)
{
first_digit = 10;
}
if ((my_counter / 1000 == 0) and ((my_counter / 100) %10 == 0))
{
second_digit = 10;
}
if (((my_counter / 10) %10 == 0)
and (my_counter / 1000 == 0)
and ((my_counter / 100) %10 == 0))
{
third_digit = 10;
}
ShowNumber_on_Display(lastdigit, third_digit, second_digit, first_digit);
if(currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
my_counter--;
pred_val = my_counter;
}
}
else
{
// перезапись счетчика, чтобы нельзя было поменять на что-то другое (<0 или >9999)
if (my_counter < 0)
{
my_counter = 0;
}
else{
my_counter = pred_val;
}
}
}