// Тест-программа. Головной модуль.
// Версия 1.01
//   
/*
Проект состоит из файлов:
- Device1.c - Головной модуль
- fun_real.c - реальные внешние функции
- fun_mod.c - внешние функции для моделирования
- lcd_real.c - реальные текстовые константы
- lcd_mod.c - текстовые константы для моделирования
- i2c.c - процедуры работы с устройствами последовательного доступа 
*/


/*==================================================*/
#include <reg51.h>

#include <stdio.h>
#include <math.h>
/*==================================================*/
 
 
/*------------------БЛОК ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ------------------*/
 
unsigned char a1,b1,c1,mm;
unsigned char Jalo_Type, Mode_Sound, Smesch, Tang;
unsigned char ch[12];
unsigned char bdata SysBit;
unsigned short s;
bit Key_Press;
sbit sb0 = SysBit^0;
sbit sb1 = SysBit^1;
sbit sb2 = SysBit^2;
sbit sb3 = SysBit^3;
sbit sb4 = SysBit^4;
sbit sb5 = SysBit^5;
sbit sb6 = SysBit^6;
sbit sb7 = SysBit^7;
unsigned int i, *pint;
/*Текстовые константы для индикатора*/

extern code char SMA1[], SMA2[], Sexit[], SMAON[], SMAOFF[], Saer[];
extern code char Sopt1[],  Sopt2[], Sopt3[], Sopt4[], Sopt5[], Sdw1[];
extern code char Stg1[],  Stg2[], Stg3[], Stg4[];
extern code char Sstb[], Ssnd1[], Ssnd2[], Ssmm1[];
extern code char Us1[],  Us2[], Us3[], Us4[], Us5[], Us6[], Us7[], Us8[];



extern code char e0[];
extern code char e1[];
extern code char e2[];
extern code char e3[];
extern code char e4[];
extern code char e5[];
extern code char e6[];  
extern code char e7[];
extern code char e8[];
extern code char e9[];
extern code char e10[];
//code char e0[] =	{32,32,32,66,72,165,77,65,72,165,69,32,33,32,32,32,32,67,178,112,111,99,32,190,184,191,97,189,184,199,33,32}; 
/*Текстовые константы для индикатора*/
 
/**/
/*Два регистра для работы с битами*/
unsigned char bdata VD, D, Pins;
unsigned short Resistor, Datchik;
sbit VD0 = VD^0;
sbit VD1 = VD^1;
sbit VD2 = VD^2;
sbit VD3 = VD^3;
sbit VD4 = VD^4;
sbit VD5 = VD^5;
sbit VD6 = VD^6;
sbit VD7 = VD^7;
sbit D0 = D^0;
sbit D1 = D^1;
sbit D2 = D^2;
sbit D3 = D^3;
sbit D4 = D^4;
sbit D5 = D^5;
sbit D6 = D^6;
sbit D7 = D^7;

/*
Описания выводов портов*/
/* - ПОРТ P0 - */
//Порт управления индикатором

// 7-4 - Шина данных индикатора 

	sbit LD0 = 	P0^7;
	sbit LD1 = 	P0^6;
	sbit LD2 = 	P0^5;
	sbit LD3 = 	P0^4;
	sbit E = 	P0^3;
	sbit RW = 	P0^2;
	sbit RS = 	P0^1;
	sbit GRLED= P0^0;
	
/* - ПОРТ P2 - */
	sbit CS = 	P2^0;
	sbit CLK = 	P2^1;
	sbit SDI = 	P2^2;
	sbit LD = 	P2^3;	
	sbit CLR = 	P2^4;
	
	sbit SCL = P2^6;
	sbit SDA = P2^5; 
	
/* - ПОРТ P3 - */	
	sbit SND = 		P3^2;

	sbit KSET 		= 	P3^3;
	sbit KSELECT	= 	P3^4;
	sbit KCANCEL 	= 	P3^5;

	sbit TERMOK = 	P3^6;
	sbit RESIK = 	P3^7;
/* - ПОРТ P1 - */
	sbit HTS = 	P1^0;

