/*


Темброблок TDA8425 с микроконтроллерным управлением PIC16F876A
Частота кварца 8 MHz, 33pf

	Автор: Максим Наумчук
	Украина, Полтава, Полтавская обл.
		+38(093)562-85-11
			vhemaster@mail.ru
			http://vk.com/maks_naumchuk
			http://www.youtube.com/user/vhemaster

	При желании отредактировать прошивку на ваш вкус
	пишите на мой e-mail или в VK.Com Ссылки выше.
		Делаю бесплатно в своё удовольствие :)


Распространение модифицированного исходного кода или прошивки
	без уведомления автора ЗАПРЕЩЕНО! Имейте совесть.
	Ссылка на статью автора на сайте RadioKOT.ru обязательна!

*/

#include <htc.h>
#define _XTAL_FREQ 8000000
#include "lcd.h"
#include "i2c.h"
#include "tda8425.h"
#include "IR_RC5.h"


__CONFIG(HS & WDTDIS & LVPDIS & BOREN & PWRTDIS);

__EEPROM_DATA('R',-30,0,0,0,0,1,6);
__EEPROM_DATA(1,255,255,255,255,255,255,255);
__EEPROM_DATA(255,'B','y',255,'V','H','E',255);
__EEPROM_DATA('M','a','s','t','e','r','!',255);

#define PWR_LED(x)	do{RA2=x; TRISA2=x;}while(0) 
#define enc_b RB1
#define enc_a RB2
#define wire1 RA3 //Приём ИК на FM приёмнике
#define wire2 RB3 //База индикатора на приёмнике

signed char volume,balance,bass,treble;
volatile unsigned char EncData;
unsigned char OldEncData = 3;
unsigned char upcount = 0;
unsigned char downcount = 0;
unsigned char tmrmenu = 0;
unsigned char mode,sour,balL,balR;
unsigned char SwitchByte = 0b11001110;
unsigned char enc = 0;
unsigned char muted;
unsigned long int sleeptime = 0;
unsigned long int sleeptimeadd = 0;
unsigned long int sleeptimeold = 0;
unsigned int timer = 0;
const unsigned int timermult = 200;
bit firsttime;
bit stby;
bit updated = 0;
bit timerdone = 0;
bit sleeptimeren = 0;
bit sleeptimemanual = 0;
bit comehere1 = 0;
bit havetodelay = 0;
bit lang;

/* 
	RC-5 к-ды которые записываются в переменную 'command'
	Пример: if(command == 55) { если нажата кнопка под номером 55 то мы что-то делаем }
	Не забываем обнулить переменную!
52 - Выбор языка
63 - (AV) - Лин. вход
56 - (TV) - Приёмник
32 - Канал +
33 - Канал -
16 - Громкость +
17 - Громкость -
12 - Stand-By
13 - Mute
38 42 - Timer
14 - Тембр и бал. на 0
55 - Откл. подсветку
59 - OK
*/
static const char userchars[]=
{
	0b1000000,0b1010001,0b1001010,0b1000100,0b1001010,0b1010001,0b1000000,0b1000000,
	0b1010000,0b1011000,0b1010111,0b1010101,0b1010111,0b1011000,0b1010000,0b1000000,
	0b1010000,0b1010000,0b1010000,0b1010000,0b1010000,0b1010000,0b1010000,0b1010000,
	0b1011000,0b1011000,0b1011000,0b1011000,0b1011000,0b1011000,0b1011000,0b1011000,
	0b1011100,0b1011100,0b1011100,0b1011100,0b1011100,0b1011100,0b1011100,0b1011100,
	0b1011110,0b1011110,0b1011110,0b1011110,0b1011110,0b1011110,0b1011110,0b1011110,
	0b1000001,0b1000011,0b1011101,0b1010101,0b1011101,0b1000011,0b1000001,0b1000000
};
	
