int firstSegmentPin = 2; // подключение 1-го сегмента (А) к пину //объявляем и инициализируем переменную
int segmentCount = 8; // Сколько всего сегментов подключаем //объявляем и инициализируем переменную
int gigitCount = 4; // объявляем и инициализируем переменную для количества знаков на дисплее//кол-во разрядов
int val; //объявляем переменную для перебора всех чисел от 0 до 9999 и, наоборот
int boolPer; //объявляем переменную для отслеживания выбранной цифры - 0 или 1
//массив байтов, где каждый байт - конкретная цифра
byte numberSegments[10] = {
0b00111111, //цифра 0
0b00000110, //цифра 1
0b01011011, //цифра 2
0b01001111, //цифра 3
0b01100110, //цифра 4
0b01101101, //цифра 5
0b01111101, //цифра 6
0b00000111, //цифра 7
0b01111111, //цифра 8
0b01101111, //цифра 9
};
//массив байтов, где каждый байт - конкретный знак на дисплее
byte digit[5] = { // Какой порядок высветить.
0b00000000, //очистка экрана
0b00001000, //единицы
0b00000100, //десятки
0b00000010, //сотни
0b00000001, //тысячи
};
void setup() {
for (int i = 0; i <= segmentCount + gigitCount; i++) {
pinMode(i + firstSegmentPin, OUTPUT); // устанавливаем режим работы для всех сегментов - выход
}
Serial.begin(9600);// подключаем монитор последовательного порта или COM-порта
Serial.println("Введите 0 или 1, соответственно, для счётчика от 9999 до 0 или от 0 до 9999:");
// выводим текст на монитор 1 раз
}
void loop() {
if (Serial.available() > 0) //если есть доступные данные
{
char predVal = Serial.read(); //считываем байт
if (predVal == '1') //если получена единица
{
boolPer = 1; //то выбрана 1
val = 0; //то счётчик начнётся с 0
Serial.println(predVal);
//то выводим полученный текст на монитор с следующим за ним символом переноса строки
}
if (predVal == '0')
{
boolPer = 0; //то выбран 0
val = 9999; //то счётчик начнётся с 9999
Serial.println(predVal);
}
}
if ((val != 9999)&&(boolPer == 1)) //если значение счётчика не 9999 и выбрана 1 (благодаря loop() данное условие будет аналогом while)
{
val = val + 1; //то к значению счётчика прибавляем 1
delay(100); //задержка 0,1 секунда
}
if ((val != 0)&&(boolPer == 0)) //если значение счётчика не 0 и выбран 0
{
val = val - 1; //то от значения счётчика отнимаем 1
delay(100);
}
int mask = digit[0];
//в mask записываем определенное значение массива знаков дисплея, а именно байт знака
//в данном случае очищаем дисплей
for(int i = 0; i < gigitCount; i++){ //перебираем все знаки дисплея
boolean stateSegment = bitRead(mask,i);
//читаем значения каждого бита в mask и записываем в stateSegment 0 или 1
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
//включаем/выключаем знак
}
mask = numberSegments[val / 1000];
//в mask записываем определенное значение массива конкретных цифр, а именно байт цифры
//val / 1000 - целочисленное деление для получения значения тысячных //первый разряд
for(int i = 0; i < segmentCount; i++){ //перебираем все сегменты знака
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin, stateSegment);
//включаем/выключаем сегменты
}
mask = digit[4]; //включаем нужный знак дисплея - тысячные
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = digit[0];
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = numberSegments[val%1000 / 100];
//val%1000 - деление с остатком, / 100 - целочисленное деление - для получения значения сотых
for(int i = 0; i < segmentCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin, stateSegment);
}
mask = digit[3]; //включаем нужный знак дисплея - сотые
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = digit[0];
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = numberSegments[val%100 / 10];
//val%100 - деление с остатком, / 10 - целочисленное деление - для получения значения десятков
for(int i = 0; i < segmentCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin, stateSegment);
}
mask = digit[2]; //включаем нужный знак дисплея - десятки
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = digit[0];
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = numberSegments[val%10];
//val%10 - деление с остатком для получения значения единиц
for(int i = 0; i < segmentCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin, stateSegment);
}
mask = digit[1]; //включаем нужный знак дисплея - единицы
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
mask = digit[0];
for(int i = 0; i < gigitCount; i++){
boolean stateSegment = bitRead(mask,i);
digitalWrite(i + firstSegmentPin + segmentCount, !stateSegment);
}
}