/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.5 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 31.10.2009
Author  : zhu4ara                         
Company : zhu4ara                         
Comments: 


Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#asm                             //сообщаем куда подключен датчик
        .equ __w1_port=0x15; PORTC
        .equ __w1_bit=2
#endasm
#include <1wire.h>               //библиотека работы с 1Wire
#include <ds18b20.h>
#define a 1
#define b 2
#define c 4
#define d 8
#define e 16
#define f 32
#define g 64
#define DP 128

int Number = 0;
int i = 0;
char Dig[10];
char Disp5, Disp6, Disp7;
char devices;  //переменная в которой количество присоеденённых датчиков

//подпрограмма выделения цифры из трёхзначного числа
void Display (int Num)
{
char Num1, Num2, Num3;
Num1=Num2=0;
while (Num >= 100)
{
Num -= 100;
Num1++;
}
while (Num >= 10)
{
Num -= 10;
Num2++;
}
Num3 = Num;
Disp5 = Dig[Num1];
Disp6 = Dig[Num2];
Disp7 = Dig[Num3];
}

void DisplayMin (int Num)
{
char Num1, Num2, Num3;
Num1=Num2=0;
while (Num >= 100)
{
Num -= 100;
Num1++;
}
while (Num >= 10)
{
Num -= 10;
Num2++;
}
Num3 = Num;
Disp5 = 0b10111111;
Disp6 = Dig[Num2];
Disp7 = Dig[Num3];
}

//подпрограмма заполнения массива цифрами для общ. анода(255 убрать, если для общего катода)
void Dig_init()
{
Dig[0] = 255 - (a + b + c + d + e + f);
Dig[1] = 255 - (b + c);
Dig[2] = 255 - (a + b + d + e + g);
Dig[3] = 255 - (a + b + c + d + g);
Dig[4] = 255 - (b + c + f + g);
Dig[5] = 255 - (a + c + d + f + g);
Dig[6] = 255 - (a + c + d + e + f + g);
Dig[7] = 255 - (a + b + c);
Dig[8] = 255 - (a + b + c + d + e + f + g);
Dig[9] = 255 - (a + b + c + d + f + g);
}

void main (void)
{
char k = 0;
//инициализация порта B
PORTB=0xC1;
DDRB=0xC1;
//инициализация порта C
PORTC=0x00;
DDRC=0x00;
//инициализация порта D
PORTD=0xFF;
DDRD=0xFF;
//0
TCCR0=0x00;
TCNT0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//2
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

#asm ("sei");

Dig_init();
Display(0);
devices=w1_init(); //ищем датчики 

while(devices > 0)
{
Number = ds18b20_temperature(0);
if (Number > 1000) {
Number = 4096 - Number;
DisplayMin(Number);
}
else
Display(Number);
for (i = 0; i < 5000; i++) {
delay_ms (2);
if (k == 3) k = 0;
else
{
PORTB = 0x00;
k++;
switch (k)
{
case 1: PORTB = 0x80; //единицы
        PORTD = Disp7;
break;
case 2: PORTB = 0x40; //десятки
        PORTD = Disp6;
break;
case 3: PORTB = 0x01; //сотни
        PORTD = Disp5;
}
}
}
}
}