4 разрядный 7 сегментный индикатор

Нет ответов
taras_lebedyk
Offline
Зарегистрирован: 22.03.2016
Добрый вечер. Нашел пример кода для вывода цифр на индикатор.
Но не могу понять две вещи.
1. Если хочешь вывести 3.02 например, выводится только 3, в чем может быть причина, и что нужно изменить в коде?
2. Как заставить чтобы например число 291812 перемещалось слева направо или наоборот?
 
void ledDigitDisplay(float num, float time)
{
   unsigned long ltime = millis(); // налаштування
   int pin[] = {6, 7, 8, 9, 10, 2, 11, 3, 4, 12, 13, 5}; // піни
   int settingsSegments[] = {pin[10], pin[6], pin[3], pin[1], pin[0], pin[9], pin[4], pin[2]}; // Порядок сегментів
   int segments[] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b10000000, 0b01000000}; //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '.', '-'
   // визначаємо піни як вихід
   for(int i = 0; i < 12; ++i) pinMode(pin[i], OUTPUT);
   int floatingPoint = 0, minus = 4;
   if(num > -1000 && num < 0) // працюємо з від’ємними числами
     {
       minus--;
       if(num > -100) minus--;
       if(num > -10) minus--;
       num = -num;
     }
   // працюємо з дробовими числами
   for(int i = 0; num < 1000 && minus == 4; ++i)
     {
       if(int(num * 10) != int(num)*10)
         {
           floatingPoint++;
           num *= 10;
         }
       else
       break;
     }
   for(int i = 0, temp; millis() - ltime <= time * 1000; i++)
     {
        if(i == 4) i = 0;
        temp = int(num / pow(10, i)) % 10; // Цифра, що передаємо індикатору
        if(num >= 10000 || num <= -10000 || minus == i)
        // якщо мінус або переповнення, передаємо '-'
        temp = 11;
       // працюємо з 4 розрядом
       if(i == 3 && (num >= 1000 || floatingPoint == i || minus == i))
       pinMode(pin[11], OUTPUT);
       else pinMode(pin[11], INPUT);
       // працюємо з 3 розрядом
       if(i == 2 && (num >= 100 || floatingPoint == i || minus == i))
       pinMode(pin[8], OUTPUT); else pinMode(pin[8], INPUT);
       // працюємо з 2 розрядом
       if(i == 1 && (num >= 10 || floatingPoint == i || minus == i)) pinMode(pin[7], OUTPUT);
       else pinMode(pin[7], INPUT);
       // працюємо з 1 розрядом
       if(i == 0) pinMode(pin[5], OUTPUT); else pinMode(pin[5], INPUT);
       for(int j = 0; j < 8; j++) // Передаємо число
       if(segments[temp] & (1 << j))
       digitalWrite(settingsSegments[j], HIGH);
       if(floatingPoint && floatingPoint == i) // Передаємо точку
       digitalWrite(settingsSegments[7], HIGH);
       delay(1); // невеличка пауза, щоб світлодіоди «розігрілися»
       for(int j = 0; j < 8; j++) digitalWrite(settingsSegments[j], LOW);
       // вимикаємо усі світлодіоди
   }
}

void setup()
{}

void loop()
{
   ledDigitDisplay(3.14, 2);
   ledDigitDisplay(123, 2);
   ledDigitDisplay(-5, 2);
   ledDigitDisplay(3.02, 2);
}