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);
}