/* **----------------------------------------------------------------------------- ** ** Abstract: ** This function implements main function. ** ** Parameters: ** None ** ** Returns: ** None ** **----------------------------------------------------------------------------- */ void main( void ) { BOOL ledflash = 0; /* LED点滅の有無を保持 */ UCHAR port4; /* Start user code. Do not edit comment generated here */ while (1) { port4 = P4.0; /* スイッチの状態の取得 */ if(port4 == 0) { /* スイッチが押下されているならば */ if(ledflash == 0) { /* LED点滅中でない場合 */ P13.0 = 0; /* LEDを点灯 */ TM00_Start(); /* タイマを起動 */ ledflash = 1; /* LEDを点灯中に設定 */ } } else if(port4 == 1) { /* スイッチが押下されていないならば */ if(ledflash == 1) { /* LED点滅中の場合 */ TM00_Stop(); /* タイマを停止 */ P13.0 = 1; /* LEDを消灯 */ ledflash = 0; /* LEDを点滅なしに設定 */ } } else { /* No Operation */ } } /* End user code. Do not edit comment generated here */ }
void main( void ) { /*variables initialization + */ /*flag initial*/ flagPIRtrigg=0; flagTimeUp=0; flagPWMchanging=0; flag_ADfinish=0; flagDuringDelay=0; flag_DM=0; flagDM25=0; flagDaylight=0;//initial CDS as Night flagCDSpermitWork=1; flagDayNightSwitch=0; //(e) flagPORT4read=0; flagFirstOpenTest=1; //(c) flag8hours_former=0; flag8hours=0; flagBUGtip1=0; flagP32LOW=0; //(b) flagP32switch=0; //(a) flagINTTMH1=0; /*counter initial*/ ADpirAIM_count=0; ADsampleTimes_count=0; delayTick_count=0; dm_swAimCount=0; DM_SWcount=0; CDS_count=0; less200Count=0; more730Count=0; FirstOpenTestCount=0; delay_1s_count=0; DuringINC_count=0; DuringDEC_count=0; StopMode5sCount=0; /*statue&value initial*/ delayLevel=150;//150 gDuty=TMH1_CMP1_VALUE; St_PIR=STPIR_NONE; PORT4_STATUE=0; PORT4_STATUE_former=0; P4=0; GPCompare=1500;//150=3s CDScompareH=730; CDScompareL=200; CTRL_GND_PORT=0; /*HARDWERA initial*/ AD_ComparatorOn(); //the "comparator" should be turn on before using AD TM00_Start(); //20ms interval start TMH1_Start(); //8-bit PWM start while(1) { //semaphore while(flagTimeUp==0); WDTE = 0xAC; //wei gou flagTimeUp=0; #ifdef _8HoursHANDLE if(VAC_DETECTION_PORT==0) //dai wan shan { flagP32LOW=1; // (b) PWM_PORT=0; } while(flagP32LOW) //(b) { WDTE = 0xAC; if(flagP32switch==0) // (a) each reset or 8hours done implement once { flagP32switch=1; // (a) //reduce current consumption AD_Stop(); AD_ComparatorOff(); TM00_Stop(); CTRL_GND_PORT=1; //change PWM to low speed Interval timer for waking up from STOP mode Fn_change_and_runTMH1(); StopMode5sCount=0; } flagINTTMH1=0; STOP( ); StopMode5sCount++; //255x4us (CMP01x(1/fRL)) if((StopMode5sCount==0x1262)||(VAC_DETECTION_PORT==1)) //4706x255x4us = 5s ,4706=0x1262 { StopMode5sCount=0; flagP32LOW=0; // (b) flag8hours=1; flagP32switch=0; // (a) //turn on the hardware CTRL_GND_PORT=0; AD_ComparatorOn(); TM00_Start(); AD_Start(); //switch the Interval timer to PWM TMHE1=0; //TMH1 STOP TMH1_Init(); NOP(); NOP(); NOP(); //TMH1_Start; } } //8 hours HANDLE if(flag8hours==1) { flag8hours=0; //PWM on CMP01 = TMH1_CMP0_VALUE; CMP11 = TMH1_CMP1_VALUE; TMH1_Start(); GPCompare=6000;//600=12s FirstOpenTestCount=0; flagFirstOpenTest=1; //(c) } #endif /*FirstOpenTest 30s light*/ if(FirstOpenTestCount==GPCompare)//this segment is multi used by FirstOpenTest { //function and 8hours function //shut down PWM PWM_PORT=0; TMH1_Stop(); gDuty=1; delay_1s_count++; if(delay_1s_count==50) { FirstOpenTestCount=0; delay_1s_count=0; flagFirstOpenTest=0; //(c) //TMH1_Start(); flagBUGtip1=1; //dai gai jin } else goto OVER_BEING; } else if(flagFirstOpenTest) //(c) { FirstOpenTestCount++; if(gDuty==199) PWM_PORT=1; else { if(DuringINC_count<RISE_TIME_RATIO) //feng pin DuringINC_count++; else { gDuty+=1; DuringINC_count=0; CMP11=gDuty; } } goto OVER_BEING; } /*CDS_SW HANDLE*/ #ifdef CDS_HANDLE if(flagCDSpermitWork) { CDS_count++; CDS_value=Fn_CDSsampleOneShot(&flag_ADfinish); //PWM25 condition correct process if(flagDM25) { CDScompareH=510; CDScompareL=220; //1.0v-310 } else { CDScompareH=510; CDScompareL=270; //1.5v-465 } if(flagDaylight==0) { if(CDS_value<CDScompareL) less200Count++; } else { if(CDS_value>CDScompareH) more730Count++; } if(CDS_count==4) { if((less200Count>2)&&(flagDaylight==0)) flagDaylight=1; else if((more730Count>2)&&(flagDaylight==1)) flagDaylight=0; CDS_count=0; less200Count=0; more730Count=0; } } else { CDS_count=0; less200Count=0; more730Count=0; } #endif /*COUNTER ++ */ if(flagDuringDelay) delayTick_count++; DM_SWcount++; ADsampleTimes_count++; /*DELAY HANDLE*/ PORT4_STATUE=P4; PORT4_STATUE&=0x09; //0000 1001 P40,P43 if(PORT4_STATUE==PORT4_STATUE_former) flagPORT4read=1; //(d) else { flagPORT4read=0; //(d) PORT4_STATUE_former=PORT4_STATUE; } if(flagPORT4read) //(d) { flagPORT4read=0; //(d) if(PORT4_STATUE==0x09) delayLevel=150;//150=3s else if (PORT4_STATUE==0x08) delayLevel=500;//500=10s else if (PORT4_STATUE==0x01) delayLevel=900;//900=18s } if(((delayTick_count>=150)&&(delayLevel==150)) ||((delayTick_count>=500)&&(delayLevel==500)) ||((delayTick_count>=900)&&(delayLevel==900))) { delayTick_count=0; flagDuringDelay=0; } /*when "delayLevel" set in 3000 and "delayTick_count" reached 600 , you toggle the switch from 3000 to 500,in this situation it will be handle as "delayTick_count" reached the compare value immediately */ /*PIR HANDLE*/ if(flagFirstOpenTest==0) //(c) { if(ADsampleTimes_count==4) { flagPIRtrigg=((Fn_PIR_ADaverage(ADpirAIM_count))|(flagDuringDelay));// 0,1,1 ADpirAIM_count=0; //4 times cycle end,clear the counter ADsampleTimes_count=0; } if(Fn_ADsampleOneShot(&flag_ADfinish)) { ADpirAIM_count++; } } /*DM_SW HANDLE*/ if(P3.4==1) { dm_swAimCount++; } if(DM_SWcount==4) { flag_DM=FN_SWconfirm(dm_swAimCount); dm_swAimCount=0; DM_SWcount=0; } if(flagDaylight) { flagDayNightSwitch=1; //(e) flagPIRtrigg=0; delayTick_count=0; flagDuringDelay=0; } else if(flagDayNightSwitch) //(e) { flagDayNightSwitch=0; //(e) gDuty=1; TMH1_Start(); } if(flag_DM) { if(flagBUGtip1) { gDuty=1; TMH1_Start(); flagBUGtip1=0; } } /*flagPIRtrigg==0-----------------------------------------------------*/ if(!flagPIRtrigg) //NONE { if(St_PIR==STPIR_NONE) { if((flag_DM)&&(flagDaylight==0)) { if(gDuty==DUTY_THRESHOLD) { flagPWMchanging=0; flagCDSpermitWork=1; flagDM25=1; goto OVER_NONE; } else if(gDuty>DUTY_THRESHOLD) { PWM_PORT=0; //////////////////////////////////// if(DuringDEC_count<DM_DOWN_TIME_RATIO) //DM down time ratio DuringDEC_count++; else { gDuty -=1; DuringDEC_count=0; CMP11=gDuty; } //////////////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; flagDM25=0; } else //CDS control DM { if(gDuty==1) TMH1_Start(); //////////////////////////////////// if(DuringINC_count<DM_RISE_TIME_RATIO) //DM up time ratio DuringINC_count++; else { gDuty+=1; DuringINC_count=0; CMP11=gDuty; } //////////////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; flagDM25=0; } } else if((flag_DM==0)||(flagDaylight==1)) { if(gDuty>1) { PWM_PORT=0; ///////////////////////////// if(DuringDEC_count<DOWN_TIME_RATIO) //down time ratio DuringDEC_count++; else { gDuty -=1; DuringDEC_count=0; CMP11=gDuty; } ///////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; } else { TMH1_Stop(); flagPWMchanging=0; flagCDSpermitWork=1; gDuty=1; } flagDM25=0; } } else { PWM_PORT=0; //////////////////////////// if(DuringDEC_count<DOWN_TIME_RATIO) //down time ratio DuringDEC_count++; else { gDuty -=1; DuringDEC_count=0; CMP11=gDuty; } //////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; St_PIR=STPIR_NONE; flagDM25=0; } OVER_NONE: ; } /*flagPIRtrigg==1-----------------------------------------------------*/ else //BEING { if(St_PIR==STPIR_BEING) //i { if (gDuty ==199) { flagPWMchanging=0; flagCDSpermitWork=0; PWM_PORT=1; goto OVER_BEING; //got 100 percent } else { //100 uncompelet //if((flagDayNightSwitch==1)&&(flagDaylight==0)&&(flagPWMchanging==0)) //{ // flagDayNightSwitch=0; // gDuty=1; // TMH1_Start(); //} //if(flagBUGtip1) //{ // flagBUGtip1=0; // gDuty=1; // TMH1_Start(); //} ////////////////////////////////////////// if(DuringINC_count<RISE_TIME_RATIO) DuringINC_count++; else { gDuty+=1; DuringINC_count=0; CMP11=gDuty; } ////////////////////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; } } else //j { if((flag_DM==0)&&(flagPWMchanging==0)) { gDuty=1; TMH1_Start(); } ///////////////////////////////// if(DuringINC_count<RISE_TIME_RATIO) DuringINC_count++; else { gDuty+=1; DuringINC_count=0; CMP11=gDuty; } ////////////////////////////////// flagPWMchanging=1; flagCDSpermitWork=0; St_PIR=STPIR_BEING; delayTick_count=0; flagDuringDelay=1; } OVER_BEING: flagDM25=0; } }//End of while(1); }//End of main();