/* 		AVR studio 4.18 Build 684
		Nixie Tube Clock

Created by: Daemon Fox
Date: 02.05.2020
HW: v1.0 by 03.2020
SW: v1.0 by 02.05.2020

Fuses:
H-Fuse 1101 1001
L-Fuse 1100 1111

0 - unprogram
1 - program

Кварц - 8MHz

*/



#include <avr/io.h> //библиотека ввода/вывода
#include <util/delay.h> //библиотека задержки (паузы)
#include <avr/interrupt.h> //библиотека прерываний
#include "i2c.h"		// Библиотека для работы с i2c

#define Q0 	0
#define Q1	1
#define Q2  2
#define Q3  3
#define Q4  4
#define Q5  5
#define Q6	6
#define Q7	7

#define b0 	0
#define b1	1
#define b2  2
#define b3  3
#define b4  4
#define b5  5
#define b6	6
#define b7	7

#define READ_DS32	0xD1	//Адрес для чтения DS3231
#define WRITE_DS32	0xD0	//Адрес для записи DS3231

//#define StopT0	TIMSK &= ~(1 << TOIE0); //макрос для старта таймера
//#define StartT0	TIMSK |= (1 << TOIE0);	//макрос стоп таймера


// Переменные: 



volatile uint8_t	test = 0x00;// Тестовые переменные.
volatile uint8_t	test_v = 1;
volatile uint8_t	test_i = 1;
volatile uint8_t	test_t2 = 0x00; // тест таймера 2

volatile uint8_t ADC_DATA = 0; // Данные преобразованные из АЦП.
volatile uint8_t ADC_DATA_t = 0; // Временные данные для ADC.

volatile uint8_t OCR0_t = 120;//  0-255 Значение ШИМ для высоковольтного генератора 180v. | min = 50 ; max = 200 | 127 = 50%.

volatile uint8_t c_25ms = 0x00; // Переменная 0-255 для for

volatile int i = 0x00;

volatile uint8_t	H10 = 0x0F;// Регистр десяток часов.
volatile uint8_t	H01 = 0x0F;// Регистр единиц минут.
volatile uint8_t	M10 = 0x0F;// Регистр десяток часов.
volatile uint8_t	M01 = 0x0F;// Регистр единиц минут.
volatile uint8_t	H10_t = 0x0F;// Регистр десяток часов. Хранение переменной.
volatile uint8_t	H01_t = 0x0F;// Регистр единиц минут. Хранение переменной.
volatile uint8_t	M10_t = 0x0F;// Регистр десяток часов. Хранение переменной.
volatile uint8_t	M01_t = 0x0F;// Регистр единиц минут. Хранение переменной.
volatile uint8_t	S01 = 0x00;// Регистр секунды и будильника.
volatile uint8_t	M01_c = 0x00; //Цикл 40 проходов для защиты индикатора от ... (длительное горение одного сегмента, выгорание сегмента) 

volatile uint8_t 	H = 0; // Байт часов. Упакованный BCD Формат.
volatile uint8_t 	M = 0; // Байт минут. Упакованный BCD Формат.
volatile uint8_t 	S = 0; // Байт секунд. Упакованный BCD Формат.

volatile uint8_t 	DG1 = 0x0F; // Регистр индикатора № 1.
volatile uint8_t 	DG2 = 0x0F; // Регистр индикатора № 2.
volatile uint8_t 	DG3 = 0x0F; // Регистр индикатора № 3.
volatile uint8_t 	DG4 = 0x0F; // Регистр индикатора № 4.

volatile uint8_t U04 = 0x00;// Регистры микросхем сдвиговых регистров 74hc595
volatile uint8_t U05 = 0x00;
volatile uint8_t U06 = 0x00;
volatile uint8_t U07 = 0x00;
volatile uint8_t U08 = 0x00;
volatile uint8_t U09 = 0x00;
volatile uint8_t U10 = 0x00;
volatile uint8_t U11 = 0x00;

volatile uint8_t flag_INT = 0xFF; // Флаг прерываний INT1 INT0 от дребезга контактов. b1 = INT1, b0 = INT0. 1 - изменение разрешено.

volatile uint8_t service_menu_c = 84; // Счётчик входа в сервисное меню. с = 0 вход в меню. 5000мс / 30мс = 166 циклов.
volatile uint8_t service_menu_c_t = 84; //  service_menu_c_t = service_menu_c;
volatile uint8_t service_menu_i = 0;// Пункт сервисного меню. 0 - АЦП, 1 - ШИМ HV (OCR0_t). 2 - 12:00. 12 - выход.
volatile uint8_t menu_i = 0; // Пункт обычного меню. 0 - выход, 1 - настройка звуков, 2 - настройка будильника, 3 - настройка часов, 4 - настройка подсветки.
volatile uint8_t menu_s = 0; // меню селект: 0 - ничего не выбрано, 1 - настройка часов, 2 - настройка минут.




// Функции:




void hc595(uint8_t b); // Функция записи байта в регистр.
void hc595_latch(); // Функция защелки байта(ов) в регистр.

void display_clear(); // Функция сброса регистров для последующего вывода числа на циферблат.
void display_v1(uint8_t v1); // Функция вывода числа 0-10 (10 - запятая) на 1ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
void display_v2(uint8_t v2); // Функция вывода числа 0-10 (10 - запятая) на 2ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
void display_v3(uint8_t v3); // Функция вывода числа 0-10 (10 - запятая) на 3ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
void display_v4(uint8_t v4); // Функция вывода числа 0-10 (10 - запятая) на 4ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
void display_n(uint8_t n); // Функция включения 1й неоновой лампы(будильник). // Функция включения 2й неоновой лампы(секунда).
void display_m(uint8_t m); // Функция вывода обычного меню на U11.

void ADC_read(); // Функция преобразования АЦП.

void Read_DS();  // Чтение часов и минут из DS3231 с конвертацией их в H10 H01 M10 M01.
void Write_DS(); // Запись часов и минут в DS3231 с конвертацией их в H10 H01 M10 M01.
void DS3231_ini(); // Настройка часов.

void menu_save();//  Сохранение настроек.

void UART_ini(); // Функция инициализации UART.
void UART_send(unsigned char c);   //  Отправка байта
void UART_send_str(unsigned char *s); //  Отправка строки
void UART_send_int(unsigned int c); //    Отправка числа от 0000 до 9999
unsigned char UART_getch(void); //    Получение байта

void f_H_To_Mp3(void);// воспроизвести трек соответствующий часу.

//void service_menu(); // Функция сервисного меню.

//bin2bcd(); !!!
// В стандартном avr-gcc нет 24-хбитных типов, что вызывает у меня печальку.
volatile uint8_t bin2bcd0001 = 0x00;// Регистры вывода функции двоично десятичного преобразования.
volatile uint8_t bin2bcd0010 = 0x00;
volatile uint8_t bin2bcd0100 = 0x00;
void BIN2BCD3shift(volatile uint8_t digHEX); // Двоично-десятичное преобразование.



// Функции инициализации:



void ADC_init(){ // Инициализация АЦП.
	ADMUX |= (1<<REFS1)|(1<<REFS0)|(1<<ADLAR); // REFS1 - REFS0 = 11, ИОН = внутр на 2.56в | ADLAR = 1, левое выравнивание.
	ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //|(3<<ADPS0)(1<<ADIE) ADEN - разрешить АЦП| ADIE - разрешить прерывание | ADPS2-0 - делитель частоты на N
	//  Частота работы АЦП не больше 200 кГц, иначе теряем точность. Fclk / N.
	//N =  ADPS2-0; 2 = 000, 4 = 010,8 = 011, 16 = 100,32 = 101, 64 = 110, 128 = 111.
}

void Timer_ini(){ // Инициализация таймера_0. 32-35кГц.
	OCR0 = OCR0_t; //Скважность импульсов. Регистр сравнения. TCNT0 - Регистр счётчика.
	TCNT0 = 0; 

	TCNT2 = 0x00;// сброс счётного регистра. Изменять только при остановленном таймере.
	OCR2 = 30;// Регистр сравнения. Диапазон таймера 0 - 255.

//	TCCR0A=0x00; 
	TCCR0 |= (1<<WGM01)|(1<<WGM00);// Режим таймера = FastPWM;

	// TCNT2 - счетный регистр , OCR2 - регистр сравнения , TCCR2 - конфигурационный регистр. 
	
	//TCCR2 |= (1<<WGM21); // Режим таймера = CTC;
	TCCR2 |= (1<<WGM21)|(1<<WGM20);// Режим таймера = FastPWM;



	//TIMSK |= ; //|(1<<TOIE2) Разрешить прерывание по совпадению.
	TIMSK |= (1<<OCIE0)|(1<<TOIE0)|(1<<OCIE2)|(1<<TOIE2); // Разрешить прерывание по совпадению и по переполнению.

	TCCR0 |= (1<<CS00);// Частота 31,25кГц. (clk/N*256) 8000'000Гц/256 = 31 250Гц. N = 1, CS02 - CS00 = 001.
	TCCR2 |= (1<<CS20);  // || (1<<CS21); Частота 31,25кГц. (clk/N*256) 8000'000Гц/2048 = 3 906,25Гц. N = 8, CS02 - CS00 = 010.


} 

void Timer2_ini(){ // Инициализация таймера_2. 3,90625кГц.

}

void INT_ini(){ //
	GICR |= (1<<INT0)|(1<<INT1)|(1<<INT2);  //разрешаем внешнее прерывание на int0 и int1 и int2.
	MCUCR |= (0<<ISC01)|(1<<ISC01); //настраиваем условие прерывания  int0; По нарастающему фронту (0 -> 1).
	MCUCR |= (0<<ISC11)|(1<<ISC11); //настраиваем условие прерывания  int1; По нарастающему фронту (0 -> 1).
	MCUCSR |= (1<<ISC2);//настраиваем условие прерывания  int2; По спадающему фронту (1 -> 0).
	// https://chipenable.ru/index.php/item/105
}



// Прерывания:



ISR (TIMER0_COMP_vect){ // Прерывание: совпадение счётчика и OCR0.
	PORTD &= ~(1<<PD4); // PD4 = 0, PNP - OFF
	PORTD |= (1<<PD5); // PD5 = 1, NPN - ON
} 
ISR (TIMER0_OVF_vect){ // Прерывание: переполнение счётчика.
	PORTD |= (1<<PD4); // PD4 = 1, PNP - ON
	PORTD &= ~(1<<PD5); // PD5 = 0, NPN - OFF

	OCR0 = OCR0_t;
} 


ISR (TIMER2_COMP_vect){ // Прерывание: совпадение счётчика и OCR2.
//	TCCR2 &= ~(1<<CS21); // Останов таймера.
	//TCNT2 = 0x01;// сброс счётного регистра. Изменять только при остановленном таймере.
	
	//TIFR &= ~(1<<OCF2);
		
//	TCCR2 |= (1<<CS21); //Пуск таймера.
//	test_t2++;


//	//обработка прерывания.
//	if(test_t2 == 50){ // Совпадение.
		PORTB &= ~(1<<PB1); // PB1 = 0.
//	PORTB ^= (1<<PB1);

//	}
//	if(test_t2 == 255){// Переполнение.
//		
	// pin 
//	}
} 

ISR (TIMER2_OVF_vect){ // Прерывание: переполнение счётчика.
	PORTB |= (1<<PB1); // PB1 = 1.
} 

 
ISR (INT0_vect){// Энкодер1 - А.
	//if(flag_INT & (1<<b0)){	// Проверка флага задержки от дребезга. 1 - изменение разрешено.
		// Определение вращения 10 или 11
		// Функция прибавления или вычитания.
	//	if(PINA & (1<<PA6)){ // ++
		
	//	}else{// --
		
//		}
	//	flag_INT &= ~(1<<b0); // установка запрета прерывания. 0 - изменение запрещено. 
	//}
//	test_i++;
//	if(test_i == 11){ test_i = 0;}
} 

ISR (INT1_vect){// Энкодер2 - А.
//	if(flag_INT & (1<<b1)){	// Проверка флага задержки от дребезга. 1 - изменение разрешено.
		// Определение вращения 10 или 11
		// Функция прибавления или вычитания.
//		if(PINA & (1<<PA7)){ // ++
//			test_i++;
//			if(test_i >= 11){ test_i = 0;}
//		}else{// --
//			test_i--;
//			if(test_i <= 0){ test_i = 11;}// 0-- = 255, 255>0
//		}
//		flag_INT &= ~(1<<b1); // установка запрета прерывания. 0 - изменение запрещено. 
//	}
} 

ISR (INT2_vect){// DS3231 INT/SQW Прерывание каждую секунду.
// Инвертировать бит неонки N2 - S01:b2.
//S01 = S01^(1<<b2);
//S01 = S01^(1<<b1);
S01 = S01^(1<<b2);
if (M01_c == 0){Read_DS();}	// единожды в начале + каждую секунду по прерыванию.
// Это желательно делать в теле программы, а не здесь. 
// Можно в теле программы проверять смену секунды if (!(S01 == S01_t)) {Read_DS(); ... }

} 

 



int main (void){



// Инициализация портов:

	DDRA = 0x00;// Настройка порта как вход.
	DDRB = 0x00;// Настройка порта как вход.
	DDRB |= (1<<PB0)|(1<<PB1);// PB0 = 1, PB1 = 1,  как выход.

	DDRC = 0xFF;// Настройка порта как выход.
	DDRD = 0b11110000;// Настройка порта PD0-3 как вход, PD4-7 как выход.

	PORTA = 0x00;
	PORTB = 0x00;
	PORTC = 0x00;
	PORTD = 0b01100000;

	H10 = 1;
	H01 = 2;
	M10 = 0;
	M01 = 0;

	//S01 |= (1<<b1);

	Timer_ini(); // Инициализация таймера 0.
	//Timer2_ini(); // Инициализация таймера 2.
	INT_ini(); // Функция инициализации INT0 и INT1 прерываний.
	ADC_init(); // Инициализация АЦП.
	i2c_init (); // Инициализация шины I2C.
	DS3231_ini();
	UART_ini();   // Инициализация UART.

	sei();  // Разрешить прерывания.

//	GIMSK=0b00100000; //разрешаем прерывание PCINT7..0 -  кнопка
	// 0b10000000  INT1 || 0b01000000  INT0
	// MCUCR=0x03; // срабатывание по нарастанию фронта -  для кнопки   int0 || 0b00001100;int1
 	//PCMSK = 0b00011110; //Разрешил вызов прерывания при изменении на порту
//	sei(); //глобальное разрешение прерываний 
 //cli; Запретить прерывания
//	PORTD = 0x00;
	//PORTB = 0x00;


/*

PORTA - Вход

PA0 - ADC. 180в стабилизация.
PA1 - I/O. контроль 10в батареи питания.
PA2 - ADC. контроль освещённости комнаты. F-res.
PA3 - NC.
PA4 - I/O. Энкодер 1 - KEY
PA5 - I/O. Энкодер 2 - KEY
PA6 - I/O. Энкодер 1 - B
PA7 - I/O. Энкодер 2 - B

PORTB - Выход, PB2 - Вход

PB0 - Управление твердотельным реле SSR. 0 - выкл, 1 - вкл.
PB1 - Управление питанием 5в усилителя PAM8406. 0 - выкл, 1 - вкл.
PB2 - INT. Минутное прерывание от часов реального времени DS32231.
PB3 - NC.
PB4 - NC.
PB5 - MOSI. ASP Программатор.
PB6 - MISO. ASP Программатор.
PB7 - SCK. ASP Программатор.

PORTC - Выход

PC0 - SCL. DS3231.
PC1 - SDA. DS3231.
PC2 - LED R. 0 - выкл, 1 - вкл.
PC3 - LED B. 0 - выкл, 1 - вкл.
PC4 - LED G. 0 - выкл, 1 - вкл.
PC5 - SPI_SW. Clock. 74hc595.
PC6 - SPI_SW. Latch. 74hc595.
PC7 - SPI_SW. Data. 74hc595.

PORTD - Выход, PD2-3 Вход.

PD0 - UART. Rx. 
PD1 - UART. Tx.
PD2 - INT. Энкодер 1 - A.
PD3 - INT. Энкодер 1 - A.
PD4 - IRF740_PNP Step-Up HV. default = 1; 0 = вкл.
PD5 - IRF740_NPN Step-Up HV. default = 0; 1 = вкл.
PD6 - IRF530_PNP Led Alarm. default = 1; 0 = вкл.
PD7 - IRF530_NPN Led Alarm. default = 0; 1 = вкл.


*/

// Программа:
Read_DS();	// Единожды в начале + каждую секунду по прерыванию.
H10_t = H10;
H01_t = H01;
M10_t = M10;
M01_t = M01;
if (M01_t == 0){ // При включении пролистать цифры("обновить экран"). 
	M01_t = 9;
}else{ M01_t--; }

// В начале нельзя, т.к. флешка ещё не инициализировалась
//7E FF 06 06 00 00 12 FE E3 EF - Громкость 18  (0 - 30)  
//UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x06);UART_send(0x00);UART_send(0x00);UART_send(0x12);UART_send(0xFE);UART_send(0xE3);UART_send(0xEF);

while(1){

// КРАСН 
// СИН
// ЗЕЛ
//_delay_us(15);
//PORTB ^= (1<<PB1);






// <--- Опрос кнопок + пауза 25мс:

	//c = 30;
	for(c_25ms = 30; c_25ms>0; c_25ms--){ // цикл для переменной i от 1 до k с шагом 1
		_delay_ms(1);
		if(flag_INT & (1<<b0)){	// Проверка флага задержки от дребезга. 1 - изменение разрешено.
		// Определение вращения 10 или 11
		// Функция прибавления или вычитания.
			if (PIND & (1<<PD2)){	// Энкодер1 - А. = 1;
				_delay_ms(1);
				flag_INT &= ~(1<<b0); // установка запрета прерывания. 0 - изменение запрещено. 
				if(PINA & (1<<PA6)){ // --

					// <--- Сервисное меню. Энкодер "--"
					if (service_menu_c == 0){// Если в сервисном меню.
						// Уменьшение пункта сервисного меню. 0 - АЦП, 1 - ШИМ HV (OCR0_t). 2 - 12:00. 12 - выход.
						if(service_menu_i > 0)
							service_menu_i--;
					}else{
					// ---> Сервисное меню. Энкодер "--"

					// <--- Обычное меню. Энкодер "--"
					// Пункт обычного меню. 0 - выход, 1 - настройка звуков, 2 - настройка будильника, 3 - настройка часов, 4 - настройка подсветки.
						if(menu_i>0){
							menu_i--;
							if(menu_i == 0)
								Write_DS();//menu_save();
						}else{
							//menu_i == 0)
							menu_i = 2;
						}
					}
					// ---> Обычное меню. Энкодер "--"
				}else{// ++

					// <--- Сервисное меню. Энкодер "++"
					if (service_menu_c == 0){// Если в сервисном меню.
						service_menu_i++;
						if(service_menu_i == 11){ service_menu_i = 0; service_menu_c = service_menu_c_t;}// Выход из сервисного меню.
					}else{
					// ---> Сервисное меню. Энкодер "++"	

					// <--- Обычное меню. Энкодер "++"
					// Пункт обычного меню. 0 - выход, 1 - настройка звуков, 2 - настройка будильника, 3 - настройка часов, 4 - настройка подсветки.
						menu_i++;
						if(menu_i == 5){
							menu_i = 0;
							//menu_save();
							Write_DS();
						}

					}
					// ---> Обычное меню. Энкодер "++"
						
				}
			}
		}
		if(flag_INT & (1<<b1)){	// Проверка флага задержки от дребезга. 1 - изменение разрешено.
		// Определение вращения 10 или 11
		// Функция прибавления или вычитания.
			if (PIND & (1<<PD3)){	// Энкодер2 - А. = 1;
				_delay_ms(1);
				flag_INT &= ~(1<<b1); // установка запрета прерывания. 0 - изменение запрещено. 
				if(PINA & (1<<PA7)){ // --
					switch ( menu_s ) { 
						case 1: if(H01 > 0){// -- уменьшение часов.
									H01--;
								}else{
									if(H10 > 0){
										H10--;
										H01 = 9;
									}else{
										H10 = 2;
										H01 = 3;
									}
							
								}
								break; 
						case 2: if(M01 > 0){// -- уменьшение минут.
									M01--;
								}else{
									if(M10 > 0){
										M10--;
										M01 = 9;
									}else{
										M10 = 5;
										M01 = 9;
									}
								}
								break; 
					}
				}else{// ++
					switch ( menu_s ) { 
						case 1: if(H10 < 2){
									if(H01 < 9){// ++ Увеличение часов.
										H01++;
									}else{
										H10++;
										H01 = 0;
									}
										
								}else{
									if(H01 < 3){
										H01++;
									}else{
									H10 = 0;
									H01 = 0;									
									}
								}
								break; 
						case 2: if(M10 < 5){
									if(M01 < 9){// ++ Увеличение минут.
										M01++;
									}else{
										M10++;
										M01 = 0;
									}
								}else{
									if(M01 < 9){
										M01++;
									}else{
									M10 = 0;
									M01 = 0;									
									}
								}
								break; 
					}

					
				}
			}
		}
		if (!(PIND & (1<<PD2)))	// Энкодер1 - А. = 0;
			flag_INT |= (1<<b0); // Разрешить прерывание Энкодер1.

		if (!(PIND & (1<<PD3)))	// Энкодер2 - А. = 0;
			flag_INT |= (1<<b1); // Разрешить прерывание Энкодер2.


	}

	if (PINA&(1<<PA4)){	// key1 = 1;

		PORTC &= ~(1<<PC3); //УСТ 0
		PORTC |= (1<<PC2); // УСТ 1 RED

		S01 = S01^(1<<b2);

		if (service_menu_c > 0)
			service_menu_c--; // Отсчёт времени для входа в меню.

			//if (test_v<=3){
		//	//	test_v++;
		//	}else{
		//		test_v = 1;
		//	}

		//	OCR0_t= OCR0_t + 5;
		//BIN2BCD3shift(OCR0_t);

		//test_16 = BIN2BCD4shift(OCR0_t);
			//test_16 = 0x0064;
		//H01 = bin2bcd0100;
		//M10 = bin2bcd0010;
		//M01 = bin2bcd0001;

		//_delay_ms(500);
		//_delay_ms(25);
		//hc595(0b10101000);
		//hc595_latch();
	}else{ // Key1 = 0;
		if (service_menu_c > 0)
			service_menu_c = service_menu_c_t; // сброс отсчёта если меню не включено.
	}

	if (PINA&(1<<PA5)){	// key2 = 1;
		if (service_menu_c == 0){// Выход из сервисного меню.
			service_menu_i = 0;	
			service_menu_c = service_menu_c_t;
		}
		if(menu_i == 1){
			if (menu_s < 2){
				menu_s++;
			}else{
				menu_s = 0;			
			}

		
		}

		//PORTC &= ~(1<<PC2); //УСТ 0
		//PORTC |= (1<<PC3); // УСТ 1 BLUE

		//7E FF 06 06 00 00 12 FE E3 EF - Громкость 18  (0 - 30)  
		//7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
		UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x06);UART_send(0x00);UART_send(0x00);UART_send(0x12);UART_send(0xFE);UART_send(0xE3);UART_send(0xEF);
		//7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
		//UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);

		//UART_send_str("OCR0 = "); 
		//_delay_ms(25);

		//display_clear();
		//	switch ( test_v ) { // УСТ 1 
		//		case 1: 
						//display_v1(test_i);
				//		test_i++;
				//		if(test_i == 11){ test_i = 0;}
		//				break; 
		//		case 2: display_v2(test_i);
		//				test_i++;
		//				if(test_i == 11){ test_i = 0;}
		//				break; 
		//		case 3: display_v3(test_i);
		//				test_i++;
		//				if(test_i == 11){ test_i = 0;}
		//				break; 
		//		case 4: display_v4(test_i);
		//				test_i++;
		//				if(test_i == 11){ test_i = 0;}
		//				break; 
		//	}



		//	OCR0_t = OCR0_t + 5;
		//_delay_ms(500);
	}

// ---> Конец опроса кнопок. 

// <--- Стабилизация высокого напряжения.
	ADC_read();
	if (ADC_DATA < 174)
		OCR0_t = OCR0_t + 1;

	if (ADC_DATA > 178) // Петля гистерезиса для плавности изменений напряжения. 
		OCR0_t = OCR0_t - 1;

	if ((ADC_DATA < 50) | (ADC_DATA > 185))
		OCR0_t = 100;
// ---> Стабилизация высокого напряжения.

// <--- Сервисное и обычное меню.

if (service_menu_c == 0){ // Сервисное меню включено.
		display_m(0); //Сброс регистра меню.
		menu_i = 0; // Выход из обчного меню, если мы были там.

			
	switch ( service_menu_i ) { // Функции пункта сервисного меню. 0 - АЦП, 1 - ШИМ HV (OCR0_t). 2 - 12:00. 12 - выход.
		case 0: BIN2BCD3shift(ADC_DATA);	// Отображение АЦП. Высокое напряжение.	
				H01 = bin2bcd0100;
				M10 = bin2bcd0010;
				M01 = bin2bcd0001;
				; break; 
        case 1: BIN2BCD3shift(OCR0_t);	// Отображение АЦП. Высокое напряжение.	
				H01 = bin2bcd0100;
				M10 = bin2bcd0010;
				M01 = bin2bcd0001;
				break;
        case 2: H10 = 6;
				H01 = 6;
				M10 = 6;
				M01 = 6;
				break;
	}





	//BIN2BCD3shift(service_menu_c);
	H10 = service_menu_i;
		//test_16 = BIN2BCD4shift(OCR0_t);
			//test_16 = 0x0064;

		PORTC &= ~(1<<PC2); //УСТ 0 RED
		PORTC &= ~(1<<PC3); // УСТ 0 BLUE

}else{	
	if (menu_i > 0){ // Обычное меню.

		display_m(0); //Сброс регистра меню.
		display_m(menu_i);// Отображение пункта обычного меню.
		//M10 = 4;
		//M01 = menu_i;

		//Write_DS();
		//H10 = menu_i;
	}else{
	display_m(0); //Сброс регистра меню.
	// Отображение часов.

	//H10 = 1;
	//H01 = 2;
	//M10 = 0;
	//M01 = 0;
	//Read_DS();	// единожды в начале + каждую минуту по прерыванию, но не здесь!!!
	}
}
// ---> Сервисное и обычное меню.

// <--- Каждую минуту. Защита индакаторов.
if (M01_c == 0){// Если цикл остановлен
	if (!(M01 == M01_t)){// и минута сменилась - Запуск цикла.
		M01_c = 40;// Запуск цикла
		M01_t = M01;// Восстановление значения минуты.

	//7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
	//UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
		// Воспроизведение соответствующего трека:
		
		switch ( M10 ) { // 
			case 0: if (M01 == 0){ // сменился час. Минуты == 00
					// Играем час. 1-12 трек
					// функция H_to_mp3
					f_H_To_Mp3();
					// 7E FF 06 0F 00 01 04 FE E7 EF - 01/004.mp3 - 04 час (2 мин)
					//UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x04);UART_send(0xFE);UART_send(0xE7);UART_send(0xEF);
					}else{
						if (M01 > 1) {// Минута == 1 - пропускаем.  
							// Играем минуту. 13 трек.
							// 7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
							UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
						}
					}
					break; 
	        case 1: if(M01 == 5){// Минуты == 15
						// Играем четверть 14 трек.
						// 7E FF 06 0F 00 01 0E FE DD EF - 01/014.mp3 - 15 минут (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0E);UART_send(0xFE);UART_send(0xDD);UART_send(0xEF);
					}else{
						// Играем минуту. 13 трек.
						// 7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
					}
					break;
	        case 3: if(M01 == 0){// Минуты == 30.
						// Играем полчаса. 15 трек.
						// 7E FF 06 0F 00 01 0F FE DC EF - 01/015.mp3 - 30 минут (1 мин) 
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0F);UART_send(0xFE);UART_send(0xDC);UART_send(0xEF);
					}else{
						// Играем минуту. 13 трек.
						//7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
					}
					break;
	        case 4: if(M01 == 5){// Минуты == 15
						// Играем четверть. 14 трек.
						// 7E FF 06 0F 00 01 0E FE DD EF - 01/014.mp3 - 15 минут (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0E);UART_send(0xFE);UART_send(0xDD);UART_send(0xEF);

					}else{
						// Играем минуту. 13 трек.
						// 7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
					}
					break;
			default: 	// Играем минуту. 13 трек.
						// 7E FF 06 0F 00 01 0D FE DE EF - 01/013.mp3 - секунды  (1 мин)
						UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0D);UART_send(0xFE);UART_send(0xDE);UART_send(0xEF);
					break;

		}
	}
}else{
	// Цикл 40.
		M01_c--;
		
		if (H10 < 9){
			H10++;
		}else{ H10 = 0; }

		if(M01_c > 9){
			if (H01 < 9){
				H01++;
			}else{ H01 = 0; }
		}
		if(M01_c > 19){
			if (M10 < 9){
				M10++;
			}else{ M10 = 0; }
		}
		if(M01_c > 29){
			if (M01 < 9){
				M01++;
			}else{ M01 = 0; }
		}
	_delay_ms(15);
}

// ---> Каждую минуту. Защита индакаторов.

// <--- Индикация.

	display_clear();
	display_v1(H10);
	display_v2(H01);
	display_v3(M10);
	display_v4(M01);
	display_n(S01);

	hc595(U10);
	hc595(U09);	
	hc595(U08);	
	hc595(U07);
	hc595(U06);
	hc595(U05);
	hc595(U04);
	hc595(U11); //U11 = 0b00000001

	hc595_latch();

// ---> Индикация.


	//_delay_ms(250);




	//PORTC &= ~(1<<PC3); //УСТ 0
	//PORTC |= (1<<PC4); // УСТ 1
//	_delay_ms(1000);


	//asm("nop");

//	asm volatile("nop");

//	asm volatile(
//	        "nop\n\t"
//	        "nop\n\t"
//	        "nop\n\t"
//	        "nop\n\t"
//	);
	// http://we.easyelectronics.ru/AVR/assemblernye-vstavki-v-avr-gcc.html



//_delay_ms(500);// t
//PORTD = 0x00;

    //for (i=0; i<t; i++)
   //  {i_ = 0;}

//PORTD = S;
//_delay_ms(25);	//	25

  //  for (i=0; i<t; i++)
  //   {i_ = 0;}

//if (PINB &(1<<PINB4)){P  = 0b00001100; }// Реверс
//if (PINB &(1<<PINB3)){P  = 0b00110000; }//  Движение прямо
//if (PINB &(1<<PINB2)){t = t+10; }
//if (PINB &(1<<PINB1)){t = t-10; }


}// END WHILE LOOP



}//END MAIN



