 
 	byte	selected		= 0,
 			on_display		= 0;
+
+	int	 key_now;
 
 	bool	key_pressed_ok	= true;
 


		key_pressed_ok	= true;

		switch (key_pressed()) {

			case BUTTON_OK:		return selected;
								break;

			case BUTTON_LEFT:	if (selected != 0) {
									if (selected == on_display) {
										lcd.clear();
										on_display	-= 2;
									}

									selected--;
								}
								break;

			case BUTTON_RIGHT:	if (selected < all_element - 1) {
									if (selected == (on_display + 1)) {
										lcd.clear();
										on_display	+= 2;
									}

									selected++;
								}
								break;

			default:			key_pressed_ok	= false;
								break;
		}
	}
}

void setup() {
	#ifdef DEBUG
	Serial.begin(9600);
	#endif

	/*Инициализация дисплея*/
	lcd.begin();
	// lcd.backlight();

	/*Инициализация выводов для сигнала*/
	pinMode(BIP, OUTPUT);
	digitalWrite(BIP, LOW);

	/*Прерывание на 2-ом цифровом канале для сигнализации*/
	attachInterrupt(0, alarm, CHANGE);

	/*Прерывание на 3-ем цифровом канале для подсчёта скорости*/
	attachInterrupt(1, speed, CHANGE);

	lcd.createChar(0, bat_icon);

	#ifdef FIRST_ON
	sys_conf load_to_eeprom;

	load_to_eeprom.password[0]		= 1;
	load_to_eeprom.password[1]		= 2;
	load_to_eeprom.password[2]		= 3;
	load_to_eeprom.password[3]		= 4;
	load_to_eeprom.red_speed		= true;
	load_to_eeprom.time_to_slpeep	= 5;
	load_to_eeprom.auto_led			= true;
	load_to_eeprom.auto_headlights	= true;
	load_to_eeprom.distance			= 0.0;
	load_to_eeprom.max_speed		= 0.0;

	WriteSysConfEEPROM(load_to_eeprom, 0);
	lcd.print("All OK!");
	#endif
}

