메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
WhiteAT2008.01.08 13:40
main() 함수에서 LED 관련함수를 계속 호출하고,
LED 관련함수에서는 일정 시간이 되면 일을 하게 하는 방법은 어떨까요?

일단 몇가지 변수를 추가하고요.
byte g_byteLEDOperMode; //  0 : LED off
                                       //  1: LED ON
                                       //  2: LED BLINK
UINT16
g_uiOperatingOutLEDTimer;
UINT16 g_uiOperatingOutLEDStatus;

메인에서
OperatingOutLED() 함수를 루프로 호출하고
main(){
    while(1) {
         OperatingOutLED();
    }
}


void OperatingOutLED(){
     // 일정시간이 되지 않았으면 리턴
     if(g_uiOperatingOutLEDTimer >0) return;

     // 일정시간이 되면 실행하겠다.
      if(2==g_byteLEDOperMode){
              // blink 모드이다.
           g_uiOperatingOutLEDTimer=1000;     // 다음에 1000이 경과된 후에 OperatingOutLED() 들어와라  
            if(0==g_uiOperatingOutLEDStatus){
                      //  LED OFF
                     
g_uiOperatingOutLEDStatus = 1;
 
             }
          }else if(1==g_uiOperatingOutLEDStatus){
                      //  LED ON
                     
g_uiOperatingOutLEDStatus = 0;
 
             }
      }

}

타이머인터럽트 에서
if(g_uiOperatingOutLEDTimer >0) g_uiOperatingOutLEDTimer--; // 감소시켜 주고.


이 방법이 처음에는 어려워 보일수 있으나 확장성이 좋고, 프로그램이해가 쉬운 방법입니다.


제가 사용한 소스를 보여드릴테니 참고하세요.^^
 void OperatingLED(){

    struct _FUNC_INFO structThisState;
    structThisState= stateOperLED;
    if(structThisState.uiTimer0) return;

    structThisState.uiTimer0=1000;

    switch(structThisState.uiState){
        case 0:    // A positive
            structThisState.uiState=1;
            OPERATING_LED = 0;

            break;
        case 1:    // B positive
            structThisState.uiState=0;
            OPERATING_LED = 1;

            break;
        default:
            structThisState.uiTimer0=1;
            structThisState.uiState=0;
            break;
        
    }
    stateOperLED = structThisState;    
}

////////////////////////////////////////////////////////////////////
        if(stateOperLED.uiTimer0)        stateOperLED.uiTimer0--;


///////////////////////////////////////////////////////////////
    while(1) { 

        #asm("WDR")
         OperatingLED();
        OperatingADC();
        
    }








사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )