// Указать на какой частоте работает МК в Гц
#define F_CPU 16000000UL  // Частота 16 MHz

#include "LPH8731.h"
#include "hardware.h"
#include "ksh148.h"
#include "LC72131.h"
#include "encoder.h"
#include "eeprom.h"

#define ADC_BAT_100    840
#define ADC_BAT_75     800
#define ADC_BAT_50     760
#define ADC_BAT_25     720
#define ADC_BAT_0      680
#define ADC_BAT_CH     6
#define ADC_SCAN_CH    0
#define ADC_SCANFM_CH  1
#define RCV_MAX        855000
#define RCV_MIN        40000
#define SLEEP_MAX      20
#define SLEEP_MIN      3

unsigned char spectr_count = 0;
unsigned char step_spertr=59;
unsigned char k=0;
unsigned char marker_f=40;
unsigned char f_clear = FALSE;
unsigned char f_change = FALSE;

volatile uint8_t  dataLC[4];
unsigned char pwm = 0;

unsigned char Resiver_mode  = WFM_STEREO;      //режим приемника
unsigned char Stereo_in     = WFM_STEREO_IN;   //Входной стерео сигнал 
unsigned char Signal_IN     = WFM_IN;          //входной сигнал выше порога при fm или nfm или меньше порога
volatile int  sleep_count   = 0;
volatile char sleep_countS  = 0;
volatile char f_sleep       = FALSE;
volatile int  adc_bat;  
volatile char f_adc = 0;
uint32_t V_BAT = 0;                            //напряжение аккумулятора в мВ
//таймер0 кнопки
//кнопка Режим
volatile char f_press_butM  = FALSE;           //флаг нажатия кнопки Режим
volatile char f_butM        = FALSE;           //флаг статуса кнопки Режим
volatile char f_butM_3c     = FALSE;           //флаг статуса кнопки Режим при удерживании более 3 сек
volatile int  press_countM  = 0;  
//кнопка Шаг
volatile char f_press_butS  = FALSE;           //флаг нажатия кнопки Шаг
volatile char f_butS        = FALSE;           //флаг статуса кнопки Шаг
volatile char f_butS_3c     = FALSE;           //флаг статуса кнопки Шаг при удерживании более 3 сек
volatile int  press_countS  = 0;
//навигация 
volatile  unsigned char Radio_Mode    = RADIO; //переход из радио в меню и меню памяти
//меню сохранение/загрузка
unsigned char menu_radio    = SAVE;            //указатель в меню сохранить/загрузить
uint16_t Mem_R_cell         = N_MEM_RADIO_MIN; //указатель на номер загруженной ячейки памяти радиостанций
uint16_t Mem_W_cell         = N_MEM_RADIO_MIN; //указатель на номер сохраненной ячейки памяти радиостанций
unsigned char f_Memwrite    = FALSE; 
unsigned char f_SCAN        = FALSE; 
unsigned char f_SCAN_fist   = TRUE; 
//аккумулятор
unsigned char Bat_pow       = Bat_100;         //состояние аккумулятора
int           Bat_pow_int   = 0;  
//меню опций
unsigned char menu_option   = APU;             //указатель на меню опций
unsigned char APU_int       = 255;             //уровень шумодава в шим
unsigned char N_View        = View;            //Вид приемника
unsigned char ARU_int       = 255;             //уровень АРУ
volatile unsigned char Sleep_int     = 10;     //время сна в сек  
  
