달력

5

« 2024/5 »

  • 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
부품:
세븐 세그먼트 SR-4156K, 1K옴 저항 8개
 
부품설명:
SR-4156K는 단순히 세븐 세그먼트가 4개 합쳐진 것 입니다.
앞의 FND507는 공통 양극 이였지만
이것은 공통 음극입니다.

공통 음극 핀은 각 세븐 세그먼트에 하나씩있고,
a, b, c, d, e, f, g, dp핀은 각 세븐 세그먼트의 같은 단자끼리 연결되어 있습니다.
즉, a는 a끼리 묶여서 하나의 핀을 이루고 있는 것이죠.
그래서 핀이 총 12갠데 각 핀의 역할은 그림과 같습니다.
 
회로연결:
SR-4156K가 아니더라도 다음과 같이 연결하면 됩니다.
우선 각 LED의 양극부분인 a, b, c, d, e, f, g, dp는 각각 1K저항에 연결한 뒤
차례대로 아두이노의 2, 3, 4, 5, 6, 7, 8, 9번핀에  연결합니다.
그다음 각 세븐 세그먼트의 공통 음극 0,1,2,3번핀은
차례대로 아두이노의 10,11,12,13번 핀에 연결합니다.
우선 회로가 제대로 연결되었는지를 확인하기 위해
다음의 코드를 업로드 합니다.
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
const int a=2, b=3, c=4, d=5, e=6, f=7, g=8, dp=9;
const int digitPins[]={10,11,12,13};
 
void setup()
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dp, OUTPUT);
 
  for(int i=0; i<4; i++)
    pinMode(digitPins[i], OUTPUT); 
}
 
void loop()
{
  //digit3
  showDigit(3,f);
  showDigit(3,a);
  //digit2
  showDigit(2,a);
  //digit1
  showDigit(1,a);
  //digit0
  showDigit(0,a);
  showDigit(0,b);
  showDigit(0,c);
  showDigit(0,d);
  //digit1
  showDigit(1,d);
  //digit2 
  showDigit(2,d);
  //digit3
  showDigit(3,d);
  showDigit(3,e);
  showDigit(3,g);
  //digit2
  showDigit(2,g);
  //digit1
  showDigit(1,g);
  //digit0
  showDigit(0,g);
  showDigit(0,dp);
  
  //end of one loop
  delay(300);
}
 
void showDigit(int onDigit, int onSegment)
  //setting pin of onDigit take on.
  for(int i=0; i<4; i++)
  digitalWrite(digitPins[i], HIGH);
  
  digitalWrite(digitPins[onDigit], LOW);
  
  //setting pin of onSegment take on.
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(dp, LOW);
  
  digitalWrite(onSegment, HIGH);
  
  delay(50);
}
코드:
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
const int digitPins[] = {10,11,12,13};
                          //abcdefg/dp
const int segmentPins[] = {2,3,4,5,6,7,8,9};
                       //dp/gfedcba
const int numberCode[10]={B11000000, //0
                          B11111001, //1
                          B10100100, //2
                          B10110000, //3
                          B10011001, //4
                          B10010010, //5
                          B10000010, //6
                          B11011000, //7
                          B10000000, //8
                          B10010000}; //9
 
void setup()
{
  for(int i=0; i<8; i++)
  {
    pinMode(segmentPins[i], OUTPUT);
    
    if(i>=4)
    continue;
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH);
  }
}
 
void loop()
{
  for(int n=0; n<10000; n++)
   {
     for(int repeat=0; repeat<5; repeat++)
     display4Number(n);
  }
}
 
void display4Number(int number)
{
  //from digit0 to digit4 one by one.
  for(int i=0; i<4; i++)
  {
    digitalWrite(digitPins[i], LOW);
    if(i==0)
    digitalWrite(digitPins[3], HIGH);
    else
    digitalWrite(digitPins[i-1], HIGH);
    
    //show one number.
    showNumber(number%10);
   
    //because of next digit.
    number=number/10;
    
    //delay time.
    delay(5);
  }
}
 
void showNumber(int number)
{
  boolean value;
  
  for(int bitPosition=0; bitPosition<8; bitPosition++)
 {
    //if number isn't 0 to 9, all off.
    if(number<0 || number>9)
    value = 0;
    //if number is 0 to 9, 
    else
    //Read bit.
    value = bitRead(numberCode[number], bitPosition);
    
    //because of common cathod, the opposite of front tutorial.
    value=!value;
    //and Reading value 0, off. Reading value 1, on.
    digitalWrite(segmentPins[bitPosition], value);
  }
  return ;
}
 
코드설명:
우선 loop()함수를 보세요.
n은 0~9999까지 반복되면서 display4Number()함수에 입력됩니다.
이때, 숫자가 너무 빠르지 않도록  display4Number(n)을 5번 반복합니다.
이렇게 해서 0000에서부터 9999까지의 숫자를 순서대로 나타내는 겁니다.
자, 그럼 display4Number()함수의 원리를 보겠습니다.
우선, 우리 눈에는 4자리수가 보이지만,
사실은 4개의 세븐 세그먼트의 숫자4개가 동시에 켜지는 것이 아닙니다.
digit0에서 숫자가 잠시 켜지고,
digit1에서 숫자가 잠시 켜지고,
digit2에서 숫자가 잠시 켜지고,
digit3에서 숫자가 잠시 켜지는 것입니다.
즉, 한번에 하나씩 세븐 세그먼트가 켜지는 것입니다.
그 다음, showNumber()함수에 한자리 수가 입력됩니다.
number%10은 number을 10으로 나눈 나머지 입니다.
그 다음,  다음 자릿수의 표현을 위해서
숫자를 10으로 나는 몫을 변수number에 저장합니다. 
예를 들어, 나타낼 숫자는 1234이고 지금 나타낼 세븐 세그먼트는 digit0이라고 합시다.
showNumber(1234%10)을 한 뒤에,
다음 자릿수인 digit1을 나타내기 위해서는
변수 number에 123이 저장되어야 하는 거죠.
그 다음, 하나의 세븐 세그먼트가 눈에 보일 수 있도록
아주 순간의 시간이라도 delay를 하는거죠~
display4Number()함수를 이해하셨나요?
그렇다면 display4Number()함수 내부의 showNumber()함수를 설명하겠습니다.
이 함수는 앞서의 FND507에서의 showNumber()함수와
완전히 같은 함수라는 것을 아시겠나요? 
다만,  value=!value;부분이 다릅니다.
FND507은 공통 양극이였고, SR-4156K는 공통 음극이기 때문에
맨 위에 있는 같은 numberCode를 쓴다면, 숫자는 반대로 해주어야 하기 때문입니다.
즉, 0은 1로, 1은 0으로 말입니다.
쉽지 않나요? *^^*

[출처] [세븐세그먼트] 2|작성자 DEW


:
Posted by youjin.A