CS/Embedded System

[실습] User Button Initialization & State Machine

WakaraNai 2021. 10. 13. 18:15
728x90
반응형

User Button Initialization

GPIO 포트 1번의 pin 1번과, pin 4번을 입력 모드로 : PxDIR

  • S1 버튼은 GPIO P1.1
  • S2 버튼은 GPIO P1.4
  • P1->DIR  &=  ~ ( 1<<1 | 1<<4 );
  • 1번 자리와 4번 자리만 0으로, 나머지는 1로 된 이진수를 만들기
  •  ~ ( 1<<1 | 1<<4 )  =>   ~ ( 00010010 )  =>  11101101

 

 

 

 

pullup resistor 켜기 : PxREN

  • 1번 핀과 4번 핀만 1값을 주어 pull-up/pull-down 활성화하기
    • 둘 중 하나 선택은 PxOUT에서
  • P1->REN  =  (1<<4) | (1<<1);
  • 0001 0010

 

 

 

 

OUT에서 pull-up 으로 선택하기 : PxOUT

  • 주의!! out이라서 출력만 관여한다고 생각하겠지만,
    • 입력 모드로 사용 시에는 out으로도 pullup 활성화를 지정
  • P1OUT은 pull-up/ pull-down 둘 다 가능해서 특정 입력 모드를 꼭 선택해야 함

 

 

 

 

GPIO Input Register : PxIN

  • 해당 핀에 넣을 HIGH/LOW 신호 지정
  • P1.1에 HIGH 신호를 넣었는지 확인
    • if ( (P1->IN & (1<<1)) == (1<<1) )
  • P1.4에 HIGH 신호를 넣었는지 확인
    • if ( (P1->IN & (1<<4)) == (1<<4) )
  • 즉, 해당 자리에 1 값이 들어가 있는지 확인

 

 


 

 

MACRO 만들어서 편하게 사용하기

 

  • 괄호 주의!
  • S1 버튼이 눌렀는지 확인하는 매크로
    •  #define  S1BUT  (P1->IN & (1<<1)) == (0x00)
  • S2 버튼이 눌렀는지 확인하는 매크로
    •  #define  S2BUT  (P1->IN & (1<<4)) == (0x00)
    • // HIGH는 버튼을 누르지 않아 VCC가 그대로 입력으로 들어감
    • // 그래서 0인 상태에 GND로 흘러가기에 누른 상태가 됨

 

 

예제 1

P1.1에 HIGH가 오면 P1.0 RED LED 끄기
P1.1에 LOW가 오면 P1.0 RED LED 켜기
<P1.1 == S1 버튼이므로,
S1버튼이 눌리면 LED는 켜지고
S1버튼이 떠있으면 LED는 꺼짐

S1 버튼으로 P1.1 LED 조작
S2 버튼으로 P2.0 LED 조작하기


( 코드 유출 방지 )

 

 

예제 2

  • 초기에는 P2.{012}에 빨강만
  • S2 버튼을 한 번 누르고 나면 RGB 반복
  • S2 버튼을 누르고 있을 때 하얀색이 나오는 이유?
      • 마이크로프로세서가 당신이 손보다 빠르기 때문
      • 그래서 RGB 순서도 앞서나가서 가끔씩 틀림

 

 

 


 

 

State Machine for Button

계속 누르는 상태에서 하얀색이 나오는 것을 방지

polling loop에서 loop를 몇 번 돌았는지 통제할 수 없음

그래서 state 방법을 이용

 

  • 초기 상태는 button release
  • 버튼을 누르면 button down 상태로
  • 이 때 다시 떼면 button up 상태로
  • 이 때 button의 입력값을 넘김
  • 그 상태로 release 해도 상태가 유지됨
  • 그러다 버튼을 다시 누르면 button down 상태로

 

  • 예제 
  • 초기 상태 : P1.0과 P2.{012}에 빨강
  • Run-time state : 
    • S2 버튼을 눌렀다 떼면 P2.{012}가 RGB 순환
    • S1 버튼을 눌렀다 떼면 P2.{012}가 BGR 순환
    • P1.0은 계속 깜박임

 

( 코드 유출 방지 )

728x90
반응형