//------------------------------------------------------------------------------//
//-----------------------------вывод текста касающиеся приемника----------------//
//------------------------------------------------------------------------------//
//---------вывод текста в нормальном режиме
void DiplayFreq_Normal(void)
{
  char *FrcvWork_str;  
  char *FrcvStep_str = "1кГц";  
  
  Clear_Src();
  //Clear_SrcFull(0, 30, 100, 40, 0b00000011);

  FrcvWork_str = itoa2(FrcvWork);   	
  if(FrcvWork >= 100000)
     lcd_PutStr16x12(FrcvWork_str, 2, 15);
  else
  {   
     lcd_PutChar16x12(0x3A, 2, 15);
     lcd_PutStr16x12(FrcvWork_str, 14, 15);
  }	
  lcd_PutStr("КГц",80,21);  
  
  lcd_PutStrFill("      ",2,2,0b00000011, 0b00000011);           //стираем     
  switch(FindStep)
  {
     case 0:
	    FrcvStep_str = "1кГц"; break;
	 case 1:
	    FrcvStep_str = "5кГц"; break;
     case 2:
	    FrcvStep_str = "10кГц"; break;	
	 case 3:
	    FrcvStep_str = "15кГц"; break;	 
     case 4:
	    FrcvStep_str = "20кГц"; break;	 	
	 case 5:
	    FrcvStep_str = "25кГц"; break;	 
     case 6:
	    FrcvStep_str = "50кГц"; break;	 
     case 7:
	    FrcvStep_str = "100кГц"; break;	
     case 8:
	    FrcvStep_str = "500кГц"; break;	
     case 9:
	    FrcvStep_str = "1МГц"; break;
  	 case 10:
	    FrcvStep_str = "5МГц"; break; 
     case 11:
	    FrcvStep_str = "10МГц"; break; 	
  }
  lcd_PutStrFill("      ",5,2, 0b00000011, 0b11111111);
  lcd_PutStrFill(FrcvStep_str,5,2, 0b11111111,0b00000011);  
  
  
  //if(Signal_IN == WFM_IN)
  //   lcd_PutStrFill("W",36,2, 0b11111111,0b00000011); 
  //if(Signal_IN == NFM_IN)
  //  lcd_PutStrFill("N",36,2, 0b11111111,0b00000011);    
  
  if(Stereo_in == WFM_STEREO_IN)
     lcd_PutStrFill("S",45,2, 0b11111111,0b00000011);  
  
  if(Resiver_mode == WFM_STEREO)
     lcd_PutStr("WFM S",53,2);
  if(Resiver_mode == WFM_MONO)
     lcd_PutStr("WFM M",53,2);	
  if(Resiver_mode == NFM)
     lcd_PutStr("NFM  ",53,2);  
  if(N_View == FMetr)  
  { 	 
     lcd_PutRadioLine(0, 70, 0b11100011, 0b00000000);
     lcd_PutRadioFreqLine(0, 30, FrcvWork, RCV_MAX, RCV_MIN, 0b11100111);	 
  }	 
}

void DiplayLoadMemoryRadio(int8_t f_no_error)
{
    char *FrcvWork_str;	
	
    if(f_no_error == 1)
    {
       FrcvWork_str = itoa2(FrcvWorkMEM);
       if(FrcvWork >= 100000)
          lcd_PutStrFull(FrcvWork_str, 10, 47, 0b00000011, 0b11111100);
       else
       {   
          lcd_PutChar(0x3A, 10, 31, 0b00000011, 0b11100000);
          lcd_PutStrFull(FrcvWork_str, 15, 47, 0b00000011, 0b11111100);
       }  
       if(Resiver_modeMEM == WFM_STEREO)
          lcd_PutStrFull("WFM S",63,47, 0b00000011, 0b11111100);
       if(Resiver_modeMEM == WFM_MONO)
          lcd_PutStrFull("WFM M",63,47, 0b00000011, 0b11111100);	
       if(Resiver_modeMEM == NFM)
          lcd_PutStrFull("NFM  ",63,47, 0b00000011, 0b11111100);  
    }
    else
        lcd_PutStrFull("......", 10, 47, 0b00000011, 0b11111100);
}

