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

📄 power.c

📁 一款新开发的
💻 C
字号:
//2006-7-3
#include "pic.h"
#include "power.h"
#define	MODE_TIME
//#define MODE_AVERAGE
//#define MODE_UNAVERAGE
__EEPROM_DATA(0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00);
__CONFIG(PROTECT&PWRTEN&WDTEN&INTIO&LVPDIS&MCLREN&BOREN);

//#define  	DEBUG

ERom Save;
unsigned int  UserOn=0;
unsigned char SwitchUser;
enum SwitchState {CLOSE_LAMP,WAIT_CLOSE,NEXT_LAMP_ON,DELAY,ACCOUNT};
enum SwitchState State=CLOSE_LAMP;
//unsigned char Count4ms;
unsigned char EleEnergy;
unsigned char RestTimes;
unsigned char SwitchCount=0;
//volatile unsigned char DelayTimeCount;
TimerStruct DelaySwitch={0,0,0};
TimerStruct DelayReadWork={0,0,0};
unsigned long Hour_1_Time=TIMEBEGIN;

unsigned char Count1000ms=250;
/*
unsigned char  fWorkMode;
unsigned char  fTimeOut12ms;
unsigned char  fChangeSwitch;
unsigned char  fUnKnown;
unsigned char  fSaveEnergy;
unsigned char  fBeginDelay;
unsigned char  fDELAY_TimeOut=0;
*/

bit SystemWdt;
bit  fWorkMode;
bit  fTimeOut12ms;
bit  fChangeSwitch;
bit  fUnKnown;
bit  fSaveEnergy;
//bit  fBeginDelay;
//bit  fDELAY_TimeOut=0;

//bit fBegin2000ms=0;
bit fDelay2000ms=0;
//unsigned int Time2000ms;

void short_delay(unsigned char DelayTime)
{
	for(;DelayTime!=0;DelayTime--){}
}

void init_io(void)
{	
	CMCON=0x07;
	TRISA=0x30;
	TRISB=0x01;
}

void write_eeprom(unsigned char addr, unsigned char value)
{
	//do
	//{
		eeprom_write(addr, value);
		//while(WR){;}
	//}
	//while(eeprom_read(addr)!=value);
}

void init_time(void)
{
	//time0 for 4ms 
	T0CS=0;  //time mode
	PSA=0;    //don't use for wdt
	T0IE=1;   //time interrupt enable
	PS2=0;
	PS1=1;
	PS0=1;
}

void init_int(void)
{
	#ifndef	MODE_TIME
	INTEDG=0;
	INTE=1;
	#endif
}

char read_mode(void)
{
	unsigned char SystemTimes;
	char returnValue=1;
	//read eeprom 
	unsigned char eepromValue;
	do
	{
		eepromValue=eeprom_read(ADDR_USERS);
		short_delay(119);
	}while(eepromValue!=eeprom_read(ADDR_USERS));
	Save.Users=eepromValue;
	
	do
	{
		eepromValue=eeprom_read(ADDR_RESTTIMES);
		short_delay(119);
	}while(eepromValue!=eeprom_read(ADDR_RESTTIMES));
	Save.RestTimes=eepromValue;

	#ifdef DEBUG
	do
	{
		eepromValue=eeprom_read(ADDR_MY);
	}while(eepromValue!=eeprom_read(ADDR_MY));
	SystemTimes=eepromValue;
	
		if(SystemTimes>=119){return(0);}
	SystemTimes++;
	write_eeprom(ADDR_MY,SystemTimes);
	#endif

	if(Save.Users>=MAX_USERS)
		Save.Users=0;	
	if(Save.RestTimes>=A_DAY)
		Save.RestTimes=A_DAY;	
	fWorkMode=MODE_IN;
	//Count4ms=3;
	//fTimeOut12ms=0;
	return(returnValue);
}

void mode_deal(void)
{
	if(Save.RestTimes==0){fChangeSwitch=1;}
}

void close_all_lamp(void)
{
	OUT1=OFF;
	short_delay(5);
	OUT2=OFF;
	short_delay(5);
	OUT3=OFF;
	short_delay(5);
	OUT4=OFF;
	short_delay(5);
	OUT5=OFF;
	short_delay(5);
	OUT6=OFF;
	short_delay(5);
	OUT7=OFF;
	short_delay(5);
	OUT8=OFF;
	short_delay(5);
	OUT9=OFF;
	short_delay(5);
	OUT10=OFF;
	short_delay(5);
	OUT11=OFF;
	short_delay(5);
	OUT12=OFF;
}