// ====== Функции: ======



void ADC_read(){ // Функция преобразования АЦП.
	// Калибровка нуля.
	//ADMUX |= ((1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)); // АЦП = GND
	///ADCSRA |= (1<<ADSC);// Запуск преобразования.
//	while((ADCSRA & (1<<ADSC))){};// Ждём окончания преобразования.
//	ADC_DATA_t = ADCH;// GND.
	// MUX4-0 
	// 00000 PA0
	// 00001 PA1
	// 00010 PA2
	// 00011 PA3
	// 00100 PA4
	// 00101 PA5
	// 00110 PA6
	// 00111 PA7
	// 11111 GND	
	
	ADMUX &= ~((1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)); // АЦП = PA0
	ADCSRA |= (1<<ADSC);// Запуск преобразования.

	while((ADCSRA & (1<<ADSC))){};// Ждём окончания преобразования.
	ADC_DATA = ADCH ;//- ADC_DATA_t Порт  PA0.


//	ADMUX |= (1<<MUX0); // АЦП = PA1
//	ADCSRA |= (1<<ADSC);// Запуск преобразования.
//	while((ADCSRA & (1<<ADSC))){};// Ждём окончания преобразования.
//	ADC_DATA = ADCH; 

}

// --- Запись в сдвиговый регистр: ---

