4-digit FND에 1초마다 증가 하는 0~9999 숫자 표시하기 - 4-digit FNDe 1chomada jeung-ga haneun 0~9999 susja pyosihagi

4-digit FND는 4자리의 숫자를 표시할 수 있는 부품이다. 각각의 FND를 보면 한 개의 FND와 동일 하지만 네 개중 하나를 선택할 수 있는 핀이 추가되어 있다.

4개의 FND를 이용하여 4자리 숫자를 표시할 때 항상 4자리 숫자가 점등된 듯한 착각을 하게 된다. 하지만 실제 동시에 4개의 숫자가 켜져있지는 않다. 이는 4개의 숫자를 각각 빠른 속도로 돌아가며 점등과 소들을 반복하여 전체가 켜져있는 듯한 착시를 주는 방법이다.

DIG에 연결된 핀을 모두 LOW로 설정하여 모든 FND가 켜지도록 한다.

4-digit FND로 0000~9999 숫자를 표현해본다.

/* * 예제 * 4-digit FND로 0000~9999 숫자 표시하기 */ // 0~9까지 LED표시를 위한 상수 설정 const byte number[10]={ 0x3f, //B0011 1111, 0 0x06, //B0000 0110, 1 0x5b, //B0101 1011, 2 0x4f, //B0100 1111, 3 0x66, //B0110 0110, 4 0x6d, //B0110 1101, 5 0x7d, //B0111 1101, 6 0x27, //B0000 0111, 7 0x7f, //B0111 1111, 8 0x6f //B0110 1111, 9 }; int count = 0; // 표시할 숫자변수 0~9 void setup() { // 2~9번 핀을 abcdefg dor의 순으로 사용 // 10~13번 핀을 Digit 1~4의 순서로 사용한다. for(int i=2;i<=13;i++){ pinMode(i,OUTPUT); // 2~13번 핀을 출력으로 설정한다. } // 10~13번 핀에 모두 LOW 신호를 주어서 점등시킨다. for(int i=10;i<=13;i++){ digitalWrite(i,LOW); } } void loop() { fndDisplay(count); // count 변수값을 FND에 출력한다. if(count>=9) // count 변수 값이 0~9의 범위를 갖도록 한다. count=0; else count++; delay(1000); } // LED를 켜는 함수 void fndDisplay(int displayValue){ boolean bitValue; // 2~9번 핀에 모두 LOW 신호를 줘서 소등시킨다. for(int i=2;i<=9;i++){ digitalWrite(i,LOW); } for(int i=0;i<=7;i++){ // number 상수의 하나의 비트값을 읽는다. bitValue = bitRead(number[displayValue],i); // 앞서 읽은 비트값을 2~9번 핀에 출력시킨다. digitalWrite(i+2,bitValue); } }

4-digit FND에 1초마다 증가 하는 0~9999 숫자 표시하기 - 4-digit FNDe 1chomada jeung-ga haneun 0~9999 susja pyosihagi

4-digit FND에 1초마다 증가 하는 0~9999 숫자 표시하기 - 4-digit FNDe 1chomada jeung-ga haneun 0~9999 susja pyosihagi

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

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