#include <90s2313.h>
#asm
   .equ __w1_port=0x12
   .equ __w1_bit=6
#endasm
#include <1wire.h>          
#include <ds18b20.h>        
#include <delay.h> 
unsigned char k = 0;
unsigned char tick = 0; 
unsigned int xtimer1 = 0; 
unsigned char j;        
unsigned char convert[16] = {0x3F,0x06,0xdb,0xcf,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00,0x54,0x5c,0x78,0x08};
signed int temperature;
char digit_out[3];   


void hex_to_dec(void)
{
	char i;
	int temp;
                
	if (temperature<1000)
	{	
		temp=temperature;
		i=0; 
     
		while (temp>=100)
		{    
			temp=temp-100;
			i++;
		};
    
		if(temperature<100)i=11;
	
		digit_out[0]=i;
		i=0;
	
		while (temp>=10)
		{    
			temp=temp-10;
			i++;
		};
	
		if(temperature<10)i=11;
	
		digit_out[1]=i;
		digit_out[2]=temp;
        }   
	else 
	{    
		temp=-temperature/1;  
		i=0;
          
		while (temp>=10)
		{    
			temp=temp-10;
			i++;
		}; 
    
		if(-temperature/1<10)i=11;
	
		digit_out[1]=i;
		digit_out[2]=temp;         
		digit_out[0]=10;
	}

}

void Send()
{
    for (j = 0; j <= 80; j++){} // Задержка для отображения цифры
    if (k == 3) k = 0;
    else k++;
    PORTD &=~0x1C ;  //Очистка PD4, PD3, PD2
    for (j = 0; j<=60; j++){} // Задержка для выключения транзистора
    switch (k)
    {
      case 0: PORTD = 0x10; // Единицы
              PORTB = convert[digit_out[2]];
        break;
      case 1: PORTD = 0x08; // Десятки
              PORTB = convert[digit_out[1]];
        break;
      case 2: PORTD = 0x04; // "-" или Сотни
              PORTB = convert[digit_out[0]];
    }
}
 
void read_temp()
{                               
    if(++xtimer1 >=5)
    {    
         xtimer1 = 0;
         temperature=ds18b20_temperature(0);
    
         if(temperature>1000)
		 {
			temperature=4096-temperature;
			temperature=-temperature;
		 }
	if (temperature!=-9999) 
	hex_to_dec();   
           
    }
}
  
 // Timer 0 overflow interrupt service routine                
 // timer interrupt every 1/15 sec provides foreground task to be run periodically.

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{    
     switch (++tick)
      {
        case 15:
        tick = 0;
        read_temp(); 
      }  
}

void init()
{    
    DDRB=0xFF;
    PORTB=0x00;
 
    DDRD=0x7F;
    PORTD=0x00;

    TCCR0=0x05;
    TCNT0=0x00;

    TIMSK=0x02;

    ACSR=0x80;

    w1_init();

    #asm("sei")
    
    digit_out[1]=12;
    digit_out[2]=14;
    digit_out[0]=12;   


}

void main ()
{ 
    init();
  
    while(1)
    { 
        Send();
    }
}