//---------вывод текста в режиме памяти радиостанций
void DiplayMemoryRadio(void)
{
   char *FrcvWork_str;
   char *n_cell_str;
   uint16_t n_cell;
   char num_menu = 12;
   static int8_t f_no_error;
         
		 
   Clear_Src();		 
   lcd_PutStrFill("Память станций",5,13, 0b11111111,0b00000011);  

   if(menu_radio == SAVE)     num_menu = 23;
   if(menu_radio == LOAD)     num_menu = 39;
   if(menu_radio == EXIT)     num_menu = 55;
   
   lcd_PutSimol(1, 2, num_menu, 0b00000011, 0b11100000);   //стрелка      

   //----------частота и параметры сохраняемой радиостанции 
   lcd_PutStr("Сохранить я.",10,23);
   n_cell = (Mem_W_cell - 20)>>2;   
   
   n_cell_str = itoa2(n_cell); 
   lcd_PutStr(n_cell_str,70,23);
   
   if(f_Memwrite == TRUE) 
      lcd_PutStr("Cохр.",80,23);  
   
   FrcvWork_str = itoa2(FrcvWork); 
   if(FrcvWork >= 100000)
     lcd_PutStrFull(FrcvWork_str, 10, 31, 0b00000011, 0b11111100);
   else
   {   
     lcd_PutChar(0x3A, 10, 31, 0b00000011, 0b11100000);
     lcd_PutStrFull(FrcvWork_str, 15, 31, 0b00000011, 0b11111100);
   }
   
   lcd_PutStrFull("КГц",42, 31, 0b00000011, 0b11111100);
   if(Resiver_mode == WFM_STEREO)
      lcd_PutStrFull("WFM S",63,31, 0b00000011, 0b11111100);
   if(Resiver_mode == WFM_MONO)
      lcd_PutStrFull("WFM M",63,31, 0b00000011, 0b11111100);	
   if(Resiver_mode == NFM)
      lcd_PutStrFull("NFM  ",63,31, 0b00000011, 0b11111100);  
      
   //----------частота и параметры загружаемой радиостанции
   lcd_PutStr("Загрузить я.",10,39); 
   n_cell = (Mem_R_cell - 20)>>2;   
   
   n_cell_str = itoa2(n_cell); 
   lcd_PutStr(n_cell_str,70,39);
   if(menu_radio == LOAD)
   {
      if((IndMEM != Mem_R_cell) || f_Memwrite == TRUE)
      { 
         IndMEM = Mem_R_cell; 
         f_no_error = rMEM_Freq(); 
      }
      DiplayLoadMemoryRadio(f_no_error);
           
      lcd_PutStrFull("КГц",42, 47, 0b00000011, 0b11111100);
	  f_Memwrite = FALSE;
   }
      
   lcd_PutStr("Выход",10,55);
   
}

//---------вывод текста в режиме опций
void DiplayMENURadio(void)
{
   char num_menu = 12;
   char *Param_str;

   Clear_Src();		 
   lcd_PutStrFill("Настройки",5,13, 0b11111111,0b00000011);  

   if(menu_option == APU)     num_menu = 23;
   if(menu_option == View)    num_menu = 32;
   if(menu_option == ARU)     num_menu = 41;
   if(menu_option == SLEEP)   num_menu = 50;
   if(menu_option == SAVE_O)  num_menu = 59;
   if(menu_option == EXIT_O)  num_menu = 68;
   
   lcd_PutSimol(1, 2, num_menu, 0b00000011, 0b11100000);   //стрелка 

   Param_str = itoa2(APU_int); 
   lcd_PutStr(Param_str,70,23);
   lcd_PutStr("SQL упр.  = " ,10,23);  
   lcd_PutStr("Вид = ",10,32); 
   if(N_View == FMetr)
      lcd_PutStr("сетка" ,70,32); 
   if(N_View == Signal)
      lcd_PutStr("сигнал",70,32);   
   Param_str = itoa2(ARU_int);  
   lcd_PutStr(Param_str,70,41); 
   lcd_PutStr("АРУ = "       ,10,41);
   Param_str = itoa2(Sleep_int); 
   lcd_PutStr(Param_str,70,50); 
   lcd_PutStr("Сон (сек) = " ,10,50);
   lcd_PutStr("Сохранить" ,10,59);
   if(f_Memwrite == TRUE) 
   {
      f_Memwrite = FALSE;
	  lcd_PutStr("Сохр." ,70,59);
   }
   
   lcd_PutStr("Выход" ,10,68);
}

