//Задание 1: Без использования библиотек вывести на 4х разрядный 7-сегментный дисплей
// счетчик. Если в COM порт послать число, то счетчик должен начать отсчет от
// этого числа, и до 0.
int segments_mass[] = {6, 7, 8, 9, 10, 11, 12};
byte numberSegments[] = { // Всего цифр 10, поэтому в массиве 10 чисел.
0b00111111, //цифра 0
0b00000110, //цифра 1
0b01011011, //цифра 2
0b01001111, //цифра 3
0b01100110, //цифра 4
0b01101101, //цифра 5
0b01111101, //цифра 6
0b00000111, //цифра 7
0b01111111, //цифра 8
0b01101111, //цифра 9
};
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.
for(int i = 0; i < sizeof(segments_mass); i++)
{
pinMode(segments_mass[i], OUTPUT);
}
}
void clear_segment()
{
for(int i=0; i<sizeof(segments_mass); i++)
{
digitalWrite(segments_mass[i], HIGH);
}
}
void show_digit_segment(int mask_)
{
for (int j=0; j<sizeof(segments_mass); j++)
{
boolean stateSegment = bitRead(mask_, j);
digitalWrite(segments_mass[j], !stateSegment);
}
}
void ShowNumber_on_Display_easy(int my_mass[])
{
clear_segment();
int mask = numberSegments[my_mass[0]];
digitalWrite(2, HIGH);
show_digit_segment(mask);
digitalWrite(2, LOW);
delay(10);
clear_segment();
mask = numberSegments[my_mass[1]];
digitalWrite(3, HIGH);
show_digit_segment(mask);
digitalWrite(3, LOW);
delay(10);
clear_segment();
mask = numberSegments[my_mass[2]];
digitalWrite(4, HIGH);
show_digit_segment(mask);
digitalWrite(4, LOW);
delay(10);
clear_segment();
mask = numberSegments[my_mass[3]];
digitalWrite(5, HIGH);
show_digit_segment(mask);
digitalWrite(5, LOW);
delay(10);
clear_segment();
}
//данные в строковом массиве, 10 элементов
char s[10];
// значение предыдущего счетчика
int pred_val = 0;
void loop() {
if(Serial.available()> 0)
{
for(int i=0; i<sizeof(s); 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 mass[4] = {};
mass[0] = my_counter / 1000;
mass[1] = (my_counter / 100) % 10;
mass[2] = (my_counter / 10) % 10;
mass[3] = my_counter % 10;
// убираем нули у 1000, 100, 10
if (my_counter<1000)
{
mass[0] = -1;
}
if (my_counter<100)
{
mass[1] = -1;
}
if (my_counter<10)
{
mass[2] = -1;
}
ShowNumber_on_Display_easy(mass);
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;
}
}
}