Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#define MENU_DELAY 3
#define EXIT_MENU_DELAY 1000
//Подключение LCD
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
//Подключение датчика температуры
#asm
.equ __w1_port=0x12; PORTC
.equ __w1_bit=3
#endasm
#include <1wire.h>
#include <ds18b20.h>
eeprom float gis;
eeprom float settemp;
eeprom float cal;
eeprom float adv;
eeprom int eepkey;
void menu()
{
int count=0;
float trash;
int wh, mod;
char buffer_lcd [16];
int num=0;
float mgis=gis;
float msettemp=settemp;
float mcal=cal;
float madv=adv;
lcd_clear();
lcd_gotoxy(6,0);
lcd_putsf("MENU");
while(!PINB.1)
{
}
while(1)
{
switch(num)
{
case 0:
{
wh=msettemp;
mod=modf(msettemp,&trash)*10;
sprintf(buffer_lcd,"SET_TEMP %d.%dC ",wh,mod);
break;
}
case 1:
{
wh=mgis;
mod=modf(mgis,&trash)*100;
sprintf(buffer_lcd,"HYSTERESIS %d.%dC ",wh,mod);
break;
}
case 2:
{
wh=mcal;
mod=modf(mcal,&trash)*100;
if(mod<0)
{
mod=mod*-1;
}
sprintf(buffer_lcd,"CAL_SENS %d.%dC ",wh,mod);
break;
}
case 3:
{
wh=madv;
mod=modf(madv,&trash)*100;
sprintf(buffer_lcd,"ADV_OFF %d.%dC ",wh,mod);
break;
}
}
lcd_gotoxy(0,1);
lcd_puts(buffer_lcd);
if(!PINB.1)
{
delay_ms(30);
if(!PINB.1)
{
count++;
if(count>=100)
{
gis=mgis;
settemp=msettemp;
cal=mcal;
adv=madv;
break;
}
}
}
if(PINB.1)
{
if(count>0)
{
count=0;
if(num<3)
{
num++;
}
else
{
num=0;
}
}
}
if(!PINB.2)
{
delay_ms(50);
if(!PINB.2)
{
switch(num)
{
case 0:
{
msettemp=msettemp+0.1;
if(msettemp>40)
{
msettemp=36;
}
break;
}
case 1:
{
mgis=mgis+0.01;
if(mgis>5)
{
mgis=0;
}
break;
}
case 2:
{
mcal=mcal+0.01;
if(mcal>5)
{
mcal=-5;
}
break;
}
case 3:
{
madv=madv+0.01;
if(madv>5)
{
madv=0;
}
break;
}
}
}
delay_ms(150);
}
}
}
void main(void)
{
int wh, mod, count=0,;
float temp, trash;
char buffer_lcd [16];
if(eepkey!=233)
{
settemp=36;
gis=0.1;
cal=0;
adv=0;
eepkey=233;
}
// Настройка ввода вывода
PORTB=0b00001110;
DDRB=0b00000001;
// Инициализация LCD
lcd_init(16);
// Приветствие
lcd_clear();
lcd_gotoxy(4,0);
lcd_putsf("INCUBATOR");
lcd_gotoxy(1,1);
lcd_putsf("CONTROLLER V1.0");
delay_ms(2000);
// Инициализация 1WRITE
w1_init();
// Инициализация DS18B20
if(ds18b20_init( 0, 30, 60, DS18B20_12BIT_RES ) )
{
while(1){
// Читаем температуру
temp=ds18b20_temperature(0);
temp=temp+cal;
// Ошибка датчика
//Выводим температуру на дисплей
wh=temp;
mod=modf(temp,&trash)*10;
if(mod<0)
{
mod=mod*-1;
}
sprintf(buffer_lcd,"TEMP:%d.%dC",wh,mod);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(buffer_lcd);
//Управление нагрузкой
if(temp<=settemp-gis)
{
PORTB.0=1;
}
if(temp>=settemp)
{
PORTB.0=0;
}
//Вывод состояния нагревателя
if(PORTB.0)
{
lcd_gotoxy(0,1);
lcd_putsf("HEATER:ON ");
}
else
{
lcd_gotoxy(0,1);
lcd_putsf("HEATER:OFF ");
}
//Вход в меню
if(!PINB.1)
{
delay_ms(30);
if(count>=MENU_DELAY)
{
count=0;
// Меню-------------------------------------------------------------------
menu();
//------------------------------------------------------------------------
}
count++;
}
else
{
count=0;
}
}
}
// Ошибка датчика
else
{
lcd_clear();
lcd_gotoxy(2,0);
lcd_putsf("SENSOR ERROR");
}
}