void hc595(uint8_t b){ // Функция записи байта в регистр.
	//PC5 - SPI_SW. Clock_SH. 74hc595.
	//PC6 - SPI_SW. Latch_ST. 74hc595.
	//PC7 - SPI_SW. Data_DS. 74hc595.

	for(i=7; i>=0; i--){ // цикл для переменной i от 1 до k с шагом 1
		if (b&(1<<i)){
			PORTC |= (1<<PC7); // УСТ 1
		}else{
			PORTC &= ~(1<<PC7); //УСТ 0
		} 	
    	asm volatile(
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
		);
		PORTC |= (1<<PC5); // УСТ 1 - SH
		asm volatile(
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
		);
		PORTC &= ~(1<<PC5); //УСТ 0 - SH
	}
}

void hc595_latch(){ // Функция защелки байта(ов) в регистр.
	PORTC |= (1<<PC6); // УСТ 1 - ST
	asm volatile(
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
		);
	PORTC &= ~(1<<PC6); //УСТ 0 - ST
	asm volatile(
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
	        "nop\n\t"
		);
}

void display_clear(){ // Функция сброса регистров для последующего вывода числа на циферблат.
	U04 = 0x00;
	U05 = 0x00;
	U06 = 0x00;
	U07 = 0x00;
	U08 = 0x00;
	U09 = 0x00;
	U10 = 0x00;
}

void display_v1(uint8_t v1){ // Функция вывода числа 0-10 (10 - запятая) на 1ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
	switch ( v1 ) { // УСТ 1 
		case 0: U04 |= (1<<Q5); break; 
        case 1: U04 |= (1<<Q3); break;
        case 2: U04 |= (1<<Q2); break;
        case 3: U04 |= (1<<Q1); break;
		case 4: U05 |= (1<<Q4); break;
		case 5: U05 |= (1<<Q3); break;
		case 6: U05 |= (1<<Q2); break;
		case 7: U05 |= (1<<Q1); break;
		case 8: U04 |= (1<<Q7); break;
		case 9: U04 |= (1<<Q6); break;
		case 10: U04 |= (1<<Q4); break;
	}
}

void display_v2(uint8_t v2){ // Функция вывода числа 0-10 (10 - запятая) на 2ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
	switch ( v2 ) { // УСТ 1 
		case 0: U06 |= (1<<Q2); break; 
        case 1: U05 |= (1<<Q7); break;
        case 2: U05 |= (1<<Q6); break;
        case 3: U05 |= (1<<Q5); break;
		case 4: U07 |= (1<<Q1); break;
		case 5: U06 |= (1<<Q7); break;
		case 6: U06 |= (1<<Q6); break;
		case 7: U06 |= (1<<Q5); break;
		case 8: U06 |= (1<<Q4); break;
		case 9: U06 |= (1<<Q3); break;
		case 10: U06 |= (1<<Q1); break;
	}
}

void display_v3(uint8_t v3){ // Функция вывода числа 0-10 (10 - запятая) на 3ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
	switch ( v3 ) { // УСТ 1 
		case 0: U08 |= (1<<Q6); break; 
        case 1: U07 |= (1<<Q6); break;
        case 2: U07 |= (1<<Q5); break;
        case 3: U07 |= (1<<Q4); break;
		case 4: U08 |= (1<<Q5); break;
		case 5: U08 |= (1<<Q4); break;
		case 6: U08 |= (1<<Q3); break;
		case 7: U08 |= (1<<Q2); break;
		case 8: U08 |= (1<<Q1); break;
		case 9: U08 |= (1<<Q7); break;
		case 10: U07 |= (1<<Q7); break;
	}
}

void display_v4(uint8_t v4){ // Функция вывода числа 0-10 (10 - запятая) на 4ю лампу. 15(F) - лампа выкл. (> 10 = лампа выкл.)
	switch ( v4 ) { // УСТ 1 
		case 0: U09 |= (1<<Q5); break; 
        case 1: U09 |= (1<<Q3); break;
        case 2: U09 |= (1<<Q2); break;
        case 3: U09 |= (1<<Q1); break;
		case 4: U10 |= (1<<Q3); break;
		case 5: U10 |= (1<<Q4); break;
		case 6: U10 |= (1<<Q5); break;
		case 7: U10 |= (1<<Q6); break;
		case 8: U10 |= (1<<Q7); break;
		case 9: U09 |= (1<<Q6); break;
		case 10: U09 |= (1<<Q4); break;
	}
}
void display_n(uint8_t n){ // Функция включения 1й неоновой лампы(будильник)(b1). // Функция включения 2й неоновой лампы(секунда)b2.
	if (n & (1<<b1)){// N1 == 1
		U07 |= (1<<Q2);
	}	
	if (n & (1<<b2)){// N2 == 1
		U07 |= (1<<Q3);	
	}


}


void display_m(uint8_t m){ // Функция вывода обычного меню на U11.
	switch ( m ) { // УСТ 1 
		case 0: U11 = 0x00; break;
        case 1: U11 |= (1<<Q4); break;
        case 2: U11 |= (1<<Q3); break;
        case 3: U11 |= (1<<Q2); break;
		case 4: U11 |= (1<<Q1); break;
		case 5: U11 |= (1<<Q5); break;
		case 6: U11 |= (1<<Q6); break;
		case 7: U11 |= (1<<Q7); break;
		case 8: U11 |= (1<<Q0); break;
	}
}


