4장 - 예제1

조재훈·2023년 6월 8일
0

Switch 입력에 따른 LED 제어

  • 버튼을 한 번 누르면 Blue LED 켜짐

  • 버튼을 또 한 번 누르면 Blue LED 꺼짐

  • PinMap

  • main.h에 private defines 추가

#define LED_STATE0 0 // 초기 상태에서 100ms동안 High가 유지되면 LED On으로 하는 상태
#define LED_STATE1 1 // Switch High에서 Low로 떨어지는지 점검하는 상태
#define LED_STATE2 2 // LED On상태에서 Switch 100ms이상 High 유지되면 LED Off하는 상태
#define LED_STATE3 3 // Switch High에서 Low로 떨어지는지 점검하는 상태

  • main.c에서 사용한 변수 선언
unsigned char ReadSW, SW_High_Counter, LED_State;

  • main.c에 코드 입력
  while (1)
  {
// USER_Btn_GPIO_Port : 파란색 USER 버튼
// ReadSW : 파란색 버튼이 눌렸는지 판단

    ReadSW = HAL_GPIO_ReadPin(USER_Btn_GPIO_Port, USER_Btn_Pin);
    switch(LED_State)
    {
      case LED_STATE0:
        if(ReadSW)
        {
          ++SW_High_Counter;
          if(SW_High_Counter > 10)
          {
            SW_High_Counter = 0x00;
            LED_State = LED_STATE1;
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
            break;
          }
        }
        else
        {
          SW_High_Counter = 0;
        }
        break;
      case LED_STATE1:
        if(ReadSW) break;
        else
        {
          LED_State = LED_STATE2;
          SW_High_Counter = 0x00;
          break;
        }
        break;
      case LED_STATE2:
        if(ReadSW)
        {
          ++SW_High_Counter;
          if(SW_High_Counter > 10)
          {
            SW_High_Counter = 0x00;
            LED_State = LED_STATE3;
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
            break;
          }
        }
        else
        {
          SW_High_Counter = 0;
        }
        break;
      case LED_STATE3:
        if(ReadSW) break;
        else
        {
          LED_State = LED_STATE0;
          SW_High_Counter = 0x00;
          break;
        }
        break;
      default:
        break;
    }
    HAL_Delay(10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  • 버튼을 누를 때마다 LED가 켜졌다 꺼졌다 함


profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글