//   Версия программы с адресом TDA7314S 0x80 (строка 45) =0
//=Аудиоусилитель_2=, журнал "РадиоХобби", 2006 год, №4   =1
//Makefile: Name=rh6, MCU=atmega8, Level=2, Debug=VMLab   =2
//Фьюзы: SUT0=CKSEL3=CKSEL2=CKSEL1="0" (внутренний 1 МГц) =3
#include <rh6.h>      //Заголовочный файл (порты, тексты) =4
//--------Внешнее прерывание по входу INT0 (PD2)--------- =5
ISR(SIG_INTERRUPT0)        //Прерывание по спаду импульса =6
{ GICR &= ~(_BV(INT0));       //Запрет прерываний по INT0 =7
  switch (rc5decoder())        //Функция чтения кода RC-5 =8
		{ case RC5p: if (v == 1) p[v] += 4;\
      if (++p[v] >16) p[v]=16; rotate(1); break;  //Плюс =10
				case RC5m: if ((v == 1)&&(p[v] > 4)) p[v] -= 4;\
      if (--p[v] < 1) p[v]=1; rotate(1); break;  //Минус =12
				case RC5v: if (++v > 5) v=0; rotate(0);      //Выбор =13
		}                          //Окончание фунции "switch" =14
		GICR |= _BV(INT0);     //Разрешение прерываний по INT0 =15
}       //Окончание обработчика прерываний по входу INT0 =16
//-----------Функция проверки нажатия кнопки------------ =17
unsigned char key (unsigned char kn) //"kn" - имя кнопки =18
{ if (bit_is_clear(PINB, kn))   //Если кнопка нажата, то =19
  { _delay_ms(30);	  	  //Пауза 30 мс для "антидребезга" =20
    if (bit_is_clear(PINB, kn)) return (0); //Возврат "0"=21
  }                             //Окончание функции "if" =22
  return (1);   //Возврат "1" при не нажатой кнопке "kn" =23
}                              //Окончание функции "key" =24
//----------Функция вывода надписей на ЖКИ-------------- =25
void ind_2 (unsigned char p, unsigned char v)     //p, v =26
{ for(lcd_com(0x80), a=0; a<16; a++) lcd_dat(s[v][a]); //=27
  lcd_com(0x8B);     //Курсор на место знака <+> или <-> =28
  if ((x[v][p]) < 0) lcd_dat('-'); //Вывод знака "минус" =29
  else lcd_dat('+');       //Знак "плюс" перед числом дБ =30
  lcd_dat(abs(x[v][p])/10 + 0x30);   //Десятки дБ на ЖКИ =31
  lcd_dat(abs(x[v][p])%10 + 0x30);   //Единицы дБ на ЖКИ =32
  for(lcd_com(0xC0), a=0; a<16; a++) //Нижняя строка ЖКИ =33
  { if (a < p) lcd_dat(0xFF);     //Темный прямоугольник =34
    else          //Знак "треугольник" или пустая клетка =35
    { if (a == p) lcd_dat(0x00);    //Знак "треугольник" =36
      else lcd_dat(0x20);  //Пустая незакрашенная клетка =37
				}                      //Окончание функции "if-else" =38
  }       //Окончание вывода одной столбиковой диаграммы =39
  _delay_ms(220);  //Пауза на 220 мс (скорость столбика) =40
}                            //Окончание функции "ind_2" =41
//--------Функция ввода аудиопараметров в TDA7314------- =42
void tda_2 (void) //Используются переменные "v" и "p[v]" =43
{ unsigned char z, k=0;       //Промежуточные переменные =44
  i2start(); i2write(0x80); i2ack();         //Старт I2C =45
  z = abs(x[v][p[v] - 1]);      //Абсолютная величина дБ =46
		if (v==0)                          //Громкость 0-78 дБ =47
		{ k = (z/10 << 3) + z%10;  //Код громкости для TDA7314 =48
		  if (z%10 > 2) k--; //Нелинейная шкала при округлении =49
				if (z%10 > 8) k--; //Нелинейная шкала при округлении =50
				i2write(k);        //Запись кода громкости в TDA7314 =51
		}                     //Окончание ввода кода громкости =52
		if ((v==1)&&(z==0))  i2write(0x58);    //Усиление 0 дБ =53
		if ((v==1)&&(z==6))  i2write(0x50);    //Усиление 6 дБ =54
		if ((v==1)&&(z==12)) i2write(0x48);   //Усиление 12 дБ =55
		if ((v==1)&&(z==18)) i2write(0x40);   //Усиление 18 дБ =56
		if (v==2)                     //Тембр НЧ, -14...+14 дБ =57
  { k = (x[v][p[v] - 1] >= 0) ? 15-(z/2) : 7-(z/2);    //=58
		  i2write(0x60 + k);       //0x60 из Datasheet TDA7314 =59
		}                     //Окончание ввода кода тембра НЧ =60
		if (v==3)                     //Тембр ВЧ, -14...+14 дБ =61
  { k = (x[v][p[v] - 1] >= 0) ? 15-(z/2) : 7-(z/2);    //=62
		  i2write(0x70 + k);       //0x70 из Datasheet TDA7314 =63
		}                     //Окончание ввода кода тембра ВЧ =64
		if (v==4) //Баланс громк. по фронту LF-RF -17...+20 дБ =65
		{ i2write(0x80 + p[v]); i2ack();   //0x80 из Datasheet =66
    i2write(0xA0 + 16 - p[v]);       //0xA0 из Datasheet =67
		}      //Окончание ввода громкости (баланса) в LF и RF =68
		if (v==5)   //Баланс громк. по тылу LR-RR -17...+20 дБ =69
		{ i2write(0xC0 + p[v]); i2ack();   //0xC0 из Datasheet =70
    i2write(0xE0 + 16 - p[v]);       //0xE0 из Datasheet =71
		}	  	  //Окончание ввода громкости (баланса) в LR и RR =72
  i2ack(); i2stop();     //Завершение работы с шиной I2C =73
}                            //Окончание функции "tda_2" =74
//----Функция смены показаний ЖКИ, запись в EEPROM------ =75
void rotate (unsigned char sb) //sb=1 с записью в EEPROM =76
{ PORTD &= ~_BV(HL1);                     //Свечение HL1 =77
  ind_2(p[v] - 1, v);  //Индикация нового значения шкалы =78
		if (sb != 0) //Если требуется изменение аудиопараметра =79
		{	tda_2();             //Ввод аудиопараметра в TDA7314 =80
		  eeprom_write_byte((0x20+v),p[v]);  //Запись в EEPROM =81
		}                             //Окончание фукнции "if" =82
  else _delay_ms(50);	    //Уравнивание световой вспышки =83
 	count = 1L;  //Начало нового отсчета периода 20 секунд =84
		PORTD |= _BV(HL1);            //Гашение светодиода HL1 =85
}                           //Окончание функции "rotate" =86
//-----------Функция начальной инициализации------------ =87
void init_main(void) //Инициализация портов, ЖКИ, EEPROM =88
{ PORTB=0xFF; DDRB=0;   //Порт B - все входы с резистор. =89
  PORTC=DDRC=0xFF;         //Порт C - все выходы с лог.1 =90
  PORTD=0xFE; DDRD=0xFB;    //PD2=вход, остальные выходы =91
  lcd_init();      //Инициализация ЖКИ (4-битовый режим) =92
  lcd_com(0x81); lcd_puts("Ayгёoycё»ёїe»Д"); //Аудиоусил.=93
  lcd_com(0xC2); lcd_puts("=PaгёoXoІІё=");  //РадиоХобби =94
  lcd_com(0x40); lcd_dat(0x18);	lcd_dat(0x1C);   //Спец- =95
  lcd_dat(0x16);	lcd_dat(0x13); lcd_dat(0x13); //-символ =96
 	lcd_dat(0x16); lcd_dat(0x1C);	lcd_dat(0x18); //треугол.=97
		for (v=0; v < 6; v++)    //Загрузка настроек из EEPROM =98
  { p[v]=eeprom_read_byte(0x20 + v);  //Чтение из EEPROM =99
    if ((p[v] > 16) || (p[v]==0))   //Если был сбой, то =100
    { p[v] = (v==1) ? 1 : 8; //-25дБ гром., 0дБ остальн.=101
      eeprom_write_byte(0x20+v, p[v]); //Сохран. EEPROM =102
	   }          //Окончание начальной загрузки из EEPROM =103
				tda_2();           //Ввод аудиопараметров в TDA7314 =104
  }       //Окончание загрузки из EEPROM всех 6 режимов =105
		for(a=15; a>0; a--) _delay_ms(200); //Пауза 3 секунды =106
		PORTD |= _BV(HL1);           //Гашение светодиода HL1 =107
		GICR |= _BV(INT0); MCUCR &= ~(_BV(ISC00)); //Прерыван.=108
  MCUCR |= _BV(ISC01); sei();   //Разрешение прерываний =109
}                       //Окончание функции "init_main" =110
//===============ОСНОВНАЯ ПРОГРАММА==================== =111
int main(void)              //Начало основной программы =112
{ init_main();     //Начальная инициализация параметров =113
		while (1)            //Бесконечный цикл опроса кнопок =114
  { if (count == 0L) //Если начало или прошло 20 секунд =115
	   { v=0; ind_2(p[v]-1, v);      //Индикация громкости =116
    }         //Окончание процедуры начальной индикации =117
   	if (++count > 100000L) count = 0L;  //Прошло 20 сек =118
		  if ((key(PLUS)) == 0)  //Проверка нажатия кнопки"+" =119
		  { if (v == 1) p[v] += 4;  //УСИЛЕНИЕ через 4 клетки =120
				  if (++p[v] > 16) p[v]=16; //Останов при максимуме =121
      rotate(1);     //Ротация нового значения на шкале =122
    }                          //Окончание функции "if" =123
    if ((key(MINUS)) == 0) //Проверка нажатия кнопки "-"=124
				{ if ((v == 1)&&(p[v] > 4)) p[v] -= 4;   //4 клетки =125
				  if (--p[v] < 1) p[v]=1;    //останов при минимуме =126
      rotate(1);     //Ротация нового значения на шкале =127
    }                          //Окончание функции "if" =128
    if ((key(VYBOR)) == 0) //Проверка нажатия кн. ВЫБОР =129
    { if (++v > 5) v=0;    //Если максимум, то в начало =130
						rotate(0);         //Ротация следующего параметра =131
    }                	         //Окончание функции "if" =132
  }                         //Окончание функции "while" =133
}       //WinAVR-20060421, длина кода 2724 байтов (33%) =134
