Помогите привести код в порядок

arssev1
Offline
Зарегистрирован: 10.04.2014
const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;

void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop() {
  for (int z=0; z <= 9999; z++) {
    displayNumber(z, 100);
  }
}

void displayNumber(int number, int duration) {
  int units = number % 10; //Получаем единицы
  int dozens = number % 100 / 10; //Десятки
  int hundreds = number % 1000 / 100; //Сотни
  int thousands = number / 1000; //Тысячи
  
  int numberOfDigits; //Количество разрядов будем записывать сюда
  
  if (thousands == 0 && hundreds == 0 && dozens == 0) numberOfDigits = 1;
  else if (thousands == 0 && hundreds == 0) numberOfDigits = 2;
  else if (thousands == 0) numberOfDigits = 3;
  else if (thousands > 0) numberOfDigits = 4; //Посчитали количество разрядов в числе number

  unsigned long loopTimer = millis(); //Фиксируем время для таймера

  while (millis() - loopTimer <= duration) { //Отображаем число на протяжении duration миллисекунд
    if (numberOfDigits == 4) { //Если у нас 4-х разрядное число - отображаем все 4 разряда
      shiftToRegister((0b0001 << 4) + thousands); //Пишем в сдвиговый регистр байт
      shiftToRegister((0b0010 << 4) + hundreds);  //В котором содержится информация
      shiftToRegister((0b0100 << 4) + dozens);    //О цифре и ее положении на индикаторе
      shiftToRegister((0b1000 << 4) + units);     //Причем цифры быстро переключаются
    }                                             //Таким образом создается динамическая индикация

    else if (numberOfDigits == 3) { //Если у нас 3-х разрядное число - отображаем 3 разряда
      shiftToRegister((0b0010 << 4) + hundreds);
      shiftToRegister((0b0100 << 4) + dozens);
      shiftToRegister((0b1000 << 4) + units);
    }
  
    else if (numberOfDigits == 2) { //Если у нас 2-х разрядное число - отображаем 2 разряда
      shiftToRegister((0b0100 << 4) + dozens);
      shiftToRegister((0b1000 << 4) + units);
    }

    else if (numberOfDigits == 1) { //Если у нас 1 разрядное число - отображаем 1 разряд
      shiftToRegister((0b1000 << 4) + units);
    }
  }
  shiftToRegister(0b0); //Стираем символы с дисплея
}

void shiftToRegister(byte j) {
  digitalWrite(latchPin, LOW); //Открываем защелку
  shiftOut(dataPin, clockPin, MSBFIRST, j); //Отправляем последовательно байт
  digitalWrite(latchPin, HIGH); //Закрываем защелку
}

Я не особо шарю в программировании, вот накалякал такой код, чую, что он ужасен

Как можно улучшить код, сократить количество строк, что тут можно по массивам распихать?

Помогите, если не трудно 

releyshic
Offline
Зарегистрирован: 20.11.2015

arssev1 пишет:

const int dataPin = 8;

const int latchPin = 9;
const int clockPin = 10;

зачем переменные когда можно #define latchPin 9

arssev1 пишет:
for (int z=0; z <= 9999; z++) {

13     displayNumber(z, 100);
14   }

зачем делать цикл если у тебя loop бесконечный цикл, нужно только if добавить

вместо всей функции void displayNumber(int number, int duration)

void displayNumber(int number, int duration) 
{
	int return_number=0;
	int numberOfDigits=0;
	while(number)
	{
		return_number = return_number*10 + number%10;
		number /= 10;
		numberOfDigits++;
	}
	unsigned long loopTimer = millis(); //Фиксируем время для таймера
	while (millis() - loopTimer <= duration) 
	{
		switch(numberOfDigits)
		{
			case 4: shiftToRegister((0b0001 << 4) + return_number%10); return_number /= 10; 
			case 3: shiftToRegister((0b0010 << 4) + return_number%10); return_number /= 10; 
			case 2: shiftToRegister((0b0100 << 4) + return_number%10); return_number /= 10; 
			case 1: shiftToRegister((0b1000 << 4) + return_number%10); return_number /= 10; 
		}
		
		shiftToRegister(0b0); //Стираем символы с дисплея
	}
}

arssev1 пишет:
по массивам распихать?
по массивам распихать и улучшить несовместимо