/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 12.11.2011
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>

#include <1wire.h>

#include <ds1820.h>

#include <delay.h>
#include <stdio.h>

#define max_number 3

int r; 
int a=0, b=0, c=0, d=0, e=0, f=0, g=0, i=0;   // переменные соответствующие сегментам индикатора
int y;
int n;         // переменная где хранится истенное значение температуры
int temper;    // переменная которой присваивается истиное значение температуры выдаваемое датчиком, выполняет роль промежуточной переменной
int  _2, _1;

void clock (void)    // функция формирующая тактовый сигнал для записи значений в регистры сдвига
   {
     PORTD.7 = 1;
     PORTD.7 = 0;
   }

void strobe (void)    // функция сброса, необходимая для вывода записаных значений в регистры сдвига
   {
      PORTD.2 = 1;
      delay_ms(5);
      PORTD.2 = 0;
      delay_ms(5);
   }   
 
// функция осуществляющая обработку и вывод температуры полученой от датчиков 
// значения на семисегментный индикатор  
void function_vivoda (void)  
              {
              
               n = temper / 10;    // делем температуру полученую от датчика на 10 и получаем истенное 
                                   // значение температуры и присваиваем его переменной "n"   
                                                
              _2 = n % 10;
                n=n/10; 
              _1= n % 10;
               
               r=1;
               while (r <= 2)
                   {
                     if (r == 2) y = _1;
                     if (r == 1) y = _2; 
                     r++;
             
              switch (y)
            {
              case 0: a=1; b=1; c=0; d=0; e=0; f=0; g=0; i=0; break;
              case 1: a=1; b=1; c=1; d=1; e=0; f=0; g=1; i=1; break;
              case 2: a=1; b=0; c=0; d=0; e=1; f=0; g=0; i=1; break;
              case 3: a=1; b=0; c=1; d=0; e=0; f=0; g=0; i=1; break;
              case 4: a=1; b=0; c=1; d=1; e=0; f=0; g=1; i=0; break;
              case 5: a=1; b=0; c=1; d=0; e=0; f=1; g=0; i=0; break;
              case 6: a=1; b=0; c=0; d=0; e=0; f=1; g=0; i=0; break;
              case 7: a=1; b=1; c=1; d=1; e=0; f=0; g=0; i=1; break;
              case 8: a=1; b=0; c=0; d=0; e=0; f=0; g=0; i=0; break;
              case 9: a=1; b=0; c=1; d=0; e=0; f=0; g=0; i=0; break;
            }
            
                               
                PORTD.0 = a;
                    clock ();
                PORTD.0 = b;
                    clock ();
                PORTD.0 = c;
                   clock ();
                PORTD.0 = d;
                    clock ();
                PORTD.0 = e;
                    clock ();
                PORTD.0 = f;
                   clock ();
                PORTD.0 = g;
                    clock ();
                PORTD.0 = i; 
                   clock ();
                         
           }  
          
            strobe ();  
            
        
           }  
           
           
unsigned char p;  // индексная переменная
unsigned char number_DS1820;  // переменная где будут храниться устройства присутствующие на шине             
unsigned char cod_rom [max_number][9]; // вместо восьмёрки нужно подставить max_number
int temp [max_number];  // массив где будут храниться значения температур измеренных датчиками DS1820
               // вместо восьмёрки нужно подставить max_number

void main(void)
{  
   PORTD=0x00;
   DDRD=0x85; 
   
   
   ACSR=0x80;  
  
 
if (w1_init())
     {  
       number_DS1820 = w1_search(0xf0, &cod_rom[0][0]);  // функция определяющая сколько устройств 
                                                         // подключено к шине, и сохраняющая их
                                                         // ROM-коды в массиве cod_rom    
                                                         
                                                    
                                                         
       while (1)
          { 
            
            
            for (p=0; p<number_DS1820;p++)
              {
                temp[p]=ds1820_temperature_10(&cod_rom[p][0]);
              };
           // temper = ds1820_temperature_10(0);   // функция возвращает температуру датчика умноженую на 10
             
           temper = temp[1];
           function_vivoda ();
            //function_vivoda ();
          }; 
     }
     while (1);
}  // скобочка основной функции
