
#include <mega16.h>  
#include <delay.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h>

#include "common.h"

#define xtal 8000000L
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x1b ;PORTB
   .equ __w1_bit=2
#endasm    

#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds1820.h>
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS1820 1
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds1820_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds1820_rom_codes[MAX_DS1820][9];

//****************************************************************************
  
void GetTemperature();  

unsigned char Flags;
unsigned int ctm0=0; //Счетчик циклов таймера №1
unsigned int cTemp=0; //Счетчик циклов таймера №2
char EditMode=0;
char strIDX=0;
char lastIDX=0;

int T;
unsigned char Buf[17]; 
char IO[] = {"     "};
//Данное #DEFINE имеется в common.h 
#ifdef _EEPROM   
  eeprom char WCopen      = 5;   //Время открытой двери туалета
  eeprom char step1  = 5;   //Время перед запуском вентилятора      
  eeprom char Tscn       = 1;
#else
  char WCopen      =5;   //Время открытой двери туалета
  char step1       =5;   //Время перед запуском вентилятора    
  char Tscn       = 1;
#endif

#ifdef _EEPROM  
eeprom char *sEM            = "   Edit  mode   "; 
eeprom char *sLR            = "<-PREV    NEXT->"; 
eeprom char *WC_open        = "WC open door Tm ";
eeprom char *One_stair        = "VN open door Tm ";  
eeprom char *VN_temp_scan   = "Temp. scan Tm   "; 
#else 
char *sEM            = "   Edit  mode   "; 
char *sLR            = "<-PREV    NEXT->";
char *WC_open        = " WC open door Tm";
char *One_stair      = " VN open door Tm";   
char *VN_temp_scan   = " Temp. scan Tm  "; 
#endif

//Значок градуса CODE=1  
#ifdef _EEPROM
eeprom
#endif
char S0[]={
 0b01100,  
 0b10010,
 0b01100,
 0b00000,
 0b00000,
 0b00000,
 0b00000
}; 

//Значок вентилятора CODE=2 
#ifdef _EEPROM
eeprom
#endif
char S1[]={
 0b00100,  
 0b00110,
 0b10110,
 0b11100,
 0b00111,
 0b01101,
 0b01100
};

//Значок часов CODE=3 
#ifdef _EEPROM
eeprom
#endif
char S2[]={
 0b11111,  
 0b10001,
 0b10001,
 0b10011,
 0b10001,
 0b10001,
 0b11111
};

 

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 TCNT0 = 0x83; //перегрузить таймер
 ctm0++;                
 //ждать 1 секунду
 if (ctm0<1000) return; 
 ctm0=0;
 
   
} //end of proc

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
  TCNT2 = 0x83; //перегрузить таймер     
  cTemp++;                
 //ждать 10 секунд 
 
 if (cTemp<Tscn*1000) return; 
 cTemp=0; 
 if ( (Flags & GetTemp)==0 ) Flags |=GetTemp; //Можно мерять температуру 
}

void ShowTemperature(){
 sprintf(Buf,"T=%i.%u\xdfC",T/10,T%1);  
 //0x00 - это 1-я строка 0-е знакоместо
 LCD_POS(0x07);
 LCD_str(Buf);
}

unsigned char state,old_state;  




void main(void)
{

Flags=0;
//Все порты входы
PORTA=0xFF;
DDRA=0x00;
//Выход на дисплей
PORTB=0x00;
DDRB=0xFC;
//Все порты выходы
PORTC=0x00;
DDRC=0xFF;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1mSec
 TCCR0 = 0x00; //stop
 TCNT0 = 0x83; //set count
 TCCR0 = 0x03; //start timer 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1mSec
// Mode: Normal top=FFh
// OC2 output: Disconnected
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x83; //setup
 OCR2  = 0x7D;
 TCCR2 = 0x03; //start
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=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;

w1_init();        // 1 Wire Bus initialization
// Determine the number of DS1820 devices
 // connected to the 1 Wire bus
 ds1820_devices=w1_search(0xf0,ds1820_rom_codes);
#asm("sei")     // Global enable interrupts
 init_LCD();   //Инициализация LCD

 //Забубенить вместо первых символов в знакогенераторе свои
 //Устанавливаем адрес CGRAM
 LCD_CMD(0x48);
 delay_us(50);    
 //Записать
 for (old_state=0; old_state<8; old_state++) LCD_CHAR(S0[old_state]);  
 for (old_state=0; old_state<8; old_state++) LCD_CHAR(S1[old_state]);  
 for (old_state=0; old_state<8; old_state++) LCD_CHAR(S2[old_state]);   
 LCD_CMD(0x80);      //Устанавливаем адрес DDRAM 
 delay_us(50);
 
 old_state=0;   

 while (1)
{ 
            

  //измерить температуру    
  if (Flags & GetTemp) GetTemperature();                  
  
 //Считать состояние клавиатуры и герконов  (исключить датчик температуры)
  state = PINA & 0b11111000;
  //Немного подождать, чтобы убрать эффект дребезга контактов
  delay_ms(50);   
 
  //Если ничего не нажато/отпущено, то ничего не делать
  if (state==old_state)  continue;  
  
  //Кнопка Enter включает/выключает режим редактирования
  if ( !(state & btEnter) ) { 
   EditMode = ~EditMode;
   
   LCD_clear();   // Очистить дисплей
   if (EditMode ){ 
    strIDX=0;
   }
   else{
    
    ShowTemperature();
   }
  }
  
 
  
  old_state=state;
 };
} 

void GetTemperature(){
   //Если находимся в режиме редактирования, то ничего не делать
   if (EditMode ) return;
   
   #asm("cli"); 
   T=ds1820_temperature_10(0);
   //Библиотечная функция сделана для DS1820, а для 18B20 надо так:
   T=T>>3;  
   #asm("sei"); 
   ShowTemperature();    {}
   delay_ms(3);
   Flags = Flags & (~GetTemp);//Сбрость флаг 
}