void DelayMs100() { __delay_ms(50); __delay_ms(50); }
void DelayMs300() { DelayMs100(); DelayMs100(); DelayMs100(); }
void lcd_putch_wait(unsigned char addrfw)
{
	__delay_ms(90);
	lcd_putch(addrfw);
}
void lcd_putch_wait2(unsigned char addrfw)
{
	__delay_ms(50);
	lcd_putch(addrfw);
}
void buttons(void)
{
	RC0=1;
	if(RC5==1) command=12;
	else if(RC6==1) command=32;
	else if(RC7==1) command=13;
	RC0=0;
	RC1=1;
	if(RC5==1) { command=17; havetodelay=1; }
	else if(RC6==1) command=33;
	else if(RC7==1) { command=16; havetodelay=1; }
	RC1=0;

	RC2=1;
	if(RC5==1) { command=38; }
	else if(RC6==1) { command=52; }
	//else if(RC7==1) { command= }
	RC2=0;
	//Матрица кнопок: резервные кнопки для пользовательских функций.
	//RC2=1;
	//if(RC5==1) { Пишем свою функцию }
	//else if(RC6==1) { Пишем свою функцию }
	//else if(RC7==1) { Пишем свою функцию }
	//Конец резервных функций
	//RC2=0;
}
void lcd_showno(unsigned char var)
{
	lcd_goto(0x0E);
	if((var/10)>0)
	{
		
		unsigned char tmp = var;
		lcd_putch(0x30 + (var/10));
		while(tmp>=10) tmp = tmp-10;
		lcd_putch(0x30 + tmp);
		
	}
	else
	{
		lcd_putch(0x20);
		lcd_putch(0x30 + var);
	}
}
void lcd_showjustno(unsigned int var)
{
	if((var/10)>0)
	{
		unsigned char tmp = var;
		lcd_putch(0x30 + (var/10));
		while(tmp>=10) tmp = tmp-10;
		lcd_putch(0x30 + tmp);
		
	}
	else
	{
		lcd_putch(0x30);
		lcd_putch(0x30 + var);
	}
}
void lcd_showmute(void)
{
	lcd_goto(0x0E);
	lcd_putch(0x00);
	lcd_putch(0x01);
}
void lcd_showline(unsigned char var)
{
	if((var > 80) && (var < 170)) var = 80;
	if((var < 190) && (var > 170)) var = 0;
	unsigned char tmp = var;
	unsigned char i = 0;
	lcd_goto(0x40);
	while(tmp>4) { lcd_putch(0xFF); tmp=tmp-5; i++; }
	if(tmp>0) lcd_putch(tmp + 0x01);
	while(i!=16) { lcd_putch(0x20); i++; }
	
}
void lcd_showbal(signed char var1)
{
	lcd_goto(0x40);
	unsigned char var2 = (var1+6);
	unsigned char i = 3;
	lcd_putch(0xFF);
	while(var2!=0)
	{
		lcd_putch(0xFF);
		var2--;
		i++;
	}
	lcd_putch(0x01);
	lcd_putch(0x06);
	while(i!=16)
	{
		lcd_putch(0xFF);
		i++;
	}	
}
void checkmute(void)
{
	if(command==13)
	{
		if (((SwitchByte & 0b00100000)>>5)) { SwitchByte = Mute(SwitchByte, 0); EEPROM_WRITE(5,0); muted=0; }
		else { SwitchByte = Mute(SwitchByte, 1); EEPROM_WRITE(5,1); lcd_showmute(); muted=1; }
		if(timer!=0) timer=10000;
	}
}
void checkled(void)
{
	if(command==55)
	{
		if (EEPROM_READ(8) == 1) { EEPROM_WRITE(8,0); PWR_LED(0); } 
		else { EEPROM_WRITE(8,1); PWR_LED(1); }
		if(timer!=0) timer=10000;
		while(command==55) { DelayMs100(); command = 255; DelayMs100(); }
	}
}
void checkpp(void)
{
	if(command == 14)
	{
		updated = 1;
		EEPROM_WRITE(3,0); EEPROM_WRITE(4,0);
		bass = 0; treble = 0;
		BassSetup(bass);
		TrebleSetup(treble); 
		if(timer!=0) timer=10000;
		while(command==14) { DelayMs100(); command = 255; DelayMs100(); }
	}
}
void checktvav(void)
{
	if(command==63 || command == 56)
	{
		if(sour == 7) sour=6;
		else if(sour == 6) sour=7;
		SwitchByte=SourceSel(SwitchByte, sour);
		EEPROM_WRITE(7,sour);
		updated = 1;
	}
}
void lcd_byebye(void)
{
	if(lang == 0)
	{
		lcd_goto(0x0B);
		lcd_putch_wait2('!');
		lcd_goto(0x0A);
		lcd_putch_wait2('k');
		lcd_goto(0x09);
		lcd_putch_wait2('c');
		lcd_goto(0x08);
		lcd_putch_wait2('u');
		lcd_goto(0x07);
		lcd_putch_wait2('l');
		lcd_goto(0x06);
		lcd_putch(0x20);
		lcd_goto(0x05);
		lcd_putch_wait2('d');
		lcd_goto(0x04);
		lcd_putch_wait2('o');
		lcd_goto(0x03);
		lcd_putch_wait2('o');
		lcd_goto(0x02);
		lcd_putch_wait2('G');		
	}
	else
	{
		lcd_goto(0x0B);
		lcd_putch_wait2('!');
		lcd_goto(0x0A);
		lcd_putch_wait2(0xBC);
		lcd_goto(0x09);
		lcd_putch_wait2(0x61);
		lcd_goto(0x08);
		lcd_putch_wait2(0x42);
		lcd_goto(0x07);
		lcd_putch(0x20);
		lcd_goto(0x06);
		lcd_putch_wait2(0xB8);
		lcd_goto(0x05);
		lcd_putch_wait2(0xC0);
		lcd_goto(0x04);
		lcd_putch_wait2(0x61);
		lcd_goto(0x03);
		lcd_putch_wait2(0xE3);
		lcd_goto(0x02);
		lcd_putch_wait2(0xA9);
	}
}
void checkstby(void)

{
	if(command==12)
	{
		lcd_clear();
		lcd_byebye();
		DelayMs100(); DelayMs300();
		SwitchByte = Mute(SwitchByte, 1);
		lcd_clear();
		DelayMs100(); DelayMs100();
		PWR_LED(0);
		wire2 = 1;
		command = 255;
		stby=1;
		sleeptime = 0;
		sleeptimeadd = 0;
		sleeptimeren = 0;
	}
}


void checktimerdone(void)

