//Проект термометр на аналаговом датчике KYT 82/220 
//МК Мега8 на 1 МГц
#include <mega8.h>
#include <stdio.h>
#include <delay.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 0
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40
int temp;
int number=0;
int number1=0;
int number2=0;
int i=0;



// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{       
       
          PORTD=0x00; //выключаем все индикаторы
         switch(i)        
        {
          case 0: //если =0 значит работаем с 1 индикатором
          {
           number=number1; //выводим на общую шину конфигу 1 числа
           PORTD.6=1; //зажигаем 1 индикатор
           i++; //переходим к следующему индикатору
           break;
          }
// все аналогично
           case 1:
           {
            number=number2;
            PORTD.7=1;
            i=0;
            break;
           }
           
        }                      
        //зажигаем разряд
        switch(number) 
        {  
         case 0:{PORTB=0b00111111; break;}
         case 1:{PORTB=0b00000110; break;}
         case 2:{PORTB=0b01011011; break;}
         case 3:{PORTB=0b01001111; break;}
         case 4:{PORTB=0b01100110; break;}
         case 5:{PORTB=0b01101101; break;}
         case 6:{PORTB=0b01111101; break;}
         case 7:{PORTB=0b00000111; break;}
         case 8:{PORTB=0b01111111; break;}
         case 9:{PORTB=0b01101111; break;}   
        }
        
}

// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}


//Наша главная функция
void main(void)
{  
          
PORTB=0xFF;
DDRB=0xFF;

PORTD=0xE0;
DDRD=0xFF;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
TCCR1A=0x00;
TCCR1B=0x0A; // делитель на 8
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x04; 
OCR1AL=0xE2; 

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

ACSR=0x80; //Отключаем компаратор
SFIOR=0x00;// Отключаем компаратор

ADCSRA=0x00;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff); //внутренний ИОН, ADC0
ADCSRA=0xCE; //Вкл АЦП,режим одиночного преобразования, делитель на 128
// Global enable interrupts
#asm("sei")        


while (1)
      { 
       if(adc_data[0]>360)
         {
          temp = ((adc_data[0]-361)*10)/19; //расчет положительной температуры
         }
         
       if(adc_data[0]<361)
         {
          temp = ((361-adc_data[0])*10)/19;
          PORTD.5=1; //зажигаем знак "-"
         } 
         number1 = temp%10;
         number2 = temp/10;
       }
               
}