사용 부품 : 7segment 1개, 스위치(버튼) 2개
버튼이 하나만 있어서, 하나는 user button을 사용함
프로그램 구조
숫자는 0부터 시작하여, 증가 버튼을 누르면 숫자가 하나씩 증가 (바로 증가하지 않게 delay 줌)
증가하다가 9를 넘어가면 (segment가 하나라 9까지만 표현 가능) 0으로 초기화
감소 버튼을 누르면 숫자가 하나씩 감소(동일하게 delay)
감소하다가 0보다 작아지면 0으로 초기화
방법 1.
포인터 변수를 이용하여 각 핀 번호에 맞는 세그먼트 숫자 적기 -> 16진수로 변환
장점 : 코드가 간단해짐
단점 : 변환 및 계산에 시간이 걸림 (개인적으로 숫자들을 변환하는 게 퍼즐 같아서 재밌었음)
변환 하는 법
2진수의 각각은 해당 핀 번호(0~15)의 상태를 뜻하고, PC12, PC7, PC8,... 등 같은 포트 이름의 번호 관리 가능
(GPIOC -> ODR = 0x4080; 이런 식으로 쓸 것이기 때문)
다른 포트이름을 같이 쓰려면 그에 맞는 핀 번호를 변환하면 됨
숫자 4을 예를 들어보자. (PE의 다른 핀 번호는 출력으로 사용 안 한다 가정)
디지털로 표현한 4는 a, d, e만 불이 꺼짐
-> 각각에 해당하는 핀이 PE2, PE6, PE3 -> 해당 핀만 1(꺼짐)이고 나머지 0(켜짐)
-> 0000 0000 0100 1100
-> 0x 0 0 4 c(12니까)
(세그먼트가 A507이라서, Vcc를 연결하는 anode 방식을 써서 1 : 꺼짐, 0 : 켜짐)
(세그먼트가 508이라면, Gnd 연결하는 cathode 방식이므로 0 : 꺼짐, 1: 켜짐)
따라서 숫자4는 GPIOE -> ODR = 0x004c; 로 출력 가능
방법 2.
숫자 패턴을 배열로 일일이 나타내어 a,b,c,d,e,f,g 각각의 상태 출력
장점 : 직관적임
단점 : 코드가 길어짐
<작동 영상>
<어려웠던 점>
user 버튼을 눌러도 잘 작동이 안 됐는데, run을 많이해서인지 핀 설정에 문제가 있었던 것인지 모르겠다..
버튼 2개를 인터럽트 없이 GPIO_Input으로 설정했어서 그런가?
결국 여러 설정들 시도가 안 먹혀서, 아예 컴퓨터 전원을 껐다 켰는데 갑자기 잘 되었다...
아마 user 버튼은 pull-down이 디폴트라 그런 것 같아서,
그냥 버튼 2개를 쓰는 게 좋을 듯 하다
'임베디드 (Embedded) > STM32' 카테고리의 다른 글
[STM32] NUCLEO-F429ZI 타이머 카운트 설정 및 HAL_IncTick(), HAL_SYSTICK_Callback()을 이용하여 led 깜빡이기 (0) | 2023.10.26 |
---|---|
[STM32] NUCLEO-F429ZI UART 통신 print 사용 및 Error opening 해결 (1) | 2023.10.24 |
[STM32] NUCLEO-F429ZI led로 2진수 표현하기 (0) | 2023.10.20 |
[STM32] NUCLEO-F429ZI overcurrent LD5 켜지는 이유 (0) | 2023.10.20 |
[STM32] NUCLEO-F429ZI Board Selector로 led, 외부 버튼 실습 (0) | 2023.10.20 |