{
	if(timerdone == 1)
	{
		lcd_clear();
		lcd_byebye();
		DelayMs100(); DelayMs100(); DelayMs100(); DelayMs100();
		SwitchByte = Mute(SwitchByte, 1);
		lcd_clear();
		DelayMs100(); DelayMs100();
		PWR_LED(0);
		command = 255;
		stby=1;
		timerdone = 0;
		sleeptimeren = 0;
	}
}
void lcd_sleeptimer(void)
{
	if(lang == 0) lcd_puts("Sleep time");
	else
	{
		lcd_putch(0x42);
		lcd_putch(0x70);
		lcd_putch(0x65);
		lcd_putch(0xBC);
		lcd_putch(0xC7);
		lcd_putch(0x20);
		lcd_putch(0x63);
		lcd_putch(0xBD);
		lcd_putch(0x61);
	}
}
void checktimer(void)
{
	if((command == 38) || (command == 42))
	{
		tmrmenu = 1;
		wire1 = 0;
		changetimelcd:
		lcd_clear();
		lcd_goto(0x00);
		lcd_sleeptimer();
		if(muted==1) lcd_showmute();
		else { lcd_goto(0x0E); lcd_puts("  "); }
		changetime:
		if(timer <= 10000) timer = 10000;
		autochangetime:
		lcd_goto(0x41);
		sleeptimeold = sleeptime;

		unsigned int tmp = sleeptime;
		lcd_showjustno(sleeptime/60);
		if((sleeptimeren == 1) && !(sleeptime%2)) lcd_putch(0x20);
		else lcd_putch(0x3A);
		while(tmp>=60) tmp = tmp-60;
		lcd_showjustno(tmp);
		
		lcd_goto(0x41);
		while(command != 255) { DelayMs100(); command = 255; DelayMs100(); }
		while(timer!=0)
		{
			buttons();
			checkmute();
			if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); }
			while(command == 13) { DelayMs100(); command=255; DelayMs100(); }
			checkled();
			if((sleeptimeren == 1) && (sleeptime != sleeptimeold)) goto autochangetime;
			if((command == 38) || (command == 42))
			{
				timer = 30000; 
				while((command == 38) || (command == 42)) { DelayMs100(); command = 255; DelayMs100(); } 
			}
			if((command == 32) || (command == 33) || (command == 59))
			{	
				goto done;
			}
			if(command == 16)
			{
				if(sleeptimemanual == 0 && sleeptimeren == 0)
				{
					sleeptimemanual = 0;
					if(sleeptime < 180) sleeptime = sleeptime+60;
					else if(sleeptime == 180) sleeptime = 300;
					else if(sleeptime == 300) sleeptime = 600;
					else if(sleeptime == 600) sleeptime = 900;
					else if(sleeptime == 900) sleeptime = 1500;
					else if(sleeptime == 1500) sleeptime = 2700;
					else if(sleeptime >= 2700) sleeptime = 0;
					checkled();
					timer = 30000;
					goto changetime;
				}
				else { sleeptime = 60; sleeptimeren = 0; sleeptimemanual = 0; goto changetime; }
				
			}
			if((command == 17) && (sleeptimemanual == 0) && (sleeptimeren == 0))
			{
				sleeptimemanual = 0;
				if(sleeptime == 2700) sleeptime = 1500;
				else if(sleeptime == 1500) sleeptime = 900;
				else if(sleeptime == 900) sleeptime = 600;
				else if(sleeptime == 600) sleeptime = 300;
				else if(sleeptime == 300) sleeptime = 180;
				else if((sleeptime <= 180) || sleeptime != 0) sleeptime = sleeptime-60;
				else if(sleeptime == 0) sleeptime = 2700;
				checkled();
				timer = 30000;
				goto changetime;	
			}
			__delay_us(300); timer--;
			if((command == 0) || (command == 1) || (command == 2) || (command == 3) || (command == 4) || (command == 5) || (command == 6) || (command == 7) || (command == 8) || (command == 9))
			{
				if(sleeptimemanual == 0 || sleeptimeren == 1) { sleeptimeren = 0; sleeptimemanual = 1; sleeptime = 0; }
				command = 255;
				lcd_clear();
				lcd_write(0xF); 
				lcd_clear();
				lcd_goto(0x00);
				lcd_sleeptimer();
				if(muted==1) lcd_showmute();
				else { lcd_goto(0x0E); lcd_puts("  "); }
				lcd_goto(0x41);
				lcd_puts("00:00");
				lcd_goto(0x41);
				while((command == 0) || (command == 1) || (command == 2) || (command == 3) || (command == 4) || (command == 5) || (command == 6) || (command == 7) || (command == 8) || (command == 9)) { DelayMs100(); command = 255; DelayMs100(); }
				
				while(1)
				{
					if(command == 0) { lcd_putch(0x30); sleeptime=0;   goto II; }
					else if(command == 1) { lcd_putch(0x31); sleeptime=600; goto II; }
					else if(command == 2) { lcd_putch(0x32); sleeptime=1200; goto II; }
					else if(command == 3) { lcd_putch(0x33); sleeptime=1800; goto II; }
					else if(command == 4) { lcd_putch(0x34); sleeptime=2400; goto II; }
					else if(command == 5) { lcd_putch(0x35); sleeptime=3000; goto II; }
					else if(command == 6) { lcd_putch(0x36); sleeptime=3600; goto II; }
					else if(command == 7) { lcd_putch(0x37); sleeptime=4200; goto II; }
					else if(command == 8) { lcd_putch(0x38); sleeptime=4800; goto II; }
					else if(command == 9) { lcd_putch(0x39); sleeptime=5400; goto II; }
					else if(command == 59) { lcd_write(0xC); goto comehere_2; }
					checkled();
				}
				II:
				while((command == 0) || (command == 1) || (command == 2) || (command == 3) || (command == 4) || (command == 5) || (command == 6) || (command == 7) || (command == 8) || (command == 9)) { DelayMs100(); command = 255; DelayMs100(); }
					
				while(1)
				{
					if(command == 0) { lcd_putch(0x30); goto III; }
					else if(command == 1) { lcd_putch(0x31); sleeptime=sleeptime+60; goto III; }
					else if(command == 2) { lcd_putch(0x32); sleeptime=sleeptime+120; goto III; }
					else if(command == 3) { lcd_putch(0x33); sleeptime=sleeptime+180; goto III; }
					else if(command == 4) { lcd_putch(0x34); sleeptime=sleeptime+240; goto III; }
					else if(command == 5) { lcd_putch(0x35); sleeptime=sleeptime+300; goto III; }
					else if(command == 6) { lcd_putch(0x36); sleeptime=sleeptime+360; goto III; }
					else if(command == 7) { lcd_putch(0x37); sleeptime=sleeptime+420; goto III; }
					else if(command == 8) { lcd_putch(0x38); sleeptime=sleeptime+480; goto III; }
					else if(command == 9) { lcd_putch(0x39); sleeptime=sleeptime+540; goto III; }
					else if(command == 59) { lcd_write(0xC); goto comehere_2; }
					checkled();
				}
				III:
				lcd_putch(0x3A);
				while((command == 0) || (command == 1) || (command == 2) || (command == 3) || (command == 4) || (command == 5)) { DelayMs100(); command = 255; DelayMs100(); }
				
				while(1)
				{
					if(command == 0) { lcd_putch(0x30); goto VI; }
					else if(command == 1) { lcd_putch(0x31); sleeptime=sleeptime+10; goto VI; }
					else if(command == 2) { lcd_putch(0x32); sleeptime=sleeptime+20; goto VI; }
					else if(command == 3) { lcd_putch(0x33); sleeptime=sleeptime+30; goto VI; }
					else if(command == 4) { lcd_putch(0x34); sleeptime=sleeptime+40; goto VI; }
					else if(command == 5) { lcd_putch(0x35); sleeptime=sleeptime+50; goto VI; }
					else if(command == 59) { lcd_write(0xC); goto comehere_2; }
					checkled();
				}
				VI:
				while((command == 0) || (command == 1) || (command == 2) || (command == 3) || (command == 4) || (command == 5) || (command == 6)) { DelayMs100(); command = 255; DelayMs100(); }
				
				while(1)
				{
					if(command == 0) { lcd_putch(0x30); goto comehere_2; }
					else if(command == 1) { lcd_putch(0x31); sleeptime=sleeptime+1; goto comehere_2; }
					else if(command == 2) { lcd_putch(0x32); sleeptime=sleeptime+2; goto comehere_2; }
					else if(command == 3) { lcd_putch(0x33); sleeptime=sleeptime+3; goto comehere_2; }
					else if(command == 4) { lcd_putch(0x34); sleeptime=sleeptime+4; goto comehere_2; }
					else if(command == 5) { lcd_putch(0x35); sleeptime=sleeptime+5; goto comehere_2; }
					else if(command == 6) { lcd_putch(0x36); sleeptime=sleeptime+6; goto comehere_2; }
					else if(command == 7) { lcd_putch(0x37); sleeptime=sleeptime+7; goto comehere_2; }
					else if(command == 8) { lcd_putch(0x38); sleeptime=sleeptime+8; goto comehere_2; }
					else if(command == 9) { lcd_putch(0x39); sleeptime=sleeptime+9; goto comehere_2; }
					else if(command == 59) { lcd_write(0xC); goto comehere_2; }
					checkled();
				}
				comehere_2:
				timer = 30000;
				lcd_clear();
				lcd_write(0xC);
				lcd_clear();
				sleeptimeren == 0;
				goto changetimelcd;
			}
			if((sleeptimeren == 1) && (sleeptime == 2)) { goto done;}
		}
		done:
		wire1 = 1;
		lcd_write(0xC);
		while(command != 255) { DelayMs100();  command = 255; DelayMs100(); }
		if((sleeptime != 0) && (sleeptimeren == 0)) { sleeptimeren = 1;  sleeptimeadd = (sleeptime * timermult); }
		command = 255;
	}
}
void lcd_ourlang(void)
{
	lcd_goto(0x40);
	if(lang == 0) lcd_puts("English");
	else
	{
		lcd_putch(0x50);
		lcd_putch(0x79);
		lcd_putch(0x63);
		lcd_putch(0x63);
		lcd_putch(0xBA);
		lcd_putch(0xB8);
		lcd_putch(0xB9);
	}
	
}
void checklang(void)
{
	if(command == 52)
	{
		tmrmenu = 1;
		lcd_clear();
		lcd_goto(0x00);
		if(lang == 0) lcd_puts("Language");
		else
		{
			lcd_putch(0xB1);
			lcd_putch(0xB7);
			lcd_putch(0xC3);
			lcd_putch(0xBA);
		}
		if(muted==1) lcd_showmute();
		else { lcd_goto(0x0E); lcd_puts("  "); }
		lcd_ourlang();
		timer=10000;
		while(command != 255) { DelayMs100(); command=255; DelayMs100(); }
		while(timer!=0)
		{
			buttons();
			checkmute();
			if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); }
			while(command == 13) { DelayMs100(); command=255; DelayMs100(); }
			checkled();
			if((command == 32) || (command == 33) || (command == 59))
			{	
				goto donelang;
			}
			if(command == 16 || command == 17)
			{
				if(lang == 0) lang=1;
				else lang=0;
				lcd_ourlang();
				timer=10000;
				while((command==16) || (command==17)) { DelayMs100(); command = 255; DelayMs100(); }
			}
			timer--; __delay_us(300);
		}
		donelang:
		command = 255;
		__delay_us(1);
	}
}
void encoder(void)
{
	if (OldEncData != EncData) 
	{
		switch (OldEncData) 
		{
		case 0 :	if (EncData == 1) {upcount++; downcount=0; }
					if (EncData == 2) {downcount++; upcount = 0; }
					break;
		case 1 :	if (EncData == 3) {upcount++; downcount=0; }
					if (EncData == 0) {downcount++; upcount = 0; }
					break;
		case 2 : 	if (EncData == 0) {upcount++; downcount=0; }
					if (EncData == 3) {downcount++; upcount = 0; }
					break;
		case 3 : 	if (EncData == 2) {upcount++; downcount=0; }
					if (EncData == 1) {downcount++; upcount = 0; }
					break;
		}
	OldEncData = EncData;    
	
	}
 
	if (upcount >= 4)
	{       
		enc=0x01;
		upcount = 0;
	}
	if (downcount >= 4 )
	{   
		enc=0x02;
		downcount = 0;
	}
}
void lcd_greetings(void)
{
	if(lang == 0)
	{
		lcd_puts("   ");
		lcd_putch_wait('G');
		lcd_putch_wait('r');
		lcd_putch_wait('e');
		lcd_putch_wait('e');
		lcd_putch_wait('t');
		lcd_putch_wait('i');
		lcd_putch_wait('n');
		lcd_putch_wait('g');
		lcd_putch_wait('s');
		lcd_putch_wait('!');
	}
	else
	{		
		lcd_putch_wait(0xE0);
		lcd_putch_wait(0x6F);
		lcd_putch_wait(0xB2);
		lcd_putch_wait(0x70);
		lcd_putch_wait(0x6F);
		lcd_putch(0x20);
		lcd_putch_wait(0xBE);
		lcd_putch_wait(0x6F);
		lcd_putch_wait(0xB6);
		lcd_putch_wait(0x61);
		lcd_putch_wait(0xBB);
		lcd_putch_wait(0x6F);
		lcd_putch_wait(0xB3);
		lcd_putch_wait(0x61);
		lcd_putch_wait(0xBF);
		lcd_putch_wait(0xC4);
	}
	DelayMs100(); DelayMs100();
	DelayMs100(); DelayMs100();
	DelayMs100();
}

void lcd_volume(void)
{
	if(lang == 0) lcd_puts("Volume");
	else
	{
		lcd_putch(0xA1);
		lcd_putch(0x70);
		lcd_putch(0x6F);
		lcd_putch(0xBC);
		lcd_putch(0xBA);
		lcd_putch(0x6F);
		lcd_putch(0x63);
		lcd_putch(0xBF);
		lcd_putch(0xC4);
	}
}
void lcd_bass(void)
{
	if(lang == 0) lcd_puts("Bass");
	else
	{
		lcd_putch(0x54);
		lcd_putch(0x65);
		lcd_putch(0xBC);
		lcd_putch(0xB2);
		lcd_putch(0x70);
		lcd_putch(0x20);
		lcd_putch(0x48);
		lcd_putch(0xAB);
	}
}
void lcd_treble(void)
{
	if(lang == 0) lcd_puts("Treble");
	else
	{
		lcd_putch(0x54);
		lcd_putch(0x65);
		lcd_putch(0xBC);
		lcd_putch(0xB2);
		lcd_putch(0x70);
		lcd_putch(0x20);
		lcd_putch(0x42);
		lcd_putch(0xAB);
	}
}
void lcd_mode(void)
{
	if(lang == 0) lcd_puts("Mode");
	else
	{
		lcd_putch(0x50);
		lcd_putch(0x65);
		lcd_putch(0xB6);
		lcd_putch(0xB8);
		lcd_putch(0xBC);
	}
}
void lcd_input(void)
{
	if(lang == 0) lcd_puts("Input");
	else
	{
		lcd_putch(0x42);
		lcd_putch(0x78);
		lcd_putch(0x6F);
		lcd_putch(0xE3);
	}
}
void lcd_mode0(void)
{
	if(lang == 0) lcd_puts("mono");
	else
	{
		lcd_putch(0x4D);
		lcd_putch(0x6F);
		lcd_putch(0xBD);
		lcd_putch(0x6F);
	}
}
void lcd_mode1(void)
{
	if(lang == 0) lcd_puts("stereo");
	else
	{
		lcd_putch(0x43);
		lcd_putch(0xBF);
		lcd_putch(0x65);
		lcd_putch(0x70);
		lcd_putch(0x65);
		lcd_putch(0x6F);
	}
}
void lcd_mode2(void)
{
	if(lang == 0) lcd_puts("pseudo");
	else
	{
		lcd_putch(0xA8);
		lcd_putch(0x63);
		lcd_putch(0x65);
		lcd_putch(0xB3);
		lcd_putch(0xE3);
		lcd_putch(0x6F);
		lcd_putch(0x63);
		lcd_putch(0xBF);
		lcd_putch(0x65);
		lcd_putch(0x70);
		lcd_putch(0x65);
		lcd_putch(0x6F);
	}
}
void lcd_mode3(void)
{
	if(lang == 0) lcd_puts("spatial");
	else
		{
		lcd_putch(0xA8);
		lcd_putch(0x70);
		lcd_putch(0x6F);
		lcd_putch(0x63);
		lcd_putch(0xBF);
		lcd_putch(0x70);
		lcd_putch(0x61);
		lcd_putch(0xBD);
		lcd_putch(0x63);
		lcd_putch(0xBF);
		lcd_putch(0xB3);
		lcd_putch(0x65);
		lcd_putch(0xBD);
		lcd_putch(0xBD);
		lcd_putch(0xC3);
		lcd_putch(0xB9);
	}
}
void lcd_input6(void)
{
	lcd_goto(0x40);
	if(lang == 0) lcd_puts("line in ");
	else
	{
		lcd_putch(0xA7);
		lcd_putch(0xB8);
		lcd_putch(0xBD);
		lcd_putch(0x65);
		lcd_putch(0xB9);
		lcd_putch(0xBD);
		lcd_putch(0xC3);
		lcd_putch(0xB9);
		lcd_putch(0x20);
		lcd_putch(0xB3);
		lcd_putch(0x78);
		lcd_putch(0x6F);
		lcd_putch(0xE3);
	}
}
void lcd_input7(void)
{
	lcd_goto(0x40);
	lcd_putch('F');
	lcd_putch('M');
	lcd_putch(0x20);
	if(lang == 0) lcd_puts("tuner");
	else
	{
		lcd_putch(0xBE);
		lcd_putch(0x70);
		lcd_putch(0xB8);
		lcd_putch(0xB5);
		lcd_putch(0xBC);
		lcd_putch(0xBD);
		lcd_putch(0xB8);
		lcd_putch(0xBA);
		lcd_puts("  ");
	}
}
void lcd_balance(void)
{
	if(lang == 0) lcd_puts("Balance");
	else
	{
		lcd_putch(0xA0);
		lcd_putch(0x61);
		lcd_putch(0xBB);
		lcd_putch(0x61);
		lcd_putch(0xBD);
		lcd_putch(0x63);
	}
}
void lcd_loadchars(void)
{
	lcd_write(0x40);
    lcd_puts(userchars);
}
void init_audioprocessor(void)
{
	PWR_LED(0);
	lcd_init();
	lcd_clear();
	lcd_loadchars();
	lcd_clear();
	lcd_goto(0x00);

	__delay_ms(50);
	lcd_puts("  ");
	if(EEPROM_READ(0) == 'R')
	{
		lcd_putch(0xA4);
		lcd_putch(0x61);
		lcd_putch(0xB4);
		lcd_putch(0x70);
		lcd_putch(0x79);
		lcd_putch(0xB7);
		lcd_putch(0xBA);
		lcd_putch(0x61);
		lang = 1;
	}
	else { lang = 0; lcd_puts("Loading."); }
	lcd_puts("..");

	TRISC0 = 0;
	TRISC1 = 0;
	TRISC2 = 0;
	RC0=0; RC1=0; RC2=0;

	TRISC5 = 1;
	TRISC6 = 1;
	TRISC7 = 1;

	TRISB3 = 0;
	wire2 = 1;
	volume = EEPROM_READ(1);
	balance = EEPROM_READ(2);
	bass = EEPROM_READ(3);
	treble = EEPROM_READ(4);
	mode = EEPROM_READ(6);
	sour = EEPROM_READ(7);
	if(balance<0)
	{
		balL = (0-balance);
		balR = 0;
	}
	else if(balance>0)
	{
		balR = balance;
		balL = 0;
	}
	else if(balance==0)
	{
		balL = 0;
		balR = 0;
	}
	firsttime = 1;
	if(EEPROM_READ(5) == 0) muted = 0;
	else muted = 1;
	I2C_Init();
	VL(volume-(balL*2));
	VR(volume-(balR*2));
	BassSetup(bass);
	TrebleSetup(treble);
	TRISA3 = 0;
	wire1 = 0;
	TRISB2 = 1;
	TRISB1 = 1;
	INTEDG = 0;
	INTCON = 0b11010000;
	OPTION = 0b11010001;
	T2CON  = 0b01001101;
	RBPU = 0;
	TMR0 = 0;
	PR2 = 250;
	T0IE = 1;
	TMR1IE = 1;
	TMR2IE = 1;
	PEIE = 1;
	INTE = 1;
	GIE = 1;
	__delay_ms(30);
	lcd_puts("OK");
	DelayMs100(); DelayMs100(); DelayMs100();
	lcd_clear();
	lcd_goto(0);
	DelayMs300();

}
void edit_bass(void)
{
	checkmute();
	if(havetodelay == 1) { havetodelay=0; DelayMs100(); }
	if(muted==0)
	{
		if(bass==0) lcd_showno(0);
		else if(bass>0)
		{
			lcd_showno((bass)/3);
			lcd_goto(0x0E);
			lcd_putch('+');
		}
		else if(bass<0)
		{
			lcd_showno((0-bass)/3);
			lcd_goto(0x0E);
			lcd_putch('-');
		}
		muted = 2;
	}	
	while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
	checktvav(); updated=0;
	while(command==63 || command==56) { DelayMs100(); command = 255; DelayMs100(); }
	buttons(); encoder();
	if(enc!=0x00 || (command==16 || command==17))
	{
		if(enc==0x02 || command==16)
		{
			bass=bass+3; 
			if(bass > 15) { bass=15; goto nobassch; }
			
		}
		else if(enc==0x01 || command==17)
		{
			bass=bass-3; 
			if(bass < -12) { bass=-12; goto nobassch; }
		}
		BassSetup(bass);
		EEPROM_WRITE(3,bass);
		nobassch:
		command = 255;
		enc=0;
		if(muted==1) lcd_showmute();
		else if(bass==0) lcd_showno(0);
		else if(bass>0)
		{
			lcd_showno((bass)/3);
			lcd_goto(0x0E);
			lcd_putch('+');
		}
		else if(bass<0)
		{
			lcd_showno((0-bass)/3);
			lcd_goto(0x0E);
			lcd_putch('-');
		}
		lcd_showline(((bass+15)*8)/3);
		
		
		timer=10000;
	}

}

void edit_treble(void)
{
	checkmute();
	if(havetodelay == 1) { havetodelay=0; DelayMs100(); }
	if(muted==0)
	{ 
		if(treble==0) lcd_showno(0);
		else if(treble>0)
		{
			lcd_showno((treble)/3);
			lcd_goto(0x0E);
			lcd_putch('+');
		}
		else if(treble<0)
		{
			lcd_showno((0-treble)/3);
			lcd_goto(0x0E);
			lcd_putch('-');
		}
		muted = 2;
	}	
	while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
	checktvav(); updated=0;
	while(command==63 || command==56) { DelayMs100(); command = 255; DelayMs100(); }
	buttons(); encoder();
	if(enc!=0x00 || (command==16 || command==17))
	{
		if(enc==0x02 || command==16)
		{
			treble=treble+3; 
			if(treble > 12) { treble=12; goto notreblech; }
			
		}
		else if(enc==0x01 || command==17)
		{
			treble=treble-3; 
			if(treble < -12) { treble=-12; goto notreblech; }
		}
		TrebleSetup(treble);
		EEPROM_WRITE(4,treble);
		notreblech:
		command = 255;
		enc=0;
		if(muted==1) lcd_showmute();
		else if(treble==0) lcd_showno(0);
		else if(treble>0)
		{
			lcd_showno((treble)/3);
			lcd_goto(0x0E);
			lcd_putch('+');
		}
		else if(treble<0)
		{
			lcd_showno((0-treble)/3);
			lcd_goto(0x0E);
			lcd_putch('-');
		}
		lcd_showline((treble+15)*3);
		timer=10000;
		
	}

}
void edit_balance(void)
{
	checkmute();
	if(havetodelay == 1) { havetodelay=0; DelayMs100(); }
	if(muted==0)
	{
		if((balR == 0) && (balance != 0)) { lcd_showno(balL); lcd_goto(0x0E); lcd_putch('L'); }
		else if((balL == 0) && (balance != 0)) { lcd_showno(balR); lcd_goto(0x0E); lcd_putch('R'); }
		else if(balance == 0) lcd_showno(0);
	}
	while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
	checktvav(); updated=0;
	while(command==63 || command==56) { DelayMs100(); command = 255; DelayMs100(); }
	buttons(); encoder();
	if(enc!=0x00 || (command==16 || command==17))
	{
		if(enc==0x02 || command==16)
		{
			balance++;
			if(balance > 6) { balance=6; goto nobalch; }
			
		}
		else if(enc==0x01 || command==17)
		{
			balance--;
			if(balance < -6) { balance=-6; goto nobalch; }
		}
		
		EEPROM_WRITE(2,balance);
		if(balance<0)
		{
			balL = (0-balance);
			VL(volume-(balL*2));
		}
		else if(balance>0)
		{
			balR = balance;
			VR(volume-(balR*2));
		}
		else if(balance==0)
		{
			VMe(volume);
			balL = 0;
			balR = 0;
		}
		nobalch:
		command = 255;
		enc=0;
		if(muted==1) lcd_showmute();
		else
		{
			if((balR == 0) && (balance != 0)) { lcd_showno(balL); lcd_goto(0x0E); lcd_putch('L'); }
			else if((balL == 0) && (balance != 0)) { lcd_showno(balR); lcd_goto(0x0E); lcd_putch('R'); }
			else if(balance == 0) lcd_showno(0);
		}
		lcd_showbal(balance);
		
		timer=10000;
	}
}

void edit_mode(void)
{
	checkled();
	if(havetodelay == 1) havetodelay=0;
	checkmute();
	if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); }
	while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
	checktvav(); updated=0;
	while(command==63 || command==56) { DelayMs100(); command = 255; DelayMs100(); }
	buttons(); encoder();

	if(enc!=0x00 || (command==16 || command==17))
	{
		if(enc==0x02 || command==16)
		{
			if(mode==3) mode=0;
			else mode++;
			
		}
		else if(enc==0x01 || command==17)
		{
			if(mode==0) mode=3;
			else mode--;
		}
		enc=0;
		EEPROM_WRITE(6,mode);
		lcd_goto(0x40);
		lcd_puts("                ");
		lcd_goto(0x40);
		if(mode==1) lcd_mode1();
		else if(mode==2) lcd_mode2();
		else if(mode==3) lcd_mode3();
		else if(mode==0) lcd_mode0();
		SwitchByte = ModeSel(SwitchByte, mode);
		while((command==16) || (command==17)) { DelayMs100(); command = 255; DelayMs100(); }
		timer=10000;
	}
}
void main()
{
	init_audioprocessor();
	command = 255;
	checkstbyn:
	buttons();
	if(command == 12) goto start;
	else goto checkstbyn;

	//ON
	//-----
	start:
	stby=0;
	if(EEPROM_READ(8) == 1) PWR_LED(1);
	else PWR_LED(0);
	__delay_ms(10);
	
	lcd_greetings();
	if(firsttime == 1)
	{
		firsttime = 0;
		SwitchByte = SourceSel(SwitchByte, sour);
		SwitchByte = ModeSel(SwitchByte, mode);
	}
	if(muted==1) SwitchByte = Mute(SwitchByte, 1);
	else SwitchByte = Mute(SwitchByte, 0);
	if(sour==7) wire2=0; else wire2=1;

	wire1 = 1;
	command = 255;
	startui:
	lcd_clear();
	lcd_goto(0x00);
	lcd_volume();
	if(muted==1) lcd_showmute();
	else lcd_showno((volume+66)/2);
	lcd_showline((volume+66));
	while(command != 255) { DelayMs100(); command = 255; DelayMs100(); }



	while (1)
	{
		buttons(); encoder();
		if(havetodelay == 1) { havetodelay=0; __delay_ms(68); }
		if(enc!=0x00 || (command==16 || command==17))
		{
			if(enc==0x02 || command==16)
			{
				volume=volume+2; 
				if(volume > 6) { volume=6; goto novolch; }
				
			}
			else if(enc==0x01 || command==17)
			{
				volume=volume-2; 
				if(volume < -66) { volume=-66; goto novolch; }
			}	
			VR(volume-(balR*2));
			VL(volume-(balL*2));
			EEPROM_WRITE(1,volume);
			novolch:
			command = 255;
			enc=0;
			if(muted==1) lcd_showmute();
			else lcd_showno((volume+66)/2);
			lcd_showline(volume+66);
		}
		if(command==32)
		{
			bass:
			lcd_clear();
			lcd_goto(0x00);
			lcd_bass();
			if(muted==1) lcd_showmute();
			else if(bass==0) lcd_showno(0);
			else if(bass>0)
			{
				lcd_showno((bass)/3);
				lcd_goto(0x0E);
				lcd_putch('+');
			}
			else if(bass<0)
			{
				lcd_showno((0-bass)/3);
				lcd_goto(0x0E);
				lcd_putch('-');
			}
			lcd_showline(((bass+15)*8)/3);
			timer=10000;
			if(muted==0) { lcd_showno((bass+12)/3); muted = 2; }
			while((command==32) || (command==33)) { DelayMs100(); command = 255; DelayMs100(); }
			while(timer!=0)
			{
				checkled();
				checkpp(); if(updated == 1) { updated=0; goto bass; }
				checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
				checklang();
				checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
				edit_bass();
				if(command==32)
				{
					treble:
					lcd_clear();
					lcd_goto(0x00);
					lcd_treble();
					if(muted==1) lcd_showmute();
					else if(treble==0) lcd_showno(0);
					else if(treble>0)
					{
						lcd_showno((treble)/3);
						lcd_goto(0x0E);
						lcd_putch('+');
					}
					else if(treble<0)
					{
						lcd_showno((0-treble)/3);
						lcd_goto(0x0E);
						lcd_putch('-');
					}
					lcd_showline((treble+15)*3);
					timer=10000;
					if(muted==0) { lcd_showno((treble+15)/3); muted = 2; }
					while((command==32 || command==33)) { DelayMs100(); command = 255; DelayMs100(); }
					while(timer!=0)
					{
						checkled();
						checkpp(); if(updated == 1) { updated=0; goto treble; }
						checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
						checklang();
						checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
						edit_treble();
						
						if(command==32)
						{
							balance:
							lcd_clear();
							lcd_goto(0x00);
							lcd_balance();
							if(muted==1) lcd_showmute();
							else
							{
								if((balR == 0) && (balance != 0)) { lcd_showno(balL); lcd_goto(0x0E); lcd_putch('L'); }
								else if((balL == 0) && (balance != 0)) { lcd_showno(balR); lcd_goto(0x0E); lcd_putch('R'); }
								else if(balance == 0) lcd_showno(0);
							}
							lcd_showbal(balance);
							timer=10000;
							if(muted==0) { lcd_showno((bass+12)/3); muted = 2; }
							while((command==32) || (command==33)) { DelayMs100(); command = 255; DelayMs100(); }
							while(timer!=0)
							{
								checkled();
								checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
								checklang();
								checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
								edit_balance();
		
								if(command==32)
								{
									mode:
									lcd_clear();
									lcd_goto(0x00);
									lcd_mode();
									if(muted==1) lcd_showmute();
									else { lcd_goto(0x0E); lcd_puts("  "); }
									lcd_goto(0x40);
									if(mode==1) lcd_mode1();
									else if(mode==2) lcd_mode2();
									else if(mode==3) lcd_mode3();
									else if(mode==0) lcd_mode0();
									
									timer=10000;
									if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); muted = 2; }
									while((command==32) || (command==33)) { DelayMs100(); command = 255; DelayMs100(); }
									while(timer!=0)
									{
										checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
										checklang();
										checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
										edit_mode();
										if(command==32)
										{
											input:
											lcd_clear();
											lcd_goto(0x00);
											lcd_input();
											if(muted==1) lcd_showmute();
											else { lcd_goto(0x0E); lcd_puts("  "); }
											lcd_goto(0x40);
											if(sour==6) lcd_input6();
											else if(sour==7) lcd_input7();
											
											timer=10000;
											if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); muted = 2; }
											while((command==32) || (command==33) || (command==56) || (command==63)) { DelayMs100(); command = 255; DelayMs100(); }
											while(timer!=0)
											{
												if(havetodelay == 1) havetodelay=0;
												checkled();
												checkmute();
												if(muted==0) { lcd_goto(0x0E); lcd_puts("  "); }
												while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
												checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
												checklang();
												checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
												checktvav(); if(updated == 1) { updated=0; goto input; }
												buttons(); encoder();

												if(enc!=0x00 || (command==16 || command==17))
												{
													if(sour==6) { sour=7; wire2=0; }
													else { sour=6; wire2=1; }
													enc=0;
													EEPROM_WRITE(7,sour);
													if(sour==6) lcd_input6();
													else if(sour==7) lcd_input7();
													SwitchByte = SourceSel(SwitchByte, sour);
													while((command==16) || (command==17)) { DelayMs100(); command = 255; DelayMs100(); }
													timer=10000;
														
												}
												__delay_us(300); timer--;
												if(command == 33) goto mode;
												if(command == 32) goto startui;
											}
											goto startui;
										}
											
										__delay_us(300); timer--;
										if(command == 33) goto balance;
										if(command == 32) goto input;
									}
									goto startui;
								}

								__delay_us(300); timer--;
								if(command == 33) goto treble;
								if(command == 32) goto mode;
							}
							goto startui;
						}

						__delay_us(300); timer--;
						if(command == 33) goto bass;
						if(command == 32) goto balance;
					}
					goto startui;
				}
				__delay_us(300); timer--;
				if(command == 33) goto startui;
			}
			goto startui;
		}	
		
	checkmute();
	checktvav(); updated=0;
	while(command==63 || command==56) { DelayMs100(); command = 255; DelayMs100(); }
	if(muted==0) { lcd_showno((volume+66)/2); muted = 2; }
	while(command==13) { DelayMs100(); command = 255; DelayMs100(); }
	checkled(); updated=0;
	checkpp();
	checkstby(); checktimerdone(); if(stby==1) goto checkstbyn;
	checklang();
	checktimer(); if(tmrmenu==1) { tmrmenu=0; goto startui; }
	if(command == 33) goto input;
	}

}

void interrupt my_isr(void)
{
	IR_RC5();
	//buttons();
	if (TMR2IF && TMR2IE)
	{
		if(sleeptimeren == 1)
		{
			sleeptimeadd--;
			sleeptime = (sleeptimeadd / timermult);
			if(sleeptimeadd == 0)
			{
				timerdone = 1;
				sleeptimeren = 0;
			}
		}
		TMR2IF=0;
	}
	if (T0IF)
	{
		TMR0 = 0;
		EncData = PORTB & 0b00000110;
		EncData >>= 1;
		T0IF = 0;
	}
	
}
