아두이노 fnd 카운터 - adu-ino fnd kaunteo

코드

int seg[]={2,3,4,5,6,7,8,9};

byte digits[10][8]={

{ 1,1,0,0,0,0,0,0 }, // 0

{ 1,1,1,1,1,0,0,1 }, // 1

{ 1,0,1,0,0,1,0,0 }, // 2

{ 1,0,1,1,0,0,0,0 }, // 3

{ 1,0,0,1,1,0,0,1 }, // 4

{ 1,0,0,1,0,0,1,0 }, // 5

{ 1,0,0,0,0,0,1,0 }, // 6

{ 1,1,1,1,1,0,0,0 }, // 7

{ 1,0,0,0,0,0,0,0 }, // 8

{ 1,0,0,1,0,0,0,0 } // 9

};

void setup()

{

for (int i = 0; i < 8; i++)

{

pinMode(seg[i], OUTPUT);

}

}

void loop()

{

for (int i = 0; i < 10; i++)

{

for (int j = 0; j < 8; j++)

{

digitalWrite(seg[j], digits[i][j]);

}

delay(1000);

}

}

사용한 FND는 5161BS 공통 애노드(+) 타입.

1자리 FND의 동작 예제는 하단의 관련포스트를 참조해주세요.

본 예제에서 사용하는 4자리 7세그먼트는 공통 캐소드 타입으로, 내부의 회로는 아래 그림과 같이 구성되어있습니다. 총 12개의 핀으로 구성되며 4개의 자리 수 선택 핀(Digit 1 ~ 4) 와 8개의 세그먼트 핀(A~G, DP)으로 구성됩니다. 

4자리 FND는 아래 그림과 같이 Digit1~4 를 빠른 속도로 순차적으로 켜서 4자리 모두 불이 들어와 있는 것처럼 보이도록 코드가 작성되어야 합니다. 

본 예제의 구성품은 아래와 같습니다.

타이머 인터럽트로 10ms 마다 인터럽트 서비스 루틴 호출하여 카운트한 값을 4-Digit 7-Segment 에 출력 하는 코드 입니다.

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

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

#include <MsTimer2.h>

#define segA 12  // 'a' 세그먼트 연결 핀 번호

#define segB 2  // 'b' 세그먼트 연결 핀 번호

#define segC 7  // 'c' 세그먼트 연결 핀 번호

#define segD 9  // 'd' 세그먼트 연결 핀 번호

#define segE 10  // 'e' 세그먼트 연결 핀 번호

#define segF 11  // 'f' 세그먼트 연결 핀 번호

#define segG 6  // 'g' 세그먼트 연결 핀 번호

#define segDP 8 // 'dp' 세그먼트 연결 핀 번호

#define digit1 13 // 1st digit 연결 핀번호

#define digit2 4 // 2nd digit 연결 핀번호

#define digit3 3 // 3rd digit 연결 핀번호

#define digit4 5 // 4th digit 연결 핀번호3r

// main 함수에서 처리 편하게 하기 위해 핀번호 배열을 생성

int fndDigit[4= {digit1, digit2, digit3, digit4};

int fndPort[8= {segA, segB, segC, segD, segE, segF, segG, segDP};

// index 0-9 -> 숫자 1~9

// index 10 -> Blank

int fndData[11][8= {

00000011 }, // 0

10011111 }, // 1

00100101 }, // 2

00001101 }, // 3

10011001 }, // 4

01001001 }, // 5

01000001 }, // 6

00011011 }, // 7

00000001 }, // 8

00001001 }, // 9

11111111 }, // 10 - blank

};   

// 초기값 10 -> Blank

int iflag = 0;

void setup(){

// 1000ms 간격으로 myTimer() 함수를 호출합니다.

MsTimer2::set(10, myTimer);

MsTimer2::start();

// 7 Segment 연결된 포트 모두 출력으로 설정

for(int i = 0 ; i < 4 ; i++)

{

pinMode(fndDigit[i], OUTPUT);

digitalWrite(fndDigit[i], LOW);

}

for(int i = 0 ; i < 8 ; i++)

{

pinMode(fndPort[i],OUTPUT);

digitalWrite(fndPort[i],HIGH);

}

}

void loop(){

static int iCount = 0;

// 타이머 인터럽트가 발생 (iflag=1) 되면 iCount 를 1씩 증가, iCount 값이 10000일 경우 0으로 전환

if (iflag == 1)

{

if (iCount == 10000) {

iCount = 0;

}

else {

iCount++;

}

iflag = 0;

}

// 4자리수에 각각 입력 될 숫자 입력

int digit1st = iCount / 1000;

int digit2nd = iCount % 1000 / 100;

int digit3rd = iCount % 100 / 10;

int digit4th = iCount % 10;

// for 문을 돌리기 위해 배열을 사용

int digitData[4= {digit1st, digit2nd, digit3rd, digit4th};

for(int i = 0 ; i < 4 ; i++)

{

// 모든 Digit 1~4 핀 Off

digitalWrite(digit1,LOW);

digitalWrite(digit2,LOW);

digitalWrite(digit3,LOW);

digitalWrite(digit4,LOW);

// 각 Digit 에 맞는 fnd 숫자의 값 입력

for(int j= 0 ;j<8;j++)

{

digitalWrite(fndPort[j], fndData[digitData[i]][j]); 

// 소수점 구분 점 찍기

if(i==1digitalWrite(fndPort[7], 0);

}

// 해당 Digit On

digitalWrite(fndDigit[i],HIGH);

// 밝기 조절을 위해 2ms LED ON 시간 조절

delay(2);

}

}

// 10ms 간격 타이머 인터럽트

void myTimer(){

iflag = 1;

}

cs

코드의 실행 결과는 아래 영상과 같습니다.