📄 main_function.c
字号:
#include"pic.h"
#include"Main.h"
#include"pic.h"
const unsigned Tem_Table[100]={238,247,257,267,277,288,298,309,319,330,341,352,364,375,386,398,409,421,432,444,455,467,478,489,501,512,523,534,545,556,567,578,588,599,609,619,629,639,649,658,667,677,685,694,703,711,720,728,736,743,751,758,766,773,780,786,793,799,805,811,817,823,829,834,839,844,849,854,859,863,868,872,876,880,884,888,892,896,899,903,906,909,912,915,918,921,924,927,929,932,934,937,939,941,943,945,947,949,951,953};
struct _Key_Inf_ Key_Inf;
bank1 extern unsigned char Time_data[10];
bank1 extern unsigned char Temp_data[11];
bank1 extern unsigned char Display_data[24];
extern unsigned char Mode;
extern union _Task Task;
unsigned Timer1,Timer2,Timer3,Timer4;
unsigned Timer1_Mirro;
unsigned Timer2_Mirro;unsigned char Timer2_PreScale_Counter;
unsigned Timer3_Mirro,Timer3_PreScale_Counter;
unsigned Timer4_Mirro;unsigned char Timer4_PreScale_Counter;
extern unsigned char Beep,Flash_Flag,Flash,Flash_turn,Flash_Counter;
unsigned char Beep_Counter;
unsigned char Setting_Obj;
unsigned char Setting_Point;
unsigned AD1_SettingValue,AD1_Value;
unsigned AD0_SettingValue,AD0_Value;
bit Pump_Enable,AD0_Enable,AD1_Enable,AD0_Status,AD1_Status;
volatile static unsigned int Mirro[5]@ 0x46;
static volatile unsigned char AD0 @ 0x4e;
static volatile unsigned char AD1 @ 0x4f;
extern unsigned char Timer2_Pross_Counter,Timer2_Pross;
unsigned Pow(unsigned char a,unsigned char b)
{
unsigned tmp=1;
for(;b>0;b--)
{
tmp=tmp*a;
}
return tmp;
}
void Data_INT(void)
{
Timer1=eeprom_read(0)*256+eeprom_read(1);
// Timer1H=eeprom_read(0);
// Timer1L=eeprom_read(1);
if(Timer1>9999){Timer1=9999;}
Timer1_Mirro=Timer1;
Split(Timer1,0,1,2,3);
Display_data[3]++;
Timer2=eeprom_read(2)*256+eeprom_read(3);
// Timer2H=eeprom_read(2);
// Timer2L=eeprom_read(3);
if(Timer2>9999){Timer2=9999;}
Timer2_Mirro=Timer2;
Split(Timer2,4,5,6,7);
Timer3=eeprom_read(4)*256+eeprom_read(5);
// Timer3H=eeprom_read(4);
// Timer3L=eeprom_read(5);
if(Timer3>999){Timer3=999;}
Timer3_Mirro=Timer3;
Split(Timer3,15,16,17,18);
Timer4=eeprom_read(6)*256+eeprom_read(7);
// Timer4H=eeprom_read(6);
// Timer4L=eeprom_read(7);
if(Timer4>9999){Timer4=9999;}
Timer4_Mirro=Timer4;
Split(Timer4,19,20,21,22);
AD0_SettingValue=eeprom_read(8);
if(AD0_SettingValue>99){AD0_SettingValue=99;}
AD0_Value=AD0_SettingValue;
AD1_SettingValue=eeprom_read(9);
if(AD1_SettingValue>99){AD1_SettingValue=99;}
AD1_Value=AD1_SettingValue;
}
void CPU_INT(void)
{
INTCON=0x00;
TRISC=0x00;
PORTC=0b11001111;
PORTA=0xFF;
AD_INT();
T0_INT();
T1_INT();
GIE=1;
}
void AD_INT(void)
{ unsigned char i;
TRISA=0b00001111;
ADCON0=0b10000001;
ADCON1=0b10001101;
for(i=0;i<0xf;i++);
ADCON0=0b10000101;
}
void T0_INT(void)
{
OPTION=OPTION&0b11000000;
OPTION=OPTION|0b00000010;
T0IF=0;
T0IE=1;
TMR0=0x81;//TMR0定时1ms
}
void T1_INT(void)
{
T1CON=0b0110001;
TMR1IF=0;
TMR1IE=1;
PEIE=1;
}
void Key_Scan(void)
{
unsigned char i,temp;
TRISB=0b11110000;
temp=0b00000010;
PORTB=PORTB&0b00000001;
PORTB=PORTB|temp;
if(Key_Inf.KeyCode==Null)
{
for(i=0;i<3;i++)
{
if(Hang1==1)
{
Key_Inf.KeyCode=i+1;
Key_Inf.Hang=0b00010000;
}
else if(Hang2==1)
{
Key_Inf.KeyCode=i+4;
Key_Inf.Hang=0b00100000;
}
else if(Hang3==1)
{
Key_Inf.KeyCode=i+7;
Key_Inf.Hang=0b01000000;
}
else if(Hang4==1)
{
Key_Inf.KeyCode=i+10;
Key_Inf.Hang=0b10000000;
}
if(PORTB&0b11110000)
{
Key_Inf.Status=Pre_Press;
Beep_Counter=2;
Key_Inf.Delay_Counter.Value=0;
Key_Inf.Lie=PORTB&0b00001111;
i=2;
}
temp=temp<<1;
PORTB=PORTB&0b00000001;
PORTB=PORTB|temp;
}
}
else
{
PORTB=Key_Inf.Lie;
if(PORTB&Key_Inf.Hang)
{
if(Key_Inf.Status==Pre_Press)
{
if(Key_Inf.Delay_Counter.Value<20)
{
Key_Inf.Delay_Counter.Value++;
}
else
{
Key_Inf.Delay_Counter.Value=0;
Key_Inf.Status=Press_Down;
Key_Inf.Response=1;
}
}
else if(Key_Inf.Status==Press_Down)
{
if(Key_Inf.Delay_Counter.Value<255)
{
Key_Inf.Delay_Counter.Value++;
}
else
{
Key_Inf.Delay_Counter.Value=0;
Key_Inf.Status=Press_Hold;
}
}
}
else
{
Key_Inf.KeyCode=Null;
Key_Inf.Status=Null;
}
}
}
void Split(unsigned Value,unsigned char addr0, unsigned char addr1,unsigned char addr2,unsigned char addr3)
{ unsigned char temp1,temp2,temp3;
temp1=(unsigned char)(Value/1000);
Display_data[addr0]=Time_data[temp1];
temp2=(unsigned char)((Value-temp1*1000)/100);
Display_data[addr1]=Time_data[temp2];
temp3=(unsigned char)((Value-temp1*1000-temp2*100)/10);
Display_data[addr2]=Time_data[temp3]+(Display_data[addr2]&0b00000001);
Display_data[addr3]=Time_data[(Value-temp1*1000-temp2*100-temp3*10)];
}
void Split_AD(unsigned Value,unsigned char addr0, unsigned char addr1,unsigned char addr2)
{
Display_data[addr0]=Temp_data[Value/10];
Display_data[addr1]=Temp_data[Value%10];
Display_data[addr2]=0x9d;
}
void Off_Mode(void)
{
if((Key_Inf.Status==Press_Down)&&(Key_Inf.Response==1))
{
Key_Inf.Response=0;
switch(Key_Inf.KeyCode)
{
case 11:
Mode=Working;
Data_INT();
break;
}
}
}
unsigned char Find_Tempr(unsigned AD_Value)
{
unsigned char i;
unsigned char Interval_Bottom=0,Interval_Top=99;
if(AD_Value<=Tem_Table[0]) return 0;
if(AD_Value>=Tem_Table[99]) return 99;
for(i=0;i<99;i++)
{
if((Interval_Top-Interval_Bottom)>1)
{
if(Tem_Table[(Interval_Top+Interval_Bottom)/2]>AD_Value)
{
Interval_Top=(Interval_Top+Interval_Bottom)/2;
}
else if(Tem_Table[(Interval_Top+Interval_Bottom)/2]<AD_Value)
{
Interval_Bottom=(Interval_Top+Interval_Bottom)/2;
}
else
{
return (Interval_Top+Interval_Bottom)/2;
}
}
else
{
return Interval_Top;
}
}
return 0;
}
void Work_Mode(void)
{unsigned temp;
if((Key_Inf.Status==Press_Down)&&(Key_Inf.Response==1))
{
Key_Inf.Response=0;
switch(Key_Inf.KeyCode)
{
case 8:
Mode=Setting;
break;
case 12:
if(Pump_Enable)
{
Pump_Enable=0;
Display_data[14]=Display_data[14]&(~0x02);
Pump_Control=1;
}
else
{
Pump_Enable=1;
Display_data[14]=Display_data[14]|(0x02);
Pump_Control=0;
}
break;
case 10:
if(Task.Flag.timer1_Enlable)
{
Task.Flag.timer1_Enlable=0;
Display_data[14]=Display_data[14]&0x7f;
Timer1_Control=1;
}
else
{
Task.Flag.timer1_Enlable=1;
Display_data[14]=Display_data[14]|0x80;
Timer1_Control=0;
}
Timer1=eeprom_read(0)*256+eeprom_read(1);
// Timer1H=eeprom_read(0);
// Timer1L=eeprom_read(1);
if(Timer1>9999){Timer1=9999;}
Split(Timer1,0,1,2,3);
Display_data[3]++;
break;
case 5:
if(Task.Flag.timer2_Enlable)
{
Task.Flag.timer2_Enlable=0;
Display_data[14]=Display_data[14]&(~0x40);
}
else
{
Task.Flag.timer2_Enlable=1;
Display_data[14]=Display_data[14]|0x40;
Timer2_Pross_Counter=0;
Timer2_Pross=0;
}
Timer2=eeprom_read(2)*256+eeprom_read(3);
// Timer2H=eeprom_read(2);
// Timer2L=eeprom_read(3);
if(Timer2>9999){Timer2=9999;}
Timer2_PreScale_Counter=0;
Split(Timer2,4,5,6,7);
break;
case 2:
if(Task.Flag.timer3_Enlable)
{
Task.Flag.timer3_Enlable=0;
//载入初始值
Display_data[14]=Display_data[14]&(~0x08);
AD1_Enable=0;
}
else
{
Task.Flag.timer3_Enlable=1;
//载入初始值
Display_data[14]=Display_data[14]|0x08;
}
Timer3=eeprom_read(4)*256+eeprom_read(5);
// Timer3H=eeprom_read(4);
// Timer3L=eeprom_read(5);
if(Timer3>999){Timer3=999;}
Timer3_PreScale_Counter=0;
Split(Timer3,15,16,17,18);
break;
case 1:
if(Task.Flag.timer4_Enlable)
{
Task.Flag.timer4_Enlable=0;
//载入初始值
Display_data[14]=Display_data[14]&(~0x04);
Timer4_Control=1;
}
else
{
Task.Flag.timer4_Enlable=1;
//载入初始值
Display_data[14]=Display_data[14]|0x04;
Timer4_Control=0;
}
Timer4=eeprom_read(6)*256+eeprom_read(7);
// Timer4H=eeprom_read(6);
// Timer4L=eeprom_read(7);
if(Timer4>9999){Timer4=9999;}
Timer4_PreScale_Counter=0;
Split(Timer4,19,20,21,22);
break;
case 4:
if(AD0_Enable)
{
AD0_Enable=0;
//载入初始值
Display_data[14]=Display_data[14]&(~0x20);
}
else
{
AD0_Enable=1;
//载入初始值
Display_data[14]=Display_data[14]|0x20;
}
break;
case 3:
if(AD1_Enable)
{
AD1_Enable=0;
//载入初始值
Display_data[14]=Display_data[14]&(~0x10);
}
else
{
AD1_Enable=1;
//载入初始值
Display_data[14]=Display_data[14]|0x10;
}
break;
}
}
if(Task.Flag.timer1_Enlable==1)
{
//输出外部控制信号
if(Timer1>9999)
{
Task.Flag.timer1_Enlable=0;
Display_data[14]=Display_data[14]&(~0x80);
Timer1_Control=1;
Timer1=eeprom_read(0)*256+eeprom_read(1);
if(Timer1>9999){Timer1=9999;}
Beep_Counter=10;
}
Split(Timer1,0,1,2,3);
Display_data[3]++;
}
if(Task.Flag.timer2_Enlable==1)
{
//输出外部控制信号
if(Timer2>9999)
{
Task.Flag.timer2_Enlable=0;
Display_data[14]=Display_data[14]&(~0x40);
// Timer2_Control=0;
Timer2=eeprom_read(2)*256+eeprom_read(3);
// Timer2H=eeprom_read(2);
// Timer2L=eeprom_read(3);
if(Timer2>9999){Timer2=9999;}
Beep_Counter=20;
}
Split(Timer2,4,5,6,7);
}
if(Task.Flag.timer3_Enlable==1)
{
if(Timer3<1)
{
Task.Flag.timer3_Enlable=0;
Display_data[14]=Display_data[14]&(~0x08);
AD1_Enable=0;Display_data[14]=Display_data[14]&(~0x10);
Timer3=eeprom_read(4)*256+eeprom_read(5);
if(Timer3>999){Timer3=999;}
Beep_Counter=20;
}
Split(Timer3,15,16,17,18);
}
if(Task.Flag.timer4_Enlable==1)
{
if(Timer4>9999)
{
Task.Flag.timer4_Enlable=0;
Display_data[14]=Display_data[14]&(~0x04);
Timer4_Control=1;
Timer4=eeprom_read(6)*256+eeprom_read(7);
if(Timer4>9999){Timer4=9999;}
Beep_Counter=20;
}
//输出外部控制信号
Split(Timer4,19,20,21,22);
}
//显示实时温度**********************************************
temp=Find_Tempr(AD0_Value);
if(AD0_Enable)
{
if(AD0_Status==1)
{
if(temp>=AD0_SettingValue)
{
AD0_Status=0;
AD0_Control=1;
}
}
else
{
if(temp<AD0_SettingValue-2)
{
AD0_Status=1;
AD0_Control=0;
}
}
}
else
{
AD0_Status=0;
AD0_Control=1;
}
Split_AD(temp,8,9,10);
temp=Find_Tempr(AD1_Value);
if(AD1_Enable)
{
if(AD1_Status==1)
{
if(temp>=AD1_SettingValue){AD1_Status=0;AD1_Control=1;}
}
else
{
if(temp<AD1_SettingValue-2){AD1_Status=1;AD1_Control=0;}
}
RC3=0;//开启第6路
}
else
{AD1_Status=0;AD1_Control=1;RC3=1;}
Split_AD(temp,11,12,13);
if(Mode==Setting)
{
temp=eeprom_read(0)*256+eeprom_read(1);
if(temp>9999){temp=9999;}
Split(temp,0,1,2,3);
Display_data[3]++;
temp=eeprom_read(2)*256+eeprom_read(3);
if(temp>9999){temp=9999;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -