#include <mega8.h>
#include <delay.h>
#asm                             //сообщаем куда подключен датчик 
        .equ __w1_port=0x15; PORTC 
        .equ __w1_bit=3 
#endasm                                
#include <1wire.h>         
#include <ds18b20.h>         
#include <stdio.h>




#define digit1 PORTB.4      //4 анод индикатора                 
#define digit2 PORTB.3      //3 анод
#define digit3 PORTB.2      //2 анод
#define digit4 PORTB.1      //1 анод
  
flash char digits[] = {
0b01111110, //рисуем 0
0b00001100, //рисуем 1
0b10110110, //рисуем 2
0b10011110, //рисуем 3
0b11001100, //рисуем 4
0b11011010, //рисуем 5
0b11111010, //рисуем 6
0b01001110, //рисуем 7
0b11111110, //рисуем 8
0b11011110, //рисуем 9
0b11000110, //пишем знак градус...
0b01110010,    //пишем С
0b00000000,  // пустота
};

char digit_out[4], cur_dig ;  
unsigned  int indication;
unsigned char devices; 
int temp;
unsigned char sel;
           


 void recoding(void) {       
 if (indication<10000) {                         
 digit_out[0]=10;    
 digit_out[1]=11;     
 digit_out[2]=indication%10;
 indication=indication/10;     
 digit_out[3]=indication%10;
 }} 
            
interrupt [TIM0_OVF] void timer0_ovf_isr(void)     //функция вывода значений (динамическая индикация)
 {
   PORTB=0x00;
  PORTD=digits[digit_out[cur_dig]];
  switch (cur_dig){
  case 0:{digit1=1;;break;};  
  case 1:{digit2=1;break;};
  case 2:{digit3=1;break;};  
  case 3:{digit4=1;break;};
  }    
  cur_dig++;                                     
  if (cur_dig==4) cur_dig=0; 
  }      



void main(void)
{

// Port B initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
// State7=T State6=T State5=1 State4=1 State3=1 State2=1 State1=P State0=P 

DDRB=0xFF;

// Port C initialization
// Func6=In Func5=кнопка Min Func4=кнопка Hour Func3=кнопка Alarm Func2=кнопка Time Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

PORTC.4=1;
PORTC.4=1;
PORTC.5=0;
PORTC.5=1;





// Port D initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=T State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 
PORTD=0x00;
DDRD=0xFF;

               //таймер 0 запущен
TCCR0=0x02;
TCNT0=0x00;


// Timer/Counter 2 initialization
// Clock source: TOSC1 pin
// Clock value: PCK2/128
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x08;
TCCR2=0x05;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

  

// Global enable interrupts
#asm("sei")


while (1)
      { 
           
      devices=w1_init();               
      if(devices>0)                 
          { 
          temp=ds18b20_temperature(0);  
          if (temp>1000){               
             temp=4096-temp;         
             temp=-temp;          
          } 
      
      
          };
     indication=temp;
           recoding(); 
           if (!PINC.5)   
            sel++;
            if(sel>40)sel=0;  
            delay_ns(2);
            }
            indication=sel;
            recoding();
           
      
 
     }
      
      
       
          