void lamp_on(unsigned char LampNoub)
{
	switch(LampNoub)
	{
		case 0:OUT1=ON;break;
		case 1:OUT2=ON;break;
		case 2:OUT3=ON;break;
		case 3:OUT4=ON;break;
		case 4:OUT5=ON;break;
		case 5:OUT6=ON;break;
		case 6:OUT7=ON;break;
		case 7:OUT8=ON;break;
		case 8:OUT9=ON;break;
		case 9:OUT10=ON;break;
		case 10:OUT11=ON;break;
		case 11:OUT12=ON;break;
		default:break;
	}
}

void quit_switch(unsigned char Rest,unsigned char User)
{
	di();
	fChangeSwitch=0;
	fSaveEnergy=1;
	State=CLOSE_LAMP;
	Save.RestTimes=Rest;
	Save.Users=User;
	#ifndef MODE_TIME
	INTF=0;
	INTE=1;
	#endif
	ei();
}

void account_user(unsigned CurrentUser)
{
	/*
	unsigned char i,j,k;
	unsigned char temp=0;
	unsigned int  DataUserOn;
	unsigned char DataCount=0,Sum=0;
	
	for(i=CurrentUser;i<OUTALLCHANNELS;i++)
	{
		temp=0;
		bitset(temp,CurrentUser-1);
		if(UserOn&temp)
		{
			Save.Users=CurrentUser;
			for(j=0;j<i;j++)
			{
				DataUserOn=UserOn>>j;
				for(k=0;k<OUTALLCHANNELS;k++)
				{
					//DataUserOn=UserOn;
					if(DataUserOn&0x0001){DataCount++;}
					DataUserOn>>=1;
				}
				Sum+=ALL_TIME/DataCount;
			}
			Save.RestTimes=Sum;
			break;
		}
		else
		{
			if(CurrentUser++==OUTALLCHANNELS){CurrentUser=1;}
		}
	}
	*/
}

void switch_deal(void)
{ 
	unsigned char NextUser;
	static bit SignalOn;
	switch(State)
	{
		case CLOSE_LAMP:
			close_all_lamp();
			State=WAIT_CLOSE;
			break;
		case WAIT_CLOSE:
			if(SIGNALIN)
			{
				short_delay(250);
				if(SIGNALIN)
				{
					State=NEXT_LAMP_ON;
				}				
			}
			break;
		case NEXT_LAMP_ON:
			NextUser=SwitchUser+1;
			if(NextUser>=MAX_USERS){NextUser=0;}
				lamp_on(NextUser);
			di();
			DelaySwitch.TimeOut=0;
			DelaySwitch.en=1;
			ei();
			/*
			DelayTimeCount=TIME500ms;
			fDELAY_TimeOut=0;
			fBeginDelay=1;
			*/
			State=DELAY;
			break;
		case DELAY:
		
			//if(fDELAY_TimeOut)
			//{
				//fDELAY_TimeOut=0;
				//fBeginDelay=0;
				//State=ACCOUNT;
			//}
			if(DelaySwitch.TimeOut)
			{
				DelaySwitch.TimeOut=0;
				State=ACCOUNT;
			}
			break;
		case ACCOUNT:
			if(SIGNALIN)
			{	
				unsigned char i;
				for (i=0;i<10;i++) short_delay(250);
				if(SIGNALIN)
				{
					SignalOn=0;
					bitclr(UserOn,NextUser);
				}
				else return;
			}
			else
			{
				unsigned char i;
				for(i=0;i<10;i++) short_delay(250);
				if(!SIGNALIN)
				{
					SignalOn=1;
					bitset(UserOn,NextUser);
				}
			}
			SwitchCount++;
			if(++SwitchUser>=MAX_USERS){SwitchUser=0;}
   		    #ifdef MODE_AVERAGE 
   				if(SignalOn==1)
				{
					quit_switch(AVERAGE_REST_TIME,NextUser);
				}
				else{State=CLOSE_LAMP;}
			#endif 
			/*
			#ifdef MODE_UNAVERAGE 
				if((SwitchCount>=OUTALLCHANNELS)&&UserOn)
				{
					account_user(Save.Users+1);
					quit_switch(Save.RestTimes,Save.Users);
				}
				else{State=CLOSE_LAMP;}
			#endif
			*/
			#ifdef MODE_TIME
				if(SignalOn==1)
				{
					quit_switch(A_DAY,NextUser);
				}
				else{State=CLOSE_LAMP;}
			#endif
			break;
		default:State=CLOSE_LAMP;break;
	}	
}