//АЦП
ISR(ADC_vect)
{
   cli(); 
   adc_bat  = ADCL;            //Read 8 low bits first (important)
   adc_bat |= (int)ADCH << 8; //read 2 high bits and shift into top byte
   f_adc = 1;
   sei();
}
//--------------------------------------------//
//----------таймер0 опроса кнопок
//--------------------------------------------//
ISR(TIMER0_OVF_vect)
{
   cli(); 
   TCNT0 = 0x64; //reload counter value
   
   if(f_butS == FALSE)
   {
   
      if(f_press_butS == FALSE)
      {  
         if(GetState(BUT_IN, BUT_S_Bit) == 0)//GetBit(BUT_IN, BUT_S_Bit)== 0)  
	     {    
	         if(press_countS != 200)
		        press_countS++;
		     else
                f_press_butS = TRUE;	
	     }
         else
         {    
            if(press_countS > 10)
               f_butS = TRUE; 
            press_countS = 0;
         }
      }
      else
      {
         if(press_countS == 200)                    
            f_butS_3c = TRUE;         
         else         
            f_butS_3c = FALSE;
         press_countS = 0;
         f_press_butS = FALSE;
         f_butS = TRUE; 	  	 	      
      }
   } 
   if(f_butM == FALSE)
   {   
      if(f_press_butM == FALSE)
      {  
         if(GetState(BUT_IN, BUT_M_Bit) == 0)//GetBit(BUT_IN, BUT_S_Bit)== 0)  
	     {    
	         if(press_countM != 200)
		        press_countM++;
		     else
                f_press_butM = TRUE;	
	     }
         else
         {    
            if(press_countM > 10)
               f_butM = TRUE;
            press_countM = 0;                                   
         }
      }
      else
      {
         if(press_countM == 200)                    
            f_butM_3c = TRUE;         
         else         
            f_butM_3c = FALSE;
         press_countM = 0;
         f_press_butM = FALSE;
         f_butM = TRUE; 	  	 	      
      }
   } 
   if(f_sleep == FALSE)
   {
      sleep_count++;
      sleep_countS = (unsigned char)(sleep_count/100);
      if(Sleep_int <= sleep_countS)
      {
         sleep_count = 0;
		 f_sleep = TRUE;
      } 
   }  
   sei();     
}
//--------------------------------------------//
//выбор режима стерео фм моно фм и узкополосное фм
void Set_Regim(void)
{
    switch(Resiver_mode)
	{
	   case WFM_STEREO:   
	        Resiver_mode = WFM_MONO;   
			Stereo_Mono  = WFM_MONO;   
			SetBit(NFMWFM_Port,NFMWFM_Bit);  //включаем FM
			Lc72131Set();
			break;
	   case WFM_MONO:     
	        Resiver_mode = NFM;        
			ClrBit(NFMWFM_Port,NFMWFM_Bit);
			break;
	   case NFM:          
	        Resiver_mode = WFM_STEREO; 
			Stereo_Mono  = WFM_STEREO;  
			SetBit(NFMWFM_Port,NFMWFM_Bit);
			Lc72131Set();
			break;
	}
	 
}

void ReadBatState(void)
{    
    unsigned char *Bat_state = (unsigned char *)Battery0;
    
    adc_init(ADC_BAT_CH); 
    Bat_pow_int = adc_read();     
   
    if(Bat_pow_int >= ADC_BAT_50 )                               Bat_pow = Bat_75;
    if(Bat_pow_int >= ADC_BAT_25 && Bat_pow_int  < ADC_BAT_50)   Bat_pow = Bat_50;
    if(Bat_pow_int >= ADC_BAT_0 && Bat_pow_int  < ADC_BAT_25)    Bat_pow = Bat_25;    
    if(Bat_pow_int < ADC_BAT_0)                                   Bat_pow = Bat_0;   
    //индикатор заряда аккумулятора    
    switch(Bat_pow)
    {
       case Bat_75:
	      Bat_state = (unsigned char *)Battery100;   break;
	   case Bat_50:
          Bat_state = (unsigned char *)Battery50;    break;
	   case Bat_25:
          Bat_state = (unsigned char *)Battery25;    break;
	   case Bat_0:
          Bat_state = (unsigned char *)Battery0;    break;	
    }     
    lcd_PutPicture(Bat_state, 0b11111000, 0b00000011, 18, 80, 2);    
}

