⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_function.c

📁 一个数码管与NTC的应用实例
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -