Разработка цифрового термостата на основе оценочного комплекта TasteIt!-2, страница 5

LCD_write_CGRAM(0x02,&bgpat2[0]);

__enable_interrupt();               // Запускпрерываний

LCD_cursor(0x0);

LCD_string(&text01[0]);

LCD_cursor(0x40);

LCD_string(&text02[0]);

vWait10(200);

LCD_cursor(0x0);

LCD_string(&text03[0]);

LCD_cursor(0x40);

LCD_string(&text04[0]);

vWait10(200);

LCD_cursor(0x0);

LCD_string(&text05[0]);

if(set_done!=0xa5)                 

{                                        

menu=1;

LCD_cursor(0x40);

LCD_string(&text07[0]);

}

else

{

menu=0;

LCD_cursor(0x40);

LCD_string(&text06[0]);

}

vWait10(200);

LCD_inst(0x01);                   

LED = 0xff;

//Расчёттемпературы

long Kt;

char key;

signed long A[10], B[10];          // Массив переменных описывающих аппроксимирующую прямую

A[1]=149253;    B[1]=-121641;

A[2]=140845;    B[2]=-114788;

A[3]=133333;    B[3]=-108133;

A[4]=128205;    B[4]=-103205;

A[5]=125000;    B[5]=-100000;

A[6]=120481;    B[6]=-95301;

A[7]=116279;    B[7]=-90581;

A[8]=109890;    B[8]=-82857;

A[9]=106382;    B[9]=-78297;

while(1)

{

temperature = ACP;

Kt=1689340/temperature;

Kt=Kt-1675;

if (Kt>748&Kt<815)

key=1;

if (Kt>815&Kt<866)

key=2;

if (Kt>866&Kt<961)

key=3;

if (Kt>961&Kt<1)

key=4;

if (Kt>1&Kt<1040)

key=5;

if (Kt>1040&Kt<1123)

key=6;

if (Kt>1123&Kt<1209)

key=7;

if (Kt>1209&Kt<1300)

key=8;

if (Kt>1300&Kt<1394)

key=9;

temperature=(A[key]*Kt+B[key]*1000)/100000;

Output_result( temperature_out );             // ВыводтемпературынаЖКИ

switch(menu)

{

case(1):   LCD_cursor(0x0);

LCD_string(&text03[0]);

LCD_cursor(0x40);

LCD_char(0x20);

LCD_inst(0x0c);

temperature_out=temperature;         //Условиядлязажиганиясветодиодов

if (temperature>temperature_max)

{

LED=0x000;

}

else

LED=0xFF;

break;

case(0):

LCD_cursor(0x40);

LCD_char(0x02);

if(bKey3Flag>=2)                   // Key SW3 pressed ?

{

bKey3Flag=0;

if((temperature_max>=0)&(temperature_max<700))

{

temperature_max+=50;

temperature_out=temperature_max;

}                                  

else temperature_max = 0;

}

LCD_cursor(0x0);

LCD_string(&text05[0]);

LCD_cursor(0x45);

LCD_inst(0x0d);   

break;

}

if(bKey2Flag>=2)                 

{

bKey2Flag=0;

menu++;                     

if(menu==2)

{

set_done=0xa5;

menu=0;

}

}

vWait10(30);                     

}

}

Функции, отвечающие за прерывания:

//----------------------------------------------------------------------------//  Название: vTimer0

//  Описание: Прерывание 16-битного таймера

//----------------------------------------------------------------------------#pragma vector = INTTM000_vect

__interrupt void vTimer0(void)

{

bTimer1Flag = 1;                   

}

//----------------------------------------------------------------------------//  Название: Watchtimer

//  Описание: Отвечает за прерывания службы Watchtimer

//----------------------------------------------------------------------------#pragma vector = INTWT_vect

__interrupt void Watchtimer(void)

{

bWatchTimer = !bWatchTimer ;

if(bWatchTimer)

{

while(!ADIF);

ACP = ADCR >> 6;

}

}

//----------------------------------------------------------------------------//  Название: vKey3

//  Описание: Внешние прерывания P1 (-> кнопка SW3)

//----------------------------------------------------------------------------#pragma vector = INTP1_vect

__interrupt void vKey3(void)

{

bKey3Flag++ ;

}

//----------------------------------------------------------------------------//  Название: vKey2

//  Описание: Внешние прерывания P0 (-> кнопка SW2)

//----------------------------------------------------------------------------#pragma vector = INTP0_vect

__interrupt void vKey2(void)

{

bKey2Flag++ ;

}