void read_work(void)
{
	static unsigned char Step=0;
	if(SIGNALIN)
	{
		switch(Step)
		{
			case 0:
				DelayReadWork.Interval=0;
				DelayReadWork.en=1;
				DelayReadWork.TimeOut=0;
				Step=1;
				break;
			case 1:
				if(DelayReadWork.TimeOut)
				{
					DelayReadWork.TimeOut=0;
					if(SIGNALIN)
					{
						fChangeSwitch=1;
						SwitchUser=Save.Users;
						SwitchCount=0;
						INTE=0;
					}
					Step=0;
				}
				break;
			default:Step=1;break;
		}
		
		/*
		if(DelayReadWork.en)
		{
			if(DelayReadWork.TimeOut)
			{
				DelayReadWork.TimeOut=0;
				if(!SIGNALIN)
				{
					fChangeSwitch=1;
					SwitchUser=Save.Users;
					SwitchCount=0;
					INTE=0;
				}
			}
		}
		else 
		{
			DelayReadWork.en=1;
			DelayReadWork.TimeOut=0;
		}
		*/		
	}
	else Step=0;
}

char Save2Eeprom(ERom SaveData)
{
	write_eeprom(ADDR_USERS,Save.Users);
	CLRWDT();
	write_eeprom(ADDR_RESTTIMES,Save.RestTimes);
	return(1);
}

void unknown_deal(void)
{
}

void main(void)
{
	init_io();
	init_time();
	init_int();
	ei();
	close_all_lamp();
	read_mode();

	lamp_on(Save.Users);
	while(1)
	{
		if(SystemWdt) 
		{
			SystemWdt=0;
			CLRWDT();
		}
		T0IE=1;   //time interrupt enable
		ei();
		if(fChangeSwitch)
		{
			//fChangeSwitch = 0;      		//del
			//quit_switch(A_DAY,1); 		//del
			di();
			//fBegin2000ms=0;
			//Time2000ms=0;
			DelayReadWork.en=0;
			DelayReadWork.Interval=0;
			ei();
			
			switch_deal();
		}
		else
		{
			if(fSaveEnergy)
			{	
				if(Save.RestTimes>A_DAY) 
					Save.RestTimes=A_DAY;		
				fSaveEnergy=0;
				Save2Eeprom(Save);
			}
			read_work();
			if(fUnKnown)
			{
				fUnKnown=0;
				unknown_deal();
			}
		}
		if(Save.RestTimes>A_DAY) 
			Save.RestTimes=A_DAY;
		//RA1=SIGNALIN;
		//
	}

}

void interrupt Int(void)
{
	if(T0IE&&T0IF)
	{
		T0IF=0;	
		//if(!--Count4ms)
		//{
			//fTimeOut12ms=1;
			//Count4ms=3;
		//}
		//if(fBeginDelay)
		//{
			//if(!--DelayTimeCount){fDELAY_TimeOut=1;}
		//}
		SystemWdt=1;
		if(DelaySwitch.en)
		{
			if(DelaySwitch.Interval++>=TIME500ms)
			{
				DelaySwitch.en=0;
				DelaySwitch.Interval=0;
				DelaySwitch.TimeOut=1;
			}
		}
		//if(fBegin2000ms)
		//{
			//if(Time2000ms++>=TIME2000MS)
			//{
				//Time2000ms=0;
				//fDelay2000ms=1;
			//}
		//}
		if(DelayReadWork.en)
		{
			if(DelayReadWork.Interval++>=TIME2000MS)
			{
				DelayReadWork.Interval=0;
				DelayReadWork.en=0;
				DelayReadWork.TimeOut=1;
			}
		}
		if(!--Count1000ms)
		{
			RA1=!RA1;
			Count1000ms=250;
		}
		#ifdef MODE_TIME
			if(Hour_1_Time>TIMEBEGIN) 
				Hour_1_Time=TIMEBEGIN;
			if(--Hour_1_Time==0)
			{
				Hour_1_Time=TIMEBEGIN;
				//Save.RestTimes--;
				fSaveEnergy=1;
				if(--Save.RestTimes==0)
				{
					fChangeSwitch=1;
					SwitchUser=Save.Users;
				}
			}
		#endif
	}
	
	
	if(INTF&&INTE)
	{
		INTF=0;
		#ifndef MODE_TIME
		if(EleEnergy++>=32)
		{
			EleEnergy=0;
			for(j=100;j!=0;j--){}
			if(!POWIN)
			{
				RA1=!RA1;
				fSaveEnergy=1;
				if(!--Save.RestTimes)
				{
					fChangeSwitch=1;
					SwitchCount=0;
					SwitchUser=Save.Users;
					INTE=0;
				}
			}
		}
		#endif
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -