티스토리 뷰

Tiny Clock을 만드는데 필요한 개별 기능들에 대한 구현과 확인 절차를 모두 끝냈으면, 마지막으로 개별 기능들을 모두 합쳐 하나의 프로젝트에서 원활하게 각자의 기능을 수행하도록 만들어야 한다.

먼저, 시계처럼 보이도록 시간과 분을 표시해 주고 초단위 값을 표시하기 위한 함수를 만든다.

disp_clock() 함수는 시간과 분 값을 표시해 주는 함수이다.  만약 시간값이 10보다 작을 경우 한자리 수자만 표시되도록 해준다.  그리고, 9번 줄에서처럼 초값이 홀수일 때시간값과 분값 사이에 ':'이 표시되도록 해준다.

프로그램이 처음 시작될 때에는 0시 0분부터 시작되도록 되어 있다. 

푸쉬버튼을 두개 동시에 누르게 되는 경우, 시간과 분값을 표시되도록 하거나 초값만 보여주도록 토글되도록 하였다. 따라서 초값을 표시해 주기 위하여 disp_sec()를 만들었다.

초단위 표시를 볼 수 있다.  59초 이후에 다시 0으로 돌아가는 것을 확인할 수 있다.

change_tm1637_bright() 함수는 주위 밝기에 따라 시계 표시도 적당한 밝기로 표시되도록 해준다.

타이머 인터럽트 루틴안에서 1초에 해당되는 만큼 타이머 인터럽트가 발생하게 되는 경우 초값을 증가 시켜주고, 그 값이 1분만큼 흘렀을 경우 초값은 0으로 만든 후 분값을 증가시켜준다.  마찬가지로 분값이 1시간 만큼 경과되면 분값은 0으로 되돌린 다음, 시간값을 1증가 시킨다.  시간값이 하루의 시간만큼 경과되면 시,분,초값 모두 0으로 초기화 된다.  매 1초의 시간이 경과되면 이를 처리하기 위하여 timer_updated 플래그 값을 셋 해준다.

get_cds() 함수는 주위 밝기를 검출하여 8단계의 레벨로 변환시켜 리턴해 주는 함수 이다.

위의 코드에 보이는 MIN_CDS 값은 가장 어두워 졌을 때에 읽히는 값으로 설정해 주면 된다.  MAX_CDS 값은 시계가 놓여 있는 장소에서 하루중 가장 밝을때의 값에 해당한다.

CDS_STEP은 가장 밝을때의 값과 가장 어두울때의 값 사이의 구간을 8단계로 나누었을 때 그 간격을 의미한다.

18번 줄에서처럼 ADC로 읽은 값에서 최소값을 뺀 다음 CDS_STEP 으로 나누어주면 8단계로 만들어 줄 수 있게 되는 것이다.

16번 줄은 ADC로 읽은 값이 각 단계에 걸쳐서 리턴값이 자주 변경되는 것을 막아주기 위해 넣어준것이다.  민감도를 좀 떨어뜨리는 효과가 있다.

푸쉬버튼이 눌러진 경우 처리하는 인터럽트 루틴이다.

7번줄에 50msec 정도의 delay를 넣어준것은 푸쉬버튼 2개를 동시에 누르고 싶은 경우 두 버튼간의 시간차에 따라 어느 하나의 버튼값만 읽히게 되는것을 방지하기 위해서다.  약간의 시간이 경과한 다음 PIN값을 읽어야지 하나의 버튼만 눌렀는지, 아니면 버튼 두개 모두 눌렀는지 알수 있게 되기 때문이다.

23:59이 되도록 버튼을 눌러 조정한 다음, 1분 후에 0:00으로 제대로 표시되는것을 볼 수 있다.

만약 버튼 두개를 동시에 누르게 되면 시간,분 값 표시를 해주거나 아니면 초단위 값만 표시해 주도록 sec_only 플래그를 이용하여 토글되도록 해준다.

13~18번 줄은 CDS에서 읽은 값이 이전과 달라진 경우에 이를 반영하도록 해주는 코드이다.

27번 줄은 분값을 증가하게 되는 경우 초값이 0으로 초기화되도록 해준다.



main.c


'프로젝트 > Tiny Clock' 카테고리의 다른 글

Tiny Clock - 푸쉬버튼  (0) 2018.05.21
Tiny Clock - Cds 측정  (0) 2018.05.18
Tiny Clock - 타이머 설정  (1) 2018.05.18
Tiny Clock - TM1637 동작  (0) 2018.05.17
Tiny Clock - 회로 구성  (0) 2018.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함