학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

타이머 동작

학습목표

타이머를 동작 시키는 방법과 활용 능력을 키운다

학습주제

타이머를 동작시켜 이에 따라 LED 동작하게 만든다

예습내용

다음 함수의 내용을 알아 본다.

SetTimer(1,300,NULL);

KillTimer(1);

실습방법

   

[예제1 프로그램]

1.       Project Name 주고 1주와 동일한 방법으로 프로젝트를 만든다. 여기서는 프로젝트 이름을 Timer 한다.

 이후 나머지는 기본값을 선택한다.

 

2.       아래 그림과 같이 4개의 LED 만들고 스위치를 만든다.

단추의 마우스 오른쪽 키를 누르고 Properties 확인하면 다음과 같이 되어 있다.

Caption

ID

LED1

IDC_CWBOOLEAN1

LED2

IDC_CWBOOLEAN2

LED3

IDC_CWBOOLEAN3

LED4

IDC_CWBOOLEAN4

스위치

IDC_CWBOOLEAN5

 

3. 다음   이용하여 아래와 m_led1 ~ m_led4 스위치를 정의 한다.

처음

1.       스위치를 On, Off 하면 LED 동작하게 한다. 스위치 버튼에 마우스 오른쪽을 두번 크릭하여 OnValueChangedCwboolean5 함수를 만든다.

스위치 상태가 변하면 다음 함수가 실행괴고 On되면 타이머를 동작 시키고 Off되면 타이머를 정지 시킨다. 타이머 ID 1이고 300mSec 마다 동작한다.

 

void CTimerDlg::OnValueChangedCwboolean5(BOOL Value)

{

              // TODO: Add your control notification handler code here

              if(m_switch.Value == 1)

                             SetTimer(1,300,NULL);

              else

                             KillTimer(1);

}

 

메뉴 View->ClassWizard에서 아래그림의 WM_TIMER 마우스를 위치하고 왼쪽 버튼을 두번 크릭하여 OnTimer 함수를 만든다.

처음

화면 왼쪽의 ClassView에서 CtimerDlg 마우스를 위치하고 오른쪽 버튼을 눌러 AddMember Vrable…

그림과 같이iTime 선언한다. 타이머가 동작할 때마다. ITime 0 1 반복하여 변하게 하여 값에 따라 LED1 On, Off 되게 한다.

처음

OnInitDialog 함수에 iTime 초기치를 0으로 한다.

 

BOOL CTimerDlg::OnInitDialog()

{

              CDialog::OnInitDialog();

 

              // Add "About..." menu item to system menu.

 

              // IDM_ABOUTBOX must be in the system command range.

              ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

              ASSERT(IDM_ABOUTBOX < 0xF000);

 

              CMenu* pSysMenu = GetSystemMenu(FALSE);

              if (pSysMenu != NULL)

              {

                             CString strAboutMenu;

                             strAboutMenu.LoadString(IDS_ABOUTBOX);

                             if (!strAboutMenu.IsEmpty())

                             {

                                           pSysMenu->AppendMenu(MF_SEPARATOR);

                                           pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                             }

              }

 

              // Set the icon for this dialog.  The framework does this automatically

              //  when the application's main window is not a dialog

              SetIcon(m_hIcon, TRUE);                                   // Set big icon

              SetIcon(m_hIcon, FALSE);                   // Set small icon

             

              // TODO: Add extra initialization here

              iTime = 0;

              return TRUE;  // return TRUE  unless you set the focus to a control

}

 

OnTimer 함수에서 iTime 따라 led1 동작하게 한다.

 

void CTimerDlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              iTime++;

              if(iTime >= 2)

                             iTime = 0;

 

              m_led1.Value=0;

              m_led2.Value=0;

 

              if(iTime==0)

                             m_led1.Value=1;

              else if(iTime==1)

                             m_led2.Value=1;

 

CDialog::OnTimer(nIDEvent);

}

 

처음

AVR 통신 프로그램

[예제2 프로그램]

C언어 첫페이지의 RS232 기본 프로그램을 내려받아 위의 스위치와 Led 추가한다.

[PC통신프로그램 내려받기]

“OnTimer” 함수에 통신에 필요한 문자를 보내는 함수를 추가 한다.

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              unsigned char buff[5]="";

 

              iTime++;

              if(iTime >= 2)

                             iTime = 0;

 

              m_led1.Value=0;

              m_led2.Value=0;

 

              if(iTime==0) {

                             m_led1.Value=1;

                             buff[0]=0x01;

                             m_ComuPort.WriteComm((unsigned char*)buff,1);

              }

              else if(iTime==1) {

                             m_led2.Value=1;

                             buff[0]=0x02;

                             m_ComuPort.WriteComm((unsigned char*)buff,1);

              }

 

              CDialog::OnTimer(nIDEvent);

}

 

 

   

