2022-05-21 Arduino_11

2022. 5. 21. 01:38학부 강의/Arduino

7-세그먼트 (FND)

  • 숫자 혹은 영문 알파벳의 일부를 표시하기 위하여 7개의 선분 형태의 발광 다이오드(LED)를 ‘8’ 모양으로 배치하여 만든 표시장치
  • 디지털시계, 전자계량기, 기본 계산기 및 숫자 정보를 표시하는 여러 전자 장치에 널리 사용
  • 숫자나 문자 표시는 8개 LED 세그먼트들 중 일부를 켜거나 끄는 것으로 제어
  • FND(Flexible Numeric Display)라고도 함.


세그먼트 표시장치 유형

공유하는 극성의 종류가 양극인가 음극인가에 따라서 2가지로 나뉜다.

 

공통 양극 방식

  • 공통 핀(Com, 3번, 8번)이 양극.
  • a~g, dp핀이 0V(음극) → LED ON
  • a~g, dp핀이 5V(양극) → LED OFF

 

공통 음극 방식 :

  • 공통 핀(Com, 3번, 8번)이 음극.
  • a~g, dp핀이 0V(음극) → LED OFF
  • a~g, dp핀이 5V(양극) → LED ON


세그먼트로 글자를 표현하는 방법

 

 

byte numbers[10][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
};

 

세그먼트 GND a b c d e f g dp
GND 2 3 4 5 6 7 8 9

 

0, 1번 핀은 아두이노의 시리얼 통신을 위해서 사용하기 위해서 비워두었을듯 싶다.

 

12시에 위치한 a 세그먼트부터 시계 방향으로 b, c, d, e, f, g 세그먼트까지 2~8번 핀에 연결된다.

 

단, b와 c 사이에 dp 세그먼트가 위치하고 이는 9번 핀과 연결한다.

void displayNumbers(int n){
    int pin = 2; // a --> 2, b --> 3, ... , dp --> 9
  for(int i = 0; i < 8; i++) { 
    digitalWrite(pin+i, numbers[n][i]); //1이면 HIGH, 0이면 LOW
  }
}

5_1

공통 음극 방식의 7-세그먼트를 사용한다.

 

1초마다 돌아가면서 a에서 g, dp까지 세그먼트 LED 켜기.

 

 

int pin = 2;

void setup() 
{
    for (int i = 2; i <= 9; i++) 
    { 
      pinMode(i, OUTPUT);
    }
    digitalWrite(2, HIGH); 
}

void loop() {
    for(int i = 0 ; i < 8 ; i++) {
        for(int j = 0 ; j < 8 ; j++) {
            if (i == j) digitalWrite(pin+j, HIGH); 
            else digitalWrite(pin+j, LOW);
        }
        delay(1000); // 1초 딜레이
    }
}

i는 1초마다 켜야 할 세그먼트를 나타낸다.

 

j는 1씩 증가하면서 i와 일치하는 것만 켜고 나머지를 다 꺼준다.

 

이렇게 이중 반복문을 사용하지 않는 방법도 생각해보았다.

 

점등할 세그먼트가 바뀌면 새로 켜줄 세그먼트가 연결된 핀에 HIGH를 write 한다.

 

반드시 이전에 켜 둔 세그먼트가 연결된 핀에 LOW 걸어주어야 한다.

 

그러면 매번 새로 키고 끌 핀 번호를 계산할 필요가 생긴다.

 

이런 번거로움 때문에 이중 반복문을 사용한 것 같다.


5_2

 

1초에 한 번씩 0부터 9까지의 숫자를 차례대로 출력하기

 

 

byte numbers[10][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
};

int pin=2; 
int num=0;

void setup() 
{
    for (int i = 2; i <= 9; i++) 
    {
          pinMode(i, OUTPUT);
    }

    digitalWrite(9, HIGH);
}

void loop() 
{
    for(int i = 0; i < 8; i++) 
    {
        digitalWrite(pin+i, numbers[num][i]);
    }

    num++;
    if (num > 9) num = 0;

      delay(1000);
}

5_3

 

귀여운 탁트 스위치를 누르면 숫자가 하나씩 증가한다.

 

 

byte numbers[10][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
};

int num = 0;

void displayNumbers(int n){

  int pin = 2;    // a -> 2, b -> 3, ... , dp -> 9

  for(int i = 0; i < 8; i++) {
    digitalWrite(pin+i, numbers[n][i]); 
  }
}

void setup() {
  pinMode(12, INPUT);

  for (int i = 2; i <= 9; i++) {
    pinMode(i, OUTPUT);   
  }

  digitalWrite(9, HIGH);
}

void loop() 
{

  if (digitalRead(12) == HIGH){
    ++num;

    if (num > 9) {
      num = 0; 
    }    
  } 

  displayNumbers(num); 

  delay(300);
}

'학부 강의 > Arduino' 카테고리의 다른 글

2022-05-27 Arduino_13  (0) 2022.05.27
2022-05-23 Arduino_12  (0) 2022.05.23
2022-05-17 Arduino_10  (0) 2022.05.17
2022-05-12 Arduino_9  (0) 2022.05.12
2022-05-09 Arduino_8  (0) 2022.05.09