void ReadLC72131State(void)
{  
    //char *IO_str;
	//int adc_fm=0;
	//uint32_t adc_tek;

    Lc72131Get();
    Stereo_in = StereoMono_In;
    if(Stereo_in == WFM_STEREO_IN)
       lcd_PutStrFill("S",45,2, 0b11111111,0b00000011);
    else
       lcd_PutStrFill(" ",45,2, 0b00000011, 0b11111111);      
    //Lc72131GetFreq();
	/*LC72131GetFreq();
	IO_str = itoa2(FrcvSQL);
	lcd_PutStrFill(IO_str,45,50, 0b00000011, 0b11111111); */
	_delay_ms(1);
}


void Scan(void)
{
    char *adc_str;
    static uint32_t FrcvWork_save;
	char f_Find = FALSE;
	int adc_fm=0;
    uint32_t adc_tek;
	 
	if(f_SCAN_fist == TRUE)
	{
	   FrcvWork_save = FrcvWork;
	   UapuB_Out(255);
	   f_SCAN_fist = FALSE;
	}	
	 	
	if(FrcvWork < (RCV_MAX - Step[FindStep]))
    {   
	   FrcvWork = FrcvWork + Step[FindStep]; 
	   
	   Lc72131Set(); 
       KSH14xPLL2();
	   _delay_ms(1000);
       adc_tek = 0;
	   for(unsigned int m=0; m<512; m++)
	   {
	      adc_init(ADC_SCAN_CH);
	      adc_fm = adc_read();
	      adc_tek += adc_fm;
	   }	
	   adc_tek = adc_tek>>9;
	   adc_str = itoa2(adc_tek);
	   lcd_PutStrFill(adc_str,45,50, 0b00000011, 0b11111111);  
       if(adc_tek < 300)
	   {   
	      f_Find = TRUE;
		  f_SCAN = FALSE;  
	   } 
	   if(f_butS == TRUE)
       {
	      sleep_count = 0;
	      f_butS = FALSE;     	  
	   }
    }	
	else
	   f_SCAN = FALSE;   
	
	if(f_SCAN == FALSE)
	{
	   if(f_Find == FALSE)
	   {
	      UapuB_Out(APU_int);
	      FrcvWork = FrcvWork_save;
	      Lc72131Set(); 
          KSH14xPLL2();
	   }	  
	}	
}

void SignalView(void)
{
    char *adc_str;    
	int adc_fm=0;
    uint32_t adc_tek;	 
	unsigned char m;
		
	adc_tek = 0;
	for(m=0; m<102; m++)
	{
	   adc_init(ADC_SCAN_CH);
	   adc_fm = adc_read();
	   adc_fm = -adc_fm/14 + 80;
	   DRAM[m] = (unsigned char)adc_fm;
	}	
	
	Clear_SrcFull(0, 30, 100, 50, 0b00000011); 
	lcd_PutSignal(DRAM, 0b00000011, 0b11111111, 102, 0, 30); 
	adc_tek = adc_tek>>9;
	adc_str = itoa2(adc_fm);
	lcd_PutStrFill(adc_str,80,12, 0b00000011, 0b11111111);		
}    


//-----------------------------чтение инкодера----------------------------//
ISR(TIMER2_OVF_vect)
{
   cli(); 
   TCNT2 = 0xFD; //reload counter value
   EncPoll();   
   sei();
}
//------------------------------------------------------------------------//

void LoadOptionFromEEPROM(void)
{
   if(rMEM_Options())
   {
      APU_int         = APU_intMEM;
      N_View          = N_ViewMEM;
	  ARU_int         = ARU_intMEM;
	  Sleep_int       = Sleep_intMEM;
	  FindStep        = FindStepMEM;
      FrcvWork        = FrcvWorkMEM;
      Resiver_mode    = Resiver_modeMEM;	  
   }
} 