/*-------------*/ 	
/* - --------- - */
/*-------------------------------------------------------------*/
/*Объявление констант функций LCD										*/
/* !!! Уточнить не перевернуто ли ! */
#define	ClearDisplay	1
#define	CursorHome		3
#define	EntryModeSet	6	/*The display is not shifted			*/
#define	DisplayConrol	12	/*Display ON,Cursor OFF,Brink OFF	*/
#define	CursorDShift	23	/*Cursor shift,shift to the rigth	*/
#define	FunctionSet		40	/* 4 bit bus, 2 line, 5*7dots			*/
/*-------------------------------------------------------------*/

#define	Key_Select   1
#define	Key_Set    	 2
#define	Key_Cancel   3

//Адрес бита состояния в внешней флэшке
#define	Addr_Mode	0
 
#define	ON		1
#define	OFF	0
 
#define	LINE1	0
#define	LINE2	1

//  I2C slave adress
//#define	Clock	 0xD0
#define	FRAM	0xA0	

#define	R	1
#define	W	0
/*------------------------------------------------------------------------------*/
// Внешние функции для работы с I2C
extern void BusDelay(void);
extern bit CheckBus(void);
extern void CleanBus(void);
extern void StartBit(void);
extern void StopBit(void);
extern void Ack(void);
extern void NoAck(void);
extern bit WriteByte(unsigned char wbyte);
extern unsigned char ReadByte(void);
extern bit WriteAddr(unsigned char wbt,  bit rw);
/*------------------------------------------------------------------------------* 
 
/*-------------------------------------------------------------*/
/*Описания внешних функций*/
/*Процедура задержки. Аргумент задает 1/10 сек*/
	extern void wait(unsigned char timer);
/*задержка для индикатора - 1.78 ms*/
	extern void BigWait(void);
/*малая задержка для индикатора*/
	extern void mwait(void);
/*	Вывод строковой константы на дисплей*/
	extern void PrintLcd(code char PL[]);
/*	Процедура PrintByte ()						*/
/* Осуществляет индикацию значения байта
	в формате "0 - 255".
	аргументы:
		tmr - значение байта (0..255)
		line - Указание линии (LINE1,LINE2)
		symbol - номер первого символа из 4 в линии(1..16)
		ks - Колличество отображаемых символов (1-3)*/
extern void PrintByte(unsigned char *tmr, bit line,  unsigned char symbol, unsigned char ks);
//
/*Конец блока объявления переменных*/


/*------------------------------------------------------------------------------*/
/*		SetBit()-								*/
/*		Функция установки бита			*/
/*		pbyte - подопытный байт				*/
/*		Nbit - порядковый номер бита		*/
/*		chto - желаемое значение бита		*/
/*		(Надо разобратся с УКАЗАТЕЛЯМИ !)*/
unsigned char SetBit(pbyte, Nbyte, chto)
unsigned char pbyte, Nbyte;
bit chto;
{
	D = pbyte;
	switch (Nbyte)
	{
			case 0: D0 = chto; break;
			case 1: D1 = chto; break;
			case 2: D2 = chto; break;
			case 3: D3 = chto; break;				
			case 4: D4 = chto; break;
			case 5: D5 = chto; break;
			case 6: D6 = chto; break;
			case 7: D7 = chto; break;								
	}
	return(D);   
}                 
/*		----------------------------		*/
 
/*		GetBit()-								*/
/*		Функция возвращает значение		*/
/*		желаемого бита							*/
/*		pbyte - подопытный байт				*/
/*		Nbit - порядковый номер бита		*/
bit GetBit(pbyte, Nbyte)
unsigned char pbyte,Nbyte;
{
	bit b;
	D = pbyte;
	b = 0;
	switch (Nbyte)
	{
			case 0: b = D0; break;
			case 1: b = D1; break;
			case 2: b = D2; break;
			case 3: b = D3; break;				
			case 4: b = D4; break;
			case 5: b = D5; break;
			case 6: b = D6; break;
			case 7: b = D7; break;								
	}
	return(b);		
}      
/*		----------------------------		*/ 


 
/*	sd(Data,RS)
		Процедура записи команды в индикатор	
	iDta - байт, подаваемый на входы данных
	RSs - Бит RS										*/
void sd(iDta, RSs)	
unsigned char iDta;
bit RSs;
{
   //
   unsigned char sa1,sb1;
   //
	E = 0;
	RW = 0;
	RS = RSs;	
	VD = iDta;
	mwait();
//	Подготовка первой тетрады
	sa1 = P0;
	sb1 = 15;
	sa1 = sa1&sb1;
	D =0;
	D4 = VD7;
	D5 = VD6;
	D6 = VD5;
	D7 = VD4;
	sa1 = sa1|D;
	
	P0 = sa1;
	mwait(); 
					
/*Строб*/		
	E = 1;
	mwait();	
	/*задержка для "длинных" команд*/
	if (RSs==0)
		if (VD==1 || VD==2|| VD==3)
			BigWait();	
	/**/
	E = 0;
	if (RSs==0)
		if (VD==1 || VD==2|| VD==3)
			BigWait();
	mwait();
/* --- */
//	Подготовка второй тетрады
	sa1 = sa1&sb1;
	D = 0;
	D4 = VD3;
	D5 = VD2;
	D6 = VD1;
	D7 = VD0;
	sa1 = sa1|D;
	
	P0 = sa1;
	mwait(); 
/*Строб*/		
	E = 1;
	mwait();
	
	/*задержка для "длинных" команд*/
	if (RSs==0)
		if (VD==1 || VD==2|| VD==3)
			BigWait();	
	/**/
	E = 0;
	if (RSs==0)
		if (VD==1 || VD==2|| VD==3)
			BigWait();
	mwait();
/* --- */
//Шину данный в исходное состояние...
	//P0 = P0;
	mwait();			
	return;
}
 
 
/* Инициализация дисплея*/
void LcdInit (void)
{ 
	wait(1);	 
	//Эмуляция FunctionSet для 8-ми битного режима
	E = 0;
	RW = 0;
	RS = 0;	
	VD = FunctionSet;

//	Подготовка первой тетрады
	a1 = P0;
	b1 = 15;
	a1 = a1&b1;
	D =0;
	D4 = VD7;
	D5 = VD6;
	D6 = VD5;
	D7 = VD4;
	a1 = a1|D;
//	
	P0 = a1;
	BigWait(); 
					
/*Строб*/		
	E = 1;
	BigWait();	
	E = 0;
	BigWait();
	//
	P0 = 240;
/* --- */	
	BigWait();
	BigWait();
	
	sd(FunctionSet,0);	/* 4 bit bus, 2 line, 5*7dots*/
	sd(FunctionSet,0);	/**/
	sd(ClearDisplay,0);	
	sd(CursorHome,0); 	
	sd(EntryModeSet,0);	/*The display is not shifted*/
	sd(DisplayConrol,0);	/*Display ON,Cursor OFF,Brink OFF*/
	sd(CursorDShift,0);	/*Cursor shift,shift to the rigth*/
	return;		
}  




//Функции фоспроизведения звука
void sound1(void)
{
	unsigned char sc1,sc2,sc3;
//	unsigned short ss1;
   if (Mode_Sound==0)  return;	
	for (sc3=0; sc3!=10; sc3++)
	{
	for (sc2=0; sc2!=5; sc2++)
	{
		 SND=1;
		 for (sc1=1; sc1!=100+sc2*5; sc1++){}
		 SND=0;
		 for (sc1=1; sc1!=100+sc2*5; sc1++){}	
	}
	for (sc2=0; sc2!=5; sc2++)
	{
		 SND=1;
		 for (sc1=1; sc1!=100; sc1++){}
		 SND=1;
		 for (sc1=1; sc1!=100; sc1++){}	
	}
	}

}
/*---------------------------------------------------------*/

void Key_Set_Sound(void)
{
	unsigned char sc1,sc2;
   if (Mode_Sound==0)  return;
	
	for (sc2=0; sc2!=80; sc2++)
	{
		 SND=1;
		 for (sc1=1; sc1!=200; sc1++){}
		 SND=0;
		 for (sc1=1; sc1!=200; sc1++){}	
	}
	
}
void Key_Cancel_Sound(void)
{
	unsigned char sc1,sc2;
   if (Mode_Sound==0)  return;	
	for (sc2=0; sc2!=90; sc2++)
	{
		 SND=1;
		 for (sc1=1; sc1!=180; sc1++){}
		 SND=0;
		 for (sc1=1; sc1!=180; sc1++){}	
	}
}
void Key_Select_Sound(void)
{
	unsigned char sc1,sc2;
   if (Mode_Sound==0)  return;	
	for (sc2=0; sc2!=100; sc2++)
	{
		 SND=1;
		 for (sc1=1; sc1!=150; sc1++){}
		 SND=0;
		 for (sc1=1; sc1!=150; sc1++){}	
	}
}



 
/*---------------------------------------------------------*/

//ФУНКЦИИ ДЛЯ РАБОТЫ С EEPROM
/*==================================================*/
/*fram_load_byte - функция чтения байта из FRAM
	
*/
unsigned char fram_load_byte(unsigned char pbt)
{
	unsigned char flb;
	flb = 0;
	//
	
	if (CheckBus()==1)
	{
		CleanBus();
	}
   if (CheckBus()==1)
	{
		PrintLcd(" ERROR I2C         BUS BUSY !   ");
		wait(10);
		return(0x00);
	}
   //
   StartBit();
   if (WriteAddr(FRAM,W)==1)
   {
   	PrintLcd(" ERROR I2C          NO ACK !    ");
   	wait(10);
   	return(0x00);
   }
   //Пишем адрес
   WriteByte(pbt);
   StartBit();
   if (WriteAddr(FRAM,R)==1)
   {
   	PrintLcd(" ERROR I2C         error read   ");
   	wait(10);
   	return(0x00);
   }
   //
   flb = ReadByte();
   NoAck();
   StopBit();   
   return(flb);
}
/*fram_save_byte - функция записи байта в FRAM	
*/
void fram_save_byte(unsigned char fsba, unsigned char fsbb)
{
	//
	unsigned char fs;
	fs = 0;
	//
	if (CheckBus()==1)
	{
		CleanBus();
	}
   if (CheckBus()==1)
	{
		PrintLcd(" ERROR I2C         BUS BUSY !(w)");
		wait(10);
		return;
	}
   //
   StartBit();
   if (WriteAddr(FRAM,W)==1)
   {
   	PrintLcd(" ERROR I2C          NO ACK !    ");
   	wait(10);
   	return;
   }
   //
   if (WriteByte(fsba)==1)
   {
   	PrintLcd(" ERROR I2C1     error wryte byte");
   	wait(10);
   	return;
   }
   if (WriteByte(fsbb)==1)
   {
   	PrintLcd(" ERROR I2C2     error wryte byte");
   	wait(10);
   	return;
   }
   
   StopBit();
   //PrintLcd(" WRITE BYTE TO  FLASH COMPLETE..");
   BigWait(); 
   return;
}
//======================================================================
// Процедура преобразования Char в двоично-десятичный вид
unsigned char CharToBinDec(unsigned char ctb)
{
	unsigned char ctb1,ctb2,ctb3;
	ctb2 = 0;
	ctb3 = 0;
	ctb1 = ctb;
	
	if (ctb1>99) return(99);
	if (ctb1==0) return(0);
	
	
	while (ctb1!=0)
	{
		ctb1--;
		ctb2++;
		if (ctb2==10)
		{
			ctb2 = 0;
			ctb3++;
		}	
	}
   //
   ctb3 = ctb3 * 16;
   ctb2 = ctb3|ctb2;
   return(ctb2);
} 
void	PrintTemperature(Line, Pos, Value)
unsigned char Pos;
bit Line;
unsigned short Value;
{
	 unsigned short *Hv, *Lv;
	 unsigned char psmh[2], psml[2];
	 Lv = (unsigned short*)&psml[0];
	 Hv = (unsigned short*)&psmh[0];
	 *Hv = Value / 100;
	 *Lv = Value - *Hv*100;
	 psmh[1] = psmh[1];
	 psml[1] = psml[1];	 
	 PrintByte(&psmh[1], Line, Pos, 1);
	 PrintByte(&psml[1], Line, Pos+1, 2);
}

void	PrintShort(Line, Pos, Value)
unsigned char Pos;
bit Line;
unsigned short Value;
{
	 unsigned short *Hv, *Lv;
	 unsigned char psmh[2], psml[2];
	 Lv = (unsigned short*)&psml[0];
	 Hv = (unsigned short*)&psmh[0];
	 *Hv = Value / 100;
	 *Lv = Value - *Hv*100;
	 psmh[1] = psmh[1];
	 psml[1] = psml[1];	 
	 PrintByte(&psmh[1], Line, Pos, 2);
	 PrintByte(&psml[1], Line, Pos+2, 2);
}

void SetDac(unsigned short SDS)
{
   unsigned char sdm[2],sdc1;
   unsigned short *SDSpnt;
	SDSpnt = (unsigned short*)&sdm[0];	
	*SDSpnt = SDS;	
	
	CS = 0;	//Chip Select
	LD = 1;	//Autput Disable
   CLR = 1;	//Reset DAC
	CLK = 0;
	
   //Татрада старшего байта
   D = sdm[0];

	SDI = D3;
	CLK = 1;		
	CLK = 0;
	SDI = D2;	
	CLK = 1;
	CLK = 0;
	SDI = D1;	
	CLK = 1;
	CLK = 0;
	SDI = D0;	
	CLK = 1;
	CLK = 0;
   //Младший байт
   D = sdm[1];
		
	SDI = D7;	
	CLK = 1;
	CLK = 0;
	SDI = D6;	
	CLK = 1;
	CLK = 0;
	SDI = D5;	
	CLK = 1;
	CLK = 0;
	SDI = D4;	
	CLK = 1;
	CLK = 0;
	SDI = D3;	
	CLK = 1;
	CLK = 0;
	SDI = D2;	
	CLK = 1;
	CLK = 0;
	SDI = D1;	
	CLK = 1;
	CLK = 0;
	SDI = D0;	
	CLK = 1;
	CLK = 0;
   //
	LD = 0;	//Autput Enable
	for (sdc1=1; sdc1!=32; sdc1++){}

}
//*************************************************************** 
/*Функция опроса клавиш

*/
unsigned char KeyPressed()
{
	unsigned char Result;
	Result = 0;	

	if (KSET==1&KSELECT==1&KCANCEL==1) Key_Press=0;
   if (Key_Press==0)
   {
   	if (KSET == 0)
   	{
   		Result = Key_Set;
   		Key_Press=1;
   		Key_Set_Sound();
   	}
   	if (KSELECT == 0)
   	{
   		Result = Key_Select;
   		Key_Press=1;
   		Key_Select_Sound();
   	}
   	if (KCANCEL == 0)
   	{
   		Result = Key_Cancel;
   		Key_Press=1;
   		Key_Cancel_Sound();
   	}   
   }
   return(Result);

}

//*************************************************************** 

