/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
 Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 13.12.2012
Author  : 
Company : 
Comments: 


Chip type               : ATtiny2313
AVR Core Clock frequency: 4.000000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>
// 1 Wire Bus interface functions
#include <1wire.h>
#include <ds18b20.h>
// Declare your global variables here
unsigned char Digits[10]={192,249,164,176,153,146,130,248,128,144};
unsigned char Digit[10]={0,2,4,5,7,8,10,12,13,15};
unsigned int temper,temper1;
signed char k,l,m;
unsigned char buf;


void Opros(void){  
    unsigned int tempcel;
    unsigned int tempdr;
    
    w1_init();
    w1_write(0xCC);
    w1_write(0x44);
    delay_us(120);
    w1_init();
    w1_write(0xCC);
    w1_write(0xBE);
    
    temper=w1_read();
    temper=((w1_read())<<8)+temper;
      
    tempcel=temper>>4;
    k=(tempcel/10)%10;
    l=tempcel%10;
    
    tempdr=temper;
    tempdr&=0x000F;
    tempdr*=625;
    m=(tempdr/1000)%10;}

void Indicator(void){
    PORTD.1=1;
    PORTB=Digits[k];
    if(PIND.5==PIND.1)buf=1;
    delay_ms(10);
    PORTD.1=0;
    PORTD.2=1;
    PORTB=Digits[l]-128;
    if(PIND.5==PIND.2)buf=2;
    delay_ms(10);
    PORTD.2=0;
    PORTD.3=1;
    PORTB=Digits[m];
    if(PIND.5==PIND.3)buf=3;
    delay_ms(10);
    PORTD.3=0;
    } 

interrupt[TIM1_OVF] void timer1_ovf_isr(void) {
    Opros();
    TIFR=0x00;
    TCNT1H=0x0E;
    TCNT1L=0x46;    
        }

interrupt[TIM0_COMPA] void timer0_compa_isr(void){
    Indicator();
    TIFR=0x00;}

       
void Menu(void){
    buf=0;
    EEAR=0;
    EECR=0b00000001;
    k=EEDR;
    EEAR=1;
    EECR=0b00000001;
    l=EEDR;
    EEAR=2;
    EECR=0b00000001;
    m=EEDR;
    TIMSK=0x01;
    while(1){
    if(buf==2){
    if(buf!=0)delay_ms(20);
    buf=0;
    m++;
    if(m>9){l++;m=0;}
    if(l>9){k++;l=0;}
    }
    if(buf==3){
    if(buf!=0)delay_ms(20);
    buf=0;
    m--;
    if(m<0){l--;m=9;}
    if(l<0){k--;l=9;}}
    if(buf==1){
        if(buf!=0)delay_ms(50);
        buf=0;
        EEAR=0;
        EEDR=k;
        EECR=0b00000100;
        EECR=0b00000110;
        delay_ms(4);
        EEAR=1;
        EEDR=l;
        EECR=0b00000100;
        EECR=0b00000110;
        delay_ms(4);
        EEAR=2;
        EEDR=m;
        EECR=0b00000100;
        EECR=0b00000110;
        delay_ms(4);
        temper1=(((10*k)+l)<<4)+Digit[m];
        return;}
    }}       
      
void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

 
PORTA=0x00;
DDRA=0x00;
  
PORTB=0xFF;
DDRB=0xFF;

PORTD=0x5F;
DDRD=0x5F;


OCR1A=0x00;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x0E;
TCNT1L=0x46;
OCR1AH=0x00;
OCR1AL=0x00;

TCCR0A=0x00;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x0E;
OCR0B=0x00;


#asm("sei");
while (1)
      {
      TIMSK=0x81;      
      if(buf!=0)delay_ms(50);
      if(buf==1){
      Menu();}
      if(temper>temper1){PORTD.4=0;}
      else{PORTD.4=1;}
      }
}