void Read_DS(){ // Чтение часов и минут из DS3231 с конвертацией их в H10 H01 M10 M01.
	i2c_restart_cond();
	i2c_send_byte (WRITE_DS32);  // адрес записи.
	i2c_send_byte (0x00);		// адрес секунд и десятков секунд (при дальнейшем чтении, адрес инкрементируется автоматически).

	i2c_restart_cond();			// повторный старт.
	i2c_send_byte(READ_DS32);	// адрес чтения.

	S = i2c_get_byte(0); // 0 - Подтверждение, ACK, будем считывать ещё один байт.
	M = i2c_get_byte(0); //
	H = i2c_get_byte(1); // 1 - NACK, это последний считанный байт.

	i2c_stop_cond();

	H01 = (H&0x0F);
	H10 = ((H&0x30)>>4); // BIT6-7 Не интерисует. 
	
	M01 = (M&0x0F);
	M10 = ((M&0xF0)>>4);
}
void Write_DS(){ // Запись часов и минут в DS3231 с конвертацией их в H10 H01 M10 M01.
	M = (M10<<4);
	M = (M|M01);
	H = (H10<<4);
	H = (H|H01);

	i2c_restart_cond();
	i2c_send_byte (WRITE_DS32);	// адрес записи
	i2c_send_byte (0x01);		// адрес минут
	i2c_send_byte (M);
	i2c_send_byte (H);
	i2c_stop_cond();
}

void DS3231_ini(){//  Настройка часов.

	i2c_restart_cond();
	i2c_send_byte (WRITE_DS32);	// адрес записи
	i2c_send_byte (0x0E);		// адрес регистра управления
	i2c_send_byte (0x00);// Регистр 0x0E, RS2 RS1 == 1Гц, включить меандр с частотой 1 герц.
	i2c_stop_cond();

}

void menu_save(){//  Сохранение настроек.

Write_DS();
}

// <--- UART

void UART_ini(){// --- Инициализация UART: ---

//  Установка скорости 9600

UBRRH=0;    //  UBRR=f/(16*band)-1 f=4000000Гц band=9600,  4000000/153600-1 = 25,  8000000/153600-1 = 51
UBRRL=51;//25   //  нормальный асинхронный двунаправленный режим работы
 
//          RXC         -   завершение приёма
//          |TXC        -   завершение передачи
//          ||UDRE      -   отсутствие данных для отправки
//          |||FE       -   ошибка кадра
//          ||||DOR     -   ошибка переполнение буфера
//          |||||PE     -   ошибка чётности
//          ||||||U2X   -   Двойная скорость
//          |||||||MPCM -   Многопроцессорный режим
//          76543210
	UCSRA=0b00000000;

//          RXCIE       -   прерывание при приёме данных
//          |TXCIE      -   прерывание при завершение передачи
//          ||UDRIE     -   прерывание отсутствие данных для отправки
//          |||RXEN     -   разрешение приёма
//          ||||TXEN    -   разрешение передачи
//          |||||UCSZ2  -   UCSZ0:2 размер кадра данных
//          ||||||RXB8  -   9 бит принятых данных
//          |||||||TXB8 -   9 бит переданных данных
//          76543210
	UCSRB=0b00011000;   //  разрешен приём и передача по UART

//          URSEL       -   всегда 1
//          |UMSEL      -   режим:1-синхронный 0-асинхронный
//          ||UPM1      -   UPM0:1 чётность
//          |||UPM0     -   UPM0:1 чётность
//          ||||USBS    -   топ биты: 0-1, 1-2
//          |||||UCSZ1  -   UCSZ0:2 размер кадра данных
//          ||||||UCSZ0 -   UCSZ0:2 размер кадра данных
//          |||||||UCPOL-   в синхронном режиме - тактирование
//          76543210
	UCSRC=0b10000110;   //  8-битовая посылка
// https://alex-exe.ru/radio/avr/avr-uart/
}
void UART_send(unsigned char c){   //  Отправка байта
	while(!(UCSRA&(1<<UDRE))){    //  Устанавливается, когда регистр свободен
	}
	UDR = c;
}
void UART_send_str(unsigned char *s){ //  Отправка строки
 while (*s != 0) UART_send(*s++);
}
void UART_send_int(unsigned int c){ //    Отправка числа от 0000 до 9999
	unsigned char temp;
	c=c%10000;
	temp=c/100;
	UART_send(temp/10+'0');
	UART_send(temp%10+'0');
	temp=c%100;;
	UART_send(temp/10+'0');
	UART_send(temp%10+'0');
}
unsigned char UART_getch(void){ //    Получение байта
	while(!(UCSRA&(1<<RXC))){  //  Устанавливается, когда регистр свободен
	}
	return UDR;
}
// ---> UART

// !!! bin2bcd 3 знака Алгоритм «Плюс 3 и сдвиг»
void BIN2BCD3shift(volatile uint8_t digHEX){ // Двоично-десятичное преобразование.

	bin2bcd0001 = 0x00;//2 0-255
	bin2bcd0010 = 0x00;//5
	bin2bcd0100 = 0x00;//5

	int ii = 8;
	while (ii > 0){
		// 1) Корректировка (+3). 
		bin2bcd0001 &= 0x0F; //Выделение из байта младшей декады
		if (bin2bcd0001 > 4) //если декада больше 4
			bin2bcd0001 += 3;//то к ней прибавляется 3

		bin2bcd0010 &= 0x0F; //Выделение из байта младшей декады
		if (bin2bcd0010 > 4) //если декада больше 4
			bin2bcd0010 += 3;//то к ней прибавляется 3

		bin2bcd0100 &= 0x0F; //Выделение из байта младшей декады
		if (bin2bcd0100 > 4) //если декада больше 4
			bin2bcd0100 += 3;//то к ней прибавляется 3

		// 2) сдвиг 
		bin2bcd0100	<<= 1;
		
		// 3) копирование

		if (bin2bcd0010 & (1<<b3) )   // if XX_3 ==  1 старший разряд в младший разряд XX'_0
			bin2bcd0100 |= (1<<b0);
		
		bin2bcd0010	<<= 1;

		if (bin2bcd0001 & (1<<b3) )   // if XX_7 ==  1 старший разряд в младший разряд XX'_0
			bin2bcd0010 |= (1<<b0);
		
		bin2bcd0001	<<= 1;

		if (digHEX & (1<<b7) )   // if XX_7 ==  1 старший разряд в младший разряд XX'_0
			bin2bcd0001 |= (1<<b0);

		// 4)сдвиг параметра
		digHEX <<= 1;
		ii--;
	}
	bin2bcd0001 &= 0x0F; //Выделение из байта младшей декады
	bin2bcd0010 &= 0x0F; //Выделение из байта младшей декады
	bin2bcd0100 &= 0x0F; //Выделение из байта младшей декады
}// Несколько заметок о BCD-преобразованиях.pdf — Яндекс: нашлось 13 млн результатов https://megaobuchalka.ru/8/24109.html https://vgsemenov.wordpress.com/2011/11/08/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B-%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE-%D0%B4%D0%B5%D1%81%D1%8F%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1/

