4 разрядный 7 сегментный индикатор
- Войдите на сайт для отправки комментариев
Чт, 05/05/2016 - 22:03
Добрый вечер. Нашел пример кода для вывода цифр на индикатор.
Но не могу понять две вещи.
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); }