아두이노 디지털핀 기본적인 사용법, MsTimer2 라이브러리를 사용하여 Timer Interrupt 를 사용하는 방법은 하단의 관련 포스트를 참조해주세요.
7-Segment
7-Segment 는 8개의 LED로 구성된 표시 장치입니다. 일반적인 7-Segment는 아래 그림과 같이 7개의 획과 1개의 dp 포인트 LED로 구성되어 있습니다. 보통 3,8핀은 7-Segment 가 공통-애노드(Anode)인 경우 전원, 공통-캐소드(Cathode)인 경우 그라운드에 연결 됩니다.
타이머 인터럽트로 1초마다 7-Segment 의 숫자를 증가하는 코드입니다. 타이머 인터럽트를 사용하기 위해 MsTimer2 라이브러리를 참조하였습니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <MsTimer2.h> #define segA 3 // 'a' 세그먼트 연결 핀 번호 #define segB 2 // 'b' 세그먼트 연결 핀 번호 #define segC 5 // 'c' 세그먼트 연결 핀 번호 #define segD 6 // 'd' 세그먼트 연결 핀 번호 #define segE 7 // 'e' 세그먼트 연결 핀 번호 #define segF 8 // 'f' 세그먼트 연결 핀 번호 #define segG 9 // 'g' 세그먼트 연결 핀 번호 #define segDP 4 // 'dp' 세그먼트 연결 핀 번호 // main 함수에서 처리 편하게 하기 위해 핀번호 배열을 생성 int fndPort[8] = {segA, segB, segC, segD, segE, segF, segG, segDP}; // index 0-9 -> 숫자 1~9 // index 10 -> Blank int fndData[11][8] = { { 1, 1, 1, 1, 1, 1, 0, 0 }, // 0 { 0, 1, 1, 0, 0, 0, 0, 0 }, // 1 { 1, 1, 0, 1, 1, 0, 1, 0 }, // 2 { 1, 1, 1, 1, 0, 0, 1, 0 }, // 3 { 0, 1, 1, 0, 0, 1, 1, 0 }, // 4 { 1, 0, 1, 1, 0, 1, 1, 0 }, // 5 { 1, 0, 1, 1, 1, 1, 1, 0 }, // 6 { 1, 1, 1, 0, 0, 1, 0, 0 }, // 7 { 1, 1, 1, 1, 1, 1, 1, 0 }, // 8 { 1, 1, 1, 1, 0, 1, 1, 0 }, // 9 { 0, 0, 0, 0, 0, 0, 0, 0 }, // 10 - Blank }; // 초기값 10 -> Blank int iflag = 0; void setup(){ // 1000ms 간격으로 myTimer() 함수를 호출합니다. MsTimer2::set(1000, myTimer); MsTimer2::start(); // 7 Segment 연결된 포트 모두 출력으로 설정 for(int i = 0 ; i < 8 ; i++) { pinMode(fndPort[i],OUTPUT); } } void loop(){ static int iCount = 0; if (iflag == 1) { if (iCount == 9) { iCount = 0; } else { iCount++; } for(int i = 0 ; i < 8 ; i++) digitalWrite(fndPort[i], fndData[iCount][i]); iflag = 0; } } void myTimer(){ iflag = 1; } | cs |
아래 결과 영상은 코드 실행 결과를 빠르게 확인하기 위해 200ms 간격으로 카운트 하도록 코드를 수정한 결과입니다. 36번 줄 타이머 인터럽트 설정을 200ms 로 수정하였습니다.