// <--- H to MP3

void f_H_To_Mp3(void){// воспроизвести трек соответствующий часу.
	switch(H){ 
		case 0x00:	// Играем трек 12. 7E FF 06 0F 00 01 0C FE DF EF - 01/012.mp3 - 12 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0C);UART_send(0xFE);UART_send(0xDF);UART_send(0xEF);
				break; 
        case 0x01: // Играем трек 1. 7E FF 06 0F 00 01 01 FE EA EF - 01/001.mp3 - 01 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x01);UART_send(0xFE);UART_send(0xEA);UART_send(0xEF);
				break;
        case 0x02: // Играем трек 2. 7E FF 06 0F 00 01 02 FE E9 EF - 01/002.mp3 - 02 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x02);UART_send(0xFE);UART_send(0xE9);UART_send(0xEF);
				break;
		case 0x03: // Играем трек 3. 7E FF 06 0F 00 01 03 FE E8 EF - 01/003.mp3 - 03 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x03);UART_send(0xFE);UART_send(0xE8);UART_send(0xEF);
				break;
		case 0x04: // Играем трек 4. 7E FF 06 0F 00 01 04 FE E7 EF - 01/004.mp3 - 04 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x04);UART_send(0xFE);UART_send(0xE7);UART_send(0xEF);
				break;
		case 0x05: // Играем трек 5. 7E FF 06 0F 00 01 05 FE E6 EF - 01/005.mp3 - 05 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x05);UART_send(0xFE);UART_send(0xE6);UART_send(0xEF);
				break;
		case 0x06: // Играем трек 6. 7E FF 06 0F 00 01 06 FE E5 EF - 01/006.mp3 - 06 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x06);UART_send(0xFE);UART_send(0xE5);UART_send(0xEF);
				break;
		case 0x07: // Играем трек 7. 7E FF 06 0F 00 01 07 FE E4 EF - 01/007.mp3 - 07 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x07);UART_send(0xFE);UART_send(0xE4);UART_send(0xEF);
				break;
		case 0x08: // Играем трек 8. 7E FF 06 0F 00 01 08 FE E3 EF - 01/008.mp3 - 08 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x08);UART_send(0xFE);UART_send(0xE3);UART_send(0xEF);
				break;
		case 0x09: // Играем трек 9. 7E FF 06 0F 00 01 09 FE E2 EF - 01/009.mp3 - 09 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x09);UART_send(0xFE);UART_send(0xE2);UART_send(0xEF);
				break;
		case 0x10: // Играем трек 10. 7E FF 06 0F 00 01 0A FE E1 EF - 01/010.mp3 - 10 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0A);UART_send(0xFE);UART_send(0xE1);UART_send(0xEF);
				break;
		case 0x11: // Играем трек 11. 7E FF 06 0F 00 01 0B FE E0 EF - 01/011.mp3 - 11 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0B);UART_send(0xFE);UART_send(0xE0);UART_send(0xEF);
				break;
		case 0x12: // Играем трек 12. 7E FF 06 0F 00 01 0C FE DF EF - 01/012.mp3 - 12 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0C);UART_send(0xFE);UART_send(0xDF);UART_send(0xEF);
				break;
		case 0x13: // Играем трек 1. 7E FF 06 0F 00 01 01 FE EA EF - 01/001.mp3 - 01 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x01);UART_send(0xFE);UART_send(0xEA);UART_send(0xEF);
				break;
		case 0x14: // Играем трек 2. 7E FF 06 0F 00 01 02 FE E9 EF - 01/002.mp3 - 02 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x02);UART_send(0xFE);UART_send(0xE9);UART_send(0xEF);
				break;
		case 0x15: // Играем трек 3. 7E FF 06 0F 00 01 03 FE E8 EF - 01/003.mp3 - 03 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x03);UART_send(0xFE);UART_send(0xE8);UART_send(0xEF);
				break;
		case 0x16: // Играем трек 4. 7E FF 06 0F 00 01 04 FE E7 EF - 01/004.mp3 - 04 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x04);UART_send(0xFE);UART_send(0xE7);UART_send(0xEF);
				break;
		case 0x17: // Играем трек 5. 7E FF 06 0F 00 01 05 FE E6 EF - 01/005.mp3 - 05 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x05);UART_send(0xFE);UART_send(0xE6);UART_send(0xEF);
				break;
		case 0x18: // Играем трек 6. 7E FF 06 0F 00 01 06 FE E5 EF - 01/006.mp3 - 06 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x06);UART_send(0xFE);UART_send(0xE5);UART_send(0xEF);
				break;
		case 0x19: // Играем трек 7. 7E FF 06 0F 00 01 07 FE E4 EF - 01/007.mp3 - 07 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x07);UART_send(0xFE);UART_send(0xE4);UART_send(0xEF);
				break;
		case 0x20: // Играем трек 8. 7E FF 06 0F 00 01 08 FE E3 EF - 01/008.mp3 - 08 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x08);UART_send(0xFE);UART_send(0xE3);UART_send(0xEF);
				break;
		case 0x21: // Играем трек 9. 7E FF 06 0F 00 01 09 FE E2 EF - 01/009.mp3 - 09 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x09);UART_send(0xFE);UART_send(0xE2);UART_send(0xEF);
				break;
		case 0x22: // Играем трек 10. 7E FF 06 0F 00 01 0A FE E1 EF - 01/010.mp3 - 10 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0A);UART_send(0xFE);UART_send(0xE1);UART_send(0xEF);
				break;
		case 0x23: // Играем трек 11. 7E FF 06 0F 00 01 0B FE E0 EF - 01/011.mp3 - 11 час (2 мин)
				UART_send(0x7E);UART_send(0xFF);UART_send(0x06);UART_send(0x0F);UART_send(0x00);UART_send(0x01);UART_send(0x0B);UART_send(0xFE);UART_send(0xE0);UART_send(0xEF);
				break;
	}	


}

// ---> H to MP3