void WriteSysConfEEPROM(sys_conf str, int base) {	// Запись и чтение выполнены великолепным программистом Виктором Охотниковым
	char	*c;
	int		structSize = sizeof(sys_conf);

	c	= (char *) &str;

	for(int i = 0; i < structSize; i++) {
		EEPROM.write(i+base, *c);

byte			bat_percent		= 100,
				system_state	= 0;

#define SPEED_STATE		0
#define MENU_STATE		1
#define SETTINGS_STATE	2

sys_conf		btc_config; // Конфигурация системы

void setup() {
	#ifdef DEBUG
	Serial.begin(9600);
	#endif

	/*Инициализация дисплея*/
	lcd.begin();
	pinMode(DISPLAY_LIGHT, OUTPUT);
	pinMode(VIBRO_SENSOR, OUTPUT);
	analogWrite(DISPLAY_LIGHT, 175);	// Включение подсветки

	lcd.print("Loading system..");
	lcd.setCursor(0, 1);
	lcd.print("Version: ");
	lcd.print(VERSION);

	tone(BIP, 100, 250);
	delay(250);
	tone(BIP, 100, 250);
	delay(1000);

	setSyncProvider(RTC.get);			// Для времени

	/*Инициализация выводов для сигнала*/
	pinMode(BIP, OUTPUT);

	/*Прерывание на 2-ом цифровом канале для сигнализации*/
	attachInterrupt(0, alarm, CHANGE);

	/*Прерывание на 3-ем цифровом канале для подсчёта скорости*/
	// attachInterrupt(1, speed, CHANGE);

	lcd.createChar(0, bat_icon);

	#ifdef FIRST_ON
	sys_conf load_to_eeprom;

	load_to_eeprom.password[0]		= 1;
	load_to_eeprom.password[1]		= 2;
	load_to_eeprom.password[2]		= 3;
	load_to_eeprom.password[3]		= 4;
	load_to_eeprom.red_speed		= true;
	load_to_eeprom.time_to_slpeep = 5;
	load_to_eeprom.auto_led		 = true;
	load_to_eeprom.auto_headlights	= true;
	load_to_eeprom.distance		 = 0.0;
	load_to_eeprom.max_speed		= 0.0;

	WriteSysConfEEPROM(load_to_eeprom, 0);
	lcd.print("All OK!");
	#endif
	colibration();
}

/*Interrupt zone start*/
void alarm() {	// Сигнализация
	if ((!alarm_state) && (system_state == 1)) {
		alarm_state = true;

		for (int	i = 0; i < BIP_DELAY; i++) {
			tone(BIP, 750);
			delay(500);
			tone(BIP, 300);
			delay(500);
		}
		noTone(BIP);
		alarm_state = false;
	}
}

void speed() {	// Подсчёт скорости
	if ((millis() - lastturn) > 80) { // Защита от случайных измерений (основано на том, что велосипед не будет ехать быстрее 120 кмч)
		speed_now = WHEEL_LENGTH / ((float)(millis() - lastturn) / 1000) * 3.6; // Расчет скорости, км/ч
		lastturn	= millis();													 // Запомнить время последнего оборота
		distance	= distance + WHEEL_LENGTH / 1000;							 // Прибавляем длину колеса к дистанции при каждом обороте
	}
}
/*Interrupt zone end*/

void loop() {
	first_on();
	if (system_state == SPEED_STATE) {
		road_mode();
	}

	if (system_state == MENU_STATE) {
		#ifdef DEBUG
		char menu_array[5][15]	= {
		#else
		char menu_array[4][15]	= {
		#endif
			"Sleep",
			"Speedometr",
			"Statistik",
		#ifdef DEBUG
			"Settings",
			"Self test"
		#else
			"Settings"
		#endif
		};

		#ifdef DEBUG
		switch (display_list(5, menu_array)) {
		#else
		switch (display_list(4, menu_array)) {
		#endif
			case 0:	alarm_mode();
					break;
			case 1: system_state	= SPEED_STATE;
					break;

			case 3: system_state	= SETTINGS_STATE;
					break;

			#ifdef DEBUG
			case 4: self_test();
					break;
			#endif
		}
	}

	if (system_state == SETTINGS_STATE) {
		char settings_array[6][15]	= {
			"Password",
			"Display",
			"Light settings",
			"Time setting",
			"About system",
			"Back"
		};

		switch (display_list(6, settings_array)) {
			case 0: if (read_password())
						input_password();
					break;

			case 3:	TimeElements	t_n;
					time_t			timeVal;
					t_n.Second	= 0;
					t_n.Hour	= input_int_number("Input hour", 0, 23);
					t_n.Minute	= input_int_number("Input minutes", 0, 59);
					t_n.Day		= input_int_number("Input day", 1, 31);
					t_n.Month	= input_int_number("Input month", 1, 12);
					t_n.Year	= input_int_number("Input year", 15, 20) + 30;
					timeVal		= makeTime(t_n);
					RTC.set(timeVal);
					setTime(timeVal);
					break;

			case 5: system_state	= MENU_STATE;
					break;
		}
	}
}

void alarm_mode() {
	lcd.clear();
	lcd.print(" Stand By Mode");
	digitalWrite(DISPLAY_LIGHT, LOW);
	digitalWrite(VIBRO_SENSOR, HIGH);
	alarm_state		= false;
	system_state	= 1;
	while (true) {
		while (analogRead(ACTION_BUTTON) < 5);
		if (read_password())
			break;
	}
	digitalWrite(VIBRO_SENSOR, LOW);
}

byte input_int_number(const char *text, byte min_num, byte max_num) {	// Ввод целочисленного числа
	lcd.clear();
	lcd.print(text);

	int		key_now;

	byte	same_num = min_num;

	while (true) {
		lcd.setCursor(0, 1);
		lcd.print("   ");

		lcd.setCursor(0, 1);
		lcd.print(same_num);
		key_now	= key_pressed();

		if (key_now == btc_config.BUTTON_UP) {
			if (same_num == max_num) {
				same_num	= min_num;
			} else {
				same_num++;
			}
		} else if (key_now == btc_config.BUTTON_DOWN) {
			if (same_num == min_num) {
				same_num	= max_num;
			} else {
				same_num--;
			}
		} else if (key_now == btc_config.BUTTON_OK) {
			return same_num;
		}
	}
}

float input_float_number(char text[], float min_num, float max_num) {	// Ввод числа с точкой
	lcd.clear();
	lcd.print(text);

	float	same_num = min_num;

	int		key_now;

	while (true) {
		lcd.setCursor(0, 1);
		lcd.print("                ");
		lcd.setCursor(0, 1);
		lcd.print(same_num);

		key_now	= key_pressed();

		if (key_now == btc_config.BUTTON_UP) {
			if ((same_num + 0.1) > max_num) {
				same_num	= min_num;
			} else {
				same_num	+= 0.1;
			}
		} else if (key_now == btc_config.BUTTON_DOWN) {
			if ((same_num - 0.1) < min_num) {
				same_num	= max_num;
			} else {
				same_num	-= 0.1;
			}
		} else if (key_now == btc_config.BUTTON_OK) {
			return same_num;
		}
	}
}

void sys_watch() {
	if (analogRead(LIGHT_SENSOR) > 600) {
		digitalWrite(DISPLAY_LIGHT, LOW);
	} else {
		digitalWrite(DISPLAY_LIGHT, HIGH);
	}
}

void stand_by_mode() {

}

unsigned int key_pressed() {	// Определение нажатой кнопки
	int	key,
		delay_time	= 0;

	while (true) {
		sys_watch();

		key	= analogRead(ACTION_BUTTON);

		#ifdef DEBUG
		Serial.println(key);
		#endif

		if ((key >= btc_config.BUTTON_OK - 5) && (key <= btc_config.BUTTON_OK + 5)) {
			key = btc_config.BUTTON_OK;
			break;
		} else if ((key >= btc_config.BUTTON_UP - 5) && (key <= btc_config.BUTTON_UP + 5)) {
			key = btc_config.BUTTON_UP;
			break;
		} else if ((key >= btc_config.BUTTON_DOWN - 5) && (key <= btc_config.BUTTON_DOWN + 5)) {
			key = btc_config.BUTTON_DOWN;
			break;
		}
	}

	while ((analogRead(ACTION_BUTTON) > 5) && (delay_time < SWITCH_NEXT)) {	// Ожидание зажатия
		delay(1);
		delay_time++;
	}

	return key;
}

void road_mode() {	// Режим спидометра
	float	speed_old = 0.1;

	int		key_now;

	lcd.clear();
	lcd.print("km/h: ");