int main(void) 
{  
  init_devices();
		
  InitLCD(); 		
  Clear_Src();
	
  FrcvWork   = 105100; 
  LoadOptionFromEEPROM();
  DiplayFreq_Normal();
  
  ON_Light();  
  UapuB_Out(APU_int); 
  UapyA_Out(ARU_int);    
  Lc72131Set(); 
  KSH14xPLL2();   	
  
  while(1)
  {
     //----------------------был нажат инкодер
	 if(Param != 0)
	 {
        switch(Radio_Mode) 
        {  
		    //---------------в режиме Радио
            case RADIO:                  
	           if(Param == RIGHT_SPIN) //инкодер повернут вверх
               {
			      if(FrcvWork < (RCV_MAX - Step[FindStep]))
                     FrcvWork = FrcvWork + Step[FindStep]; 					 	
				   
               }    
               if(Param == LEFT_SPIN)  //инкодер повернут вниз
               {
			      if(FrcvWork > (RCV_MIN + Step[FindStep]))
                     FrcvWork = FrcvWork - Step[FindStep]; 
				 
               }
		       Lc72131Set(); //выставляем новую частоту второго гетеродина в синтезаторе 
               KSH14xPLL2(); //выставляем новую частоту тюнера	
			   f_change = TRUE;              
               break;
		   //----------в меню   
           case MENU: 
               switch(menu_option)  
               {
			     case APU:   //меняем инкодером АПУ - уровень шумодава
				    if(Param == RIGHT_SPIN) APU_int++;
					if(Param == LEFT_SPIN)  APU_int--;
                    UapuB_Out(APU_int); 				    
					break;
			     case View:   //меняем инкодером уровень SQL
                    if(Param == RIGHT_SPIN) N_View = View;
					if(Param == LEFT_SPIN)  N_View = FMetr;
					break;
                 case ARU:   //меняем инкодером АРУ тюнера
                    if(Param == RIGHT_SPIN) ARU_int++;
					if(Param == LEFT_SPIN)  ARU_int--;
					UapyA_Out(ARU_int);
					break;
                 case SLEEP: //меняем инкодером время через которое проц уходит в сон
                    if(Param == RIGHT_SPIN) if(Sleep_int < SLEEP_MAX) Sleep_int++;
					if(Param == LEFT_SPIN)  if(Sleep_int > SLEEP_MIN) Sleep_int--;
					  	
			   } 		
           //----------в меню памяти     
           case MENU_MEMORY:
               switch(menu_radio)
               {
                 case SAVE: //меняем инкодером номер ячейки для сохранения
                    if(Param == RIGHT_SPIN) if(Mem_W_cell < N_MEM_RADIO_MAX) Mem_W_cell = Mem_W_cell + 4;
                    if(Param == LEFT_SPIN)  if(Mem_W_cell > N_MEM_RADIO_MIN) Mem_W_cell = Mem_W_cell - 4;
                    break;
                 case LOAD: //меняем инкодером номер ячейки для загрузки
                    if(Param == RIGHT_SPIN) if(Mem_R_cell < N_MEM_RADIO_MAX) Mem_R_cell = Mem_R_cell + 4;
                    if(Param == LEFT_SPIN)  if(Mem_R_cell > N_MEM_RADIO_MIN) Mem_R_cell = Mem_R_cell - 4;
                    break; 
               }   
               f_change = TRUE;              
               break;     
        }
		sleep_count = 0;
        Param = 0;    
	 }	
	 
	 if(f_butM == TRUE)  //нажали кнопку режим
	 { 
        switch(Radio_Mode) 
        {
           //-----------в режиме радио
           case RADIO:               
              if(f_butM_3c == FALSE) //без удержания 2 сек
		         Set_Regim();
              else                    //удержание 2 сек 
              {                    
                 DiplayMemoryRadio();
                 while(GetState(BUT_IN, BUT_M_Bit) == 0);	//ждем отпускания кнопки 			 
                 Radio_Mode =  MENU_MEMORY;
				 Clear_Src();				 
              }
			  f_butM_3c = FALSE;
			  break;
           //----------в меню   
           case MENU: 
		      switch(menu_option)
              {
			      case SAVE_O:  //если указатель на сохранить - сохраняем настройки опций    
				    APU_intMEM      = APU_int;
                    N_ViewMEM       = N_View;
	                ARU_intMEM      = ARU_int;
	                Sleep_intMEM    = Sleep_int;
					FindStepMEM     = FindStep;
                    FrcvWorkMEM     = FrcvWork;
                    Resiver_modeMEM = Resiver_mode;
                    wMEM_Options();
					f_Memwrite = TRUE;
					break;
				  case EXIT_O: //если указатель на выход - выходим из опций
				    Radio_Mode =  RADIO;
				    Clear_Src();
					break;
			  }
              break;
           //----------в меню памяти     
           case MENU_MEMORY:
              switch(menu_radio)
              {
                 case SAVE:     menu_radio = LOAD;      break; //переключаем указатель на загрузку
                 case LOAD:     menu_radio = EXIT;      break; //переключаем указатель стереть все
                 case EXIT:     menu_radio = SAVE;      break; //переключаем указатель сохранить              
              } 
              break;  
        }
		sleep_count = 0;
		f_change = TRUE;
        f_butM = FALSE; 
	 }
	 if(f_butS == TRUE)  //нажали кнопку Шаг
	 {      
        switch(Radio_Mode) 
        {
           //-----------в режиме радио
           case RADIO:         
		      if(f_butS_3c == FALSE) //без удержания 2 сек
		      {
		         if(FindStep != STEPS_MAX) FindStep++;
		         else                       FindStep = 0;                               
              }
			  else                   //удержание 2 сек
			  {
			     DiplayMENURadio();
				 while(GetState(BUT_IN, BUT_S_Bit) == 0);	//ждем отпускания кнопки 
                 Radio_Mode =  MENU;
                 Clear_Src(); 	
			  }
			  f_butS_3c = FALSE;
              break;
           //----------в меню   
           case MENU: 
		      switch(menu_option)
              { 
			     case APU:    menu_option = View;    break;//переключаем указатель на SQL
			     case View:   menu_option = ARU;     break;//переключаем указатель на АРУ                    
                 case ARU:    menu_option = SLEEP;   break;//переключаем указатель на Сон                      
                 case SLEEP:  menu_option = SAVE_O;  break;//переключаем указатель на Сохранить
				 case SAVE_O: menu_option = EXIT_O;  break;//переключаем указатель на Выход
				 case EXIT_O: menu_option = APU;     break;//переключаем указатель на АПУ
			  } 
              break;
           //----------в меню памяти     
           case MENU_MEMORY:
              switch(menu_radio)
              {
                 case SAVE:   //если указатель на сохранить - сохраняем частоту в память
                    IndMEM          = Mem_W_cell;
                    FrcvWorkMEM     = FrcvWork;
                    Resiver_modeMEM = Resiver_mode;
                    wMEM_Freq();
					f_Memwrite = TRUE;
                    break;
                 case LOAD:  //если указатель на загрузить - загружаем частоту из памяти
                    {
                       if(rMEM_Freq())
					   {					   
					      FrcvWork     = FrcvWorkMEM;
                          Resiver_mode = Resiver_modeMEM;
					      Lc72131Set(); //выставляем новую частоту второго гетеродина в синтезаторе 
                          KSH14xPLL2(); //выставляем новую частоту тюнера
					   }	  
                    }
                    break;                      
                 case EXIT:   //если указатель на выход - выходим из меню памяти
                    Radio_Mode = RADIO;
					Clear_Src();                    
                    break; 
              }    
              break;  
		}  	
        sleep_count = 0;	
		f_change = TRUE; 
        f_butS = FALSE;  
	 }
	 if(f_change == TRUE)  //при любом изменении перерисовываем изображение
	 {
	    f_change = FALSE; 
		switch(Radio_Mode) 
        {
		   //----------в режиме радио
		   case RADIO:       //перерисовываем отображение частоты 	      
			  DiplayFreq_Normal();			  
			  break;
		   //----------в меню   
           case MENU:        //перерисовываем отображение меню настройки
		       DiplayMENURadio();
              break;  
		   //----------в меню памяти     
           case MENU_MEMORY: //перерисовываем отображение меню памяти
              DiplayMemoryRadio();
              break;  	  
		}
	 }
	 if(Radio_Mode == RADIO && N_View == View)
	    SignalView();		
	 
	 ReadBatState();      //постоянно в любом режиме показываем состояние батареи
	 ReadLC72131State();  //постоянно в любом режиме показываем стерео приема
     if(f_sleep == TRUE)      //переход в сон
	 {
	    OFF_Light();
		Go_To_Sleep();
		f_sleep = FALSE;
	 }
	 if(f_WakeUP == TRUE)    //выход из сна
     {
	    ON_Light();
	    Go_To_WakeUp();
		f_WakeUP = FALSE;
     } 	 
  }
	
  return 0;
}     
