 
  #define F_CPU 1000000L // частота тактирования мк
  #include <avr/io.h>
  #include <avr/interrupt.h> // библиотека прерываний включена   коды символов для индикатора
                                                     // 0   1   2    3    4    5    6   7   8   9   нет
 volatile unsigned char code_numbers_indicator[11] = { 40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };
 volatile unsigned char segment_Indicator_1 = 10,segment_Indicator_2 = 0,segment_Indicator_3 = 0,selection,bit_action;	
 volatile unsigned int ADC_data; // глобальная переменная 
   
 ISR  (TIMER0_COMP_vect) // прерывание по совпадению таймера T0 работа с разрядами индикатора
  {         
      bit_action |= (1<<1); // разрешение работы подпрограммы "индикатор" 
  } 
 ISR  (ADC_vect)        // прерывание по флагу "преобразование ACP выполнено"
  {
	 ADC_data = ADCW; // считываем данные ацп сразу двух байтов регистра ADC (младшего и старшего)
	 bit_action |=(1<<0); // данные приняты можно преобразовывать
  }
  //*********************//  	
void workIndicator ( void )
 {
	selection++;
	switch ( selection ) 
	 { 
		case 1:
			PORTC |= (1<<1);    // выкл. третий разряд (лог 1 PC1)
			PORTB = code_numbers_indicator[ segment_Indicator_1 ]; // берём код символа для отображения (отображаем десятки вольт) 			
			PORTD &= ~(1<<7);     // вкл. разряд первый (лог 0 PD7) отображаем десятки вольт
			break;	 			       			   		           
		case 2:
			PORTD |= (1<<7);    // выкл. первый  разряд (лог 1 PD7)
			PORTB = code_numbers_indicator[ segment_Indicator_2 ]; // берём код символа для отображения (отображаем единицы вольт)  
			PORTC &= ~(1<<0);     // вкл. разряд второй (лог 0 PC0) отображаем единицы вольт
			PORTB &=~ (1<<5);    // точка вкл.	
			break;						       				   		           	   
		case 3:
			PORTC |= (1<<0);    // выкл.второй разряд (лог 1 PC0)		
			PORTB = code_numbers_indicator[ segment_Indicator_3 ]; // берём код символа для отображения (отображаем десятые доли вольта)  
			PORTC &= ~(1<<1);     // вкл. разряд третий (лог 0 PC1) отображаем десятые доли вольта
			ADCSRA |= (1<<ADSC); // запуск разового преобразования ацп				                
			selection = 0; 				                  
			break;			       				   		           			      		   	   	
	 }
	bit_action &=~ (1<<1); 	   	      
 }
void dataProcessing ( void )
 {	
	
	asm("cli"); // запрещаем прерывание
	
	ADC_data = ADC_data; // в регистре ADC показания в мВ
	 
		 //----------------//
	segment_Indicator_1 = 0;
	while ( ADC_data >= 100  )       // вычисляем сотни
	 {
	   segment_Indicator_1++;
	   ADC_data = ADC_data - 100; 	 
	 }
	if ( segment_Indicator_1 == 0) 
	 {
	   segment_Indicator_1 = 10;     // не отображаем на разряде нечего	 
	 }	 
	segment_Indicator_2 = 0;
	while ( ADC_data >= 10  )        // вычисляем десятки
	 {
	   segment_Indicator_2++;
	   ADC_data = ADC_data - 10; 	 
	 } 
	segment_Indicator_3 = ADC_data;  // единицы
	bit_action &=~ (1<<0);
	asm("sei"); // разрешаем прерывание 
 }	
//***********************// 
  int main (void)
   {
	  OCR0=250; // число в регистре сравнения COMP                 
      TCCR0=0b00001011; // преддделитель /64; сброс по совпадению чисел в регистрах TCNT0 & OCR0=250;   
      TIMSK|=(1<<1); // вектор прерывания сработает по совпадению  
	  PORTB = 255; // выставляем порт PB в единичное состояние
	  DDRB = 255; // выставляем порт PB на вывод
	  DDRA &= ~(1<<0); // настраиваем 0 бит порт А на ввод (вход ацп)
	  ADMUX |=(0<<REFS0)|(0<<REFS1)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);  // опорное Vref=+AREF(refs0/refs1); входной канал PA0(mux0...mux4)     
      ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC); // вкл ацп (aden); разрешение прерывания (adie); предделитель adc /128 (adps0...adps2) 
	  DDRD |=(1<<7); // 7 бит порта PD на вывод
	  DDRC |=(1<<0)|(1<<1); // 0 и 1 биты порта PC на вывод
      asm("sei"); // разрешаем прерывание 
	  while(1)
       {
		 if ( bit_action & (1<<0) ) // данные приняты или нет
		  {
		    dataProcessing();       // обработка данных ацп 	  
		  }
		 if ( bit_action & (1<<1) ) // работаем с разрядами индикатора
		  {
			workIndicator();        // работаем с разрядами индикатора
		  }		    
	   }
   }