1.       타이머가 On 되면 LED 4개가 차례대로 On, Off 되게 프로그램을 만드시오.

2.       다음은 8*8 LED 이다. 프로그램을 내려 받고 자기 이름으로 고쳐 쓰시오.

3.       아래는 [동작모드] 스위치를 추가한 그림이다. [모드0]-동작 정지, [모드1]-4개가 개씩 차례로 동작, [모드2]-4개가 동시에 점등하도록 프로그램하시오.

      그림과 같이 동자모드 노브를 추가한다.

      노브의 Values “Discrete” 바꾼다.

      View->ClassWizard 에서 노브의 Member “m_mode” 선언한다.

      “OnTimer” 함수를 아래와 같이 수정한다.

 

void CTimerDlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              iTime++;

              m_led1.Value=0;

              m_led2.Value=0;

              m_led3.Value=0;

              m_led4.Value=0;

             

              if(m_mode.Value==1) {

                             if(iTime >= 4)

                                           iTime = 0;

 

                             if(iTime==0)

                                           m_led1.Value=1;

                             else if(iTime==1)

                                           m_led2.Value=1;

                             else if(iTime==2)

                                           m_led3.Value=1;

                             else if(iTime==3)

                                           m_led4.Value=1;

              }

              else if(m_mode.Value==2) {

                             if(iTime >= 2)

                                           iTime = 0;

 

                             if(iTime==0) {

                                           m_led1.Value=0;

                                           m_led2.Value=0;

                                           m_led3.Value=0;

                                           m_led4.Value=0;

                             }

                             else {

                                           m_led1.Value=1;

                                           m_led2.Value=1;

                                           m_led3.Value=1;

                                           m_led4.Value=1;

                             }

                                          

              }

             

              CDialog::OnTimer(nIDEvent);

}

 

4.       타이머의 시간을 노브로 변화 시킨다.

타이머를 위한 노브를 추가하고 [Scale] “1000”으로 [Value] “Discrete” 한다.

View->ClassWizard 에서 타이머의 Member “m_timer” 선언한다.

타이머 노브를 더블클릭하여 “OnPointerValueChangedCwknob2” 함수를 아래와 같이 입력하여 노브의 값을 타이머의 값을 변화 시킨다.

 

void CTimerDlg::OnPointerValueChangedCwknob2(long Pointer, VARIANT FAR* Value)

{

              // TODO: Add your control notification handler code here

              SetTimer(1,(int)m_timer.Value,NULL);

}

 

 

AVR 통신 프로그램

과제4 프로그램을 AVR 보드와 연결하여 동작시켜 본다.

[전체프로그램 내려받기]  [셋업프로그램 내려받기]

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              unsigned char buff[5]="";

 

              iTime++;

              m_led1.Value=0;

              m_led2.Value=0;

              m_led3.Value=0;

              m_led4.Value=0;

             

              if(m_mode.Value==1) {

                             if(iTime >= 4)

                                           iTime = 0;

 

                             if(iTime==0){

                                           m_led1.Value=1;

                                           buff[0]=0x01;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

                             else if(iTime==1){

                                           m_led2.Value=1;

                                           buff[0]=0x02;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

                             else if(iTime==2){

                                           m_led3.Value=1;

                                           buff[0]=0x04;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

                             else if(iTime==3){

                                           m_led4.Value=1;

                                           buff[0]=0x08;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

              }

              else if(m_mode.Value==2) {

                             if(iTime >= 2)

                                           iTime = 0;

 

                             if(iTime==0) {

                                           m_led1.Value=0;

                                           m_led2.Value=0;

                                           m_led3.Value=0;

                                           m_led4.Value=0;

                                           buff[0]=0x00;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

                             else {

                                           m_led1.Value=1;

                                           m_led2.Value=1;

                                           m_led3.Value=1;

                                           m_led4.Value=1;

                                           buff[0]=0x0f;

                                           m_ComuPort.WriteComm((unsigned char*)buff,1);

                             }

                                          

              }

 

 

 

              CDialog::OnTimer(nIDEvent);

}

 

void CRs232Dlg::OnPointerValueChangedCwknob2(long Pointer, VARIANT FAR* Value)

{

              // TODO: Add your control notification handler code here

              SetTimer(1,(int)m_timer.Value,NULL);

}