void CheckTermo(void)
{
	unsigned short cts1, cts2;
	Resistor = 4096;
	Datchik = 4096;
	for (cts1=0;cts1!=4096;cts1++)
	{
		SetDac(cts1);
		if	(TERMOK==0)
		{
			if (Datchik==4096) Datchik = cts1;
			
		}
		if	(RESIK==0)
		{
			if (Resistor==4096) Resistor = cts1;
		}
		
	}
	

}
//*************************************************************** 
/*Функция формирования стандартного диалога меню с функцией выхода по Time_out
Максимальное колличество пунктов меню - 5
Menu(K, p1, p2, p3, p4, p5)
К - Колличество используемых пунктов
pn - Названия пунктов
Выходная информация
0 - Выход
1-5 - Выбранный пункт
*/
unsigned char Menu(K, p1,p2,p3,p4,p5)
unsigned char K;
code char p1[],p2[],p3[],p4[],p5[];
{
	unsigned char Result, Position, Key;
	unsigned short Timer;
	Position = 1;
	Result = 6;
	Timer = 0;
	PrintLcd(p1);
	while (Result==6)
	{
			Key = KeyPressed();
	     if (Key==Key_Select)
	     {
	     		Timer = 0;
	     		Position++;
	     		if (Position==K+1) Position = 0;
	     		switch (Position)
		   	{
		   		case 0:	PrintLcd(Sexit);		break;
		   		case 1:	PrintLcd(p1);		break;
		   		case 2:	PrintLcd(p2);		break;
					case 3:	PrintLcd(p3);		break;
					case 4:	PrintLcd(p4);		break;
					case 5:	PrintLcd(p5);		break;
	     		}
	     }
	     if (Key==Key_Set) Result = Position;
        if (Key==Key_Cancel) Result = 0;
        if (Timer++==2000) Result = 0;
        BigWait();
	}
	return(Result);
}
//*************************************************************** 
/*Функция вычислениея немпературы из показаний термодатчика

*/
unsigned short TermoDat(unsigned short TDC)
{
	unsigned short Rezult;
	Rezult = TDC*10;
	Rezult = Rezult/(Tang)+Smesch;
   return(Rezult);
}
//***************************************************************
void Set_Min_Max(void)
{
     PrintLcd(Ssmm1);
     wait(30);
}
//***************************************************************
void Set_Sound(void)
{
	unsigned char SelMenu, Exit;
	Exit = 0;	
		SelMenu = Menu(2, Ssnd1, Ssnd2, "", "", "");
   	switch (SelMenu)
   	{
   	   case 1:	Mode_Sound = 0; break;
   	   case 2:	Mode_Sound = 1; break;
   	}
   	fram_save_byte(2, Mode_Sound);   	

}
//***************************************************************
void Ustirovka(void)
{
	unsigned short s200, s300;
   unsigned char Key;

     PrintLcd(Us1);  //OFF
     HTS = 0;
     Key = 0;
     while (Key!=Key_Set)
     {
     	    Key = KeyPressed(); 
     	    if (Key == Key_Cancel) return;
    	    
          if (Key == Key_Select)
          {
          	if (HTS==0)
          	{
          		HTS = 1;
          		PrintLcd(Us2);
          	} else
          	{
          		HTS = 0;
          		PrintLcd(Us1);          	
          	}
          
          }
     }
    if (Key == Key_Cancel) return;
     CheckTermo();
     s200 = Datchik;     
     PrintLcd(Us3);  
     PrintShort(0, 5, s200);
     wait(10);
     PrintLcd(Us4);  //OFF
     HTS = 0;
     Key = 0;
     while (Key!=Key_Set)
     {
     	    Key = KeyPressed();
     	    if (Key == Key_Cancel) return;
          if (Key == Key_Select)
          {
          	if (HTS==0)
          	{
          		HTS = 1;
          		PrintLcd(Us5);
          	} else
          	{
          		HTS = 0;
          		PrintLcd(Us4);          	
          	}
          
          }
     }
    if (Key == Key_Cancel) return;
     CheckTermo();
     s300 = Datchik;     
     PrintLcd(Us6);  
     PrintShort(0, 5, s300);
     wait(10);
     //Вычисление...
     //a = (X2-X2)/(Y2-Y1)  Tang = a*10
     Tang = (s300-s200)/10;
     //b = Y1 - 10*X1/(Tang)
     s200 =200 - 10*s200/(Tang);
     Smesch = s200;
     PrintLcd(Us7);
     PrintByte(&Tang, 0, 7, 3);
     PrintByte(&Smesch, 1, 11, 3);
     wait(100);
      
     fram_save_byte(3+(Jalo_Type-1)*2, Tang);
     fram_save_byte(4+(Jalo_Type-1)*2, Smesch);
}
//***************************************************************
void Set_Type(void)
{
	unsigned char SelMenu, Exit;
	Exit = 0;	
		SelMenu = Menu(4,Stg1, Stg2, Stg3,Stg4,"");
   	switch (SelMenu)
   	{
   	   case 1:	Jalo_Type = 1; break;
   	   case 2:	Jalo_Type = 2; break;
   	   case 3:	Jalo_Type = 3; break;
   	   case 4:	Jalo_Type = 4; break;  	
   	}
   	fram_save_byte(1, Jalo_Type);   	
   	Tang =   fram_load_byte(3+(Jalo_Type-1)*2);
      Smesch = fram_load_byte(4+(Jalo_Type-1)*2);

}
//***************************************************************
void Debug(void)
{
	unsigned char Key;
	PrintLcd(Sdw1);
	Key = 0;
     while (Key!=Key_Cancel)
     {
     		 CheckTermo();
     		 PrintShort(0, 4, Datchik);
     		 PrintShort(0, 11, Resistor);
     		 PrintByte(&Tang, 1, 3, 3);
     		 PrintByte(&Smesch, 1, 8, 3);
     		 Datchik = TermoDat(Datchik);
			 PrintTemperature(1, 14, Datchik); 

     	    Key = KeyPressed();     	    
          if (Key == Key_Select)
          {
          	if (HTS==0)
          	{
          		HTS = 1;
          	} else
          	{
          		HTS = 0;         	
          	}
          
          }
     }


}
//***************************************************************

void Mode_Set(void)
{
	unsigned char SelMenu, Exit;
	Exit = 0;	
	while (Exit==0)
	{
		SelMenu = Menu(5,Sopt1, Sopt2,Sopt3,Sopt4,Sopt5);
   	switch (SelMenu)
   	{
   		case 0:	Exit = 1;	;break;
   	   case 1:	Set_Type(); break;
   	   case 2:	Ustirovka(); break;
   	   case 3:	Set_Sound(); break;
   	   case 4:	Set_Min_Max(); break;  	
   	   case 5:	Debug();break;
   	}  
   }	 
}



//*************************************************************** 

void Mode_Active(void)
{
	unsigned char SelMenu;
	
	fram_save_byte(Addr_Mode, 0);
	SelMenu = 0;
  while(SelMenu!=1)
  {

		CheckTermo();

   	Datchik = TermoDat(Datchik);
 		//PrintShort(0, 13, Datchik); 
 		Resistor = Resistor*10;
 		Resistor = Resistor/155+140;
 	
 		if (Resistor>Datchik)
 		{
 			PrintLcd(SMAON);
 			HTS = 0;
 		} else
 		{
 			PrintLcd(SMAOFF);
 			HTS = 1;
 		}

 		PrintTemperature(0, 13, Datchik);  	
 		PrintTemperature(1, 5, Resistor); 
 		if (Datchik>400) PrintLcd(Saer);
		BigWait();
		if (KeyPressed()==Key_Select)
		{
			HTS = 1;
			SelMenu = Menu(2,SMA1, SMA2,"","","");
			if (SelMenu==2) Mode_Set();		
		}
  }
	fram_save_byte(Addr_Mode, 1);
	BigWait();	
}
//*************************************************************** 
void Mode_Stand_By(void)
{
	HTS = 1;
	fram_save_byte(Addr_Mode, 1);
   PrintLcd(Sstb);
  while(KeyPressed()==0)
  {
		CheckTermo();
   	Datchik = TermoDat(Datchik);
   	if (Datchik>400) Datchik = 0;
   	PrintLcd(Sstb);
   	if (Datchik<400) 
   	{
 			PrintTemperature(1, 13, Datchik);
 		}	  	
		BigWait();
	}		
	fram_save_byte(Addr_Mode, 0);
	BigWait();	
}

//*************************************************************** 
void main(void)
{
	BigWait();
	//Инициализация портов и переменных
	P0=15;
	P1=255;	
	P2=255;	
	P3=255;
	Key_Press = 0;
	//Инициализация переменных	
	//Надо оформить через RW FLASH  !!!!!!!!
   //--------------------------------------------------------------
	sound1();	
	// Инициализация дисплея
	LcdInit();	 
	PrintLcd(" DETECT RESET       SYSTEM !!!  "); 
	a1 = KeyPressed(); 
	if (a1==Key_Select)
	{
		PrintLcd(" SET TO             DEFAULT ... ");
		wait(10);
		fram_save_byte(Addr_Mode, 0);	
		fram_save_byte(1, 1);//jalo	
		fram_save_byte(2, 1);//sound
		//1
      fram_save_byte(3, 94);
     	fram_save_byte(4, 45);
		//2
      fram_save_byte(5, 89);
     	fram_save_byte(6, 50);
		//3
      fram_save_byte(7, 86);
     	fram_save_byte(8, 55);
		//4
      fram_save_byte(9, 94);
     	fram_save_byte(10, 45);

	}
		/*
		Карта памяти
			0 - Байт	текущего режима работы
			1 - Байт типа утановленного жала
			2 - 	Mode_Sound
	
	*/
	Jalo_Type = fram_load_byte(1);	
	//Jalo_Type = 1;
	Mode_Sound = fram_load_byte(2);
	//Mode_Sound = 1;

	Tang = fram_load_byte(3+(Jalo_Type-1)*2);		
	Smesch=fram_load_byte(4+(Jalo_Type-1)*2);
	
	wait(5);
	PrintLcd("DIGITAL STANTION STR VERSION 3.1");
	wait(5);
   while (1)
   {
   	mm = fram_load_byte(Addr_Mode);
   	switch (mm)
   	{
   		case 0:Mode_Active();break;
   	   case 1:Mode_Stand_By(); break;
   	   default:
   	   	PrintLcd("Error Mode Byte! Reset system!   ");
   	   	fram_save_byte(Addr_Mode, 0);
   	   	while(1){}
   	   	break;  	   	
   	}   
   }

 
 
 
 
 

   //--------------------------------------------------------------
 
}
 








































































































































































































































































































































