본문 바로가기
아두이노

[Do it! 아두이노] 11. 7세그먼트로 숫자 표시하기

by Lizardee 2023. 8. 20.
1. 7세그먼트 기본 사용법 알아보기

▶ 7세그먼트(seven-segment)란?
: 숫자나 문자를 표시하는 일곱 개의 LED와 점을 표시하는 한 개의 LED로 구성된다.

  • 공통 단자가 양극인 유형: 전원(5V)을 공통으로 사용하므로, 7세그먼트의 각 단자에 LOW 신호를 줘야 LED가 켜진다.
  • 공통 단자가 음극인 유형: 접지(GND)를 공통으로 사용하므로, 7세그먼트의 각 단자에 HIGH 신호를 줘야 LED가 켜진다.

7세그먼트(seven-segment)의 작동 원리

7세그먼트의 구조
  • A~G 단자: 숫자나 문자를 표시하는 7개의 LED를 제어하는 단자
  • DP: 점을 표시하는 LED를 제어하는 단자

--> 7세그먼트는 각 단자를 제어해 LED를 켜고 끔으로써 숫자를 표현한다. 예를 들어, B단자와 C단자를 제어해 LED를 켜면 숫자 1을 표시할 수 있다.

숫자 0~9를 표시하기 위한 7세그먼트 단자의 디지털값

 

Do it! 실습 11-1. 7세그먼트로 숫자 출력하기
  • 공통 단자가 음극인 유형
7세그먼트로 숫자 출력하기
//아두이노의 디지털 핀과 7세그먼트 연결
#define A 4
#define B 5
#define C 12
#define D 11
#define E 10
#define F 3
#define G 2
#define DP 13

void setup(){
  
  //7세그먼트와 연결된 디지털 핀을 출력 모드로 설정
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
}

void loop(){
  
  //7세그먼트로 0부터 9까지 숫자 출력
  number0();  delay(1000);
  number1();  delay(1000);
  number2();  delay(1000);
  number3();  delay(1000);
  number4();  delay(1000);
  number5();  delay(1000);
  number6();  delay(1000);
  number7();  delay(1000);
  number8();  delay(1000);
  number9();  delay(1000);
}

void number0(){
  digitalWrite(A, HIGH);  //ON: LOW
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(DP, LOW);
}

void number1(){
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, LOW);
}

void number2(){
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number3(){
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number4(){
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number5(){
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number6(){
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number7(){
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(DP, LOW);
}

void number8(){
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

void number9(){
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(DP, LOW);
}

 

Do it! 실습 11-2. 7세그먼트의 스케치 코드 개선하기

: 7세그먼트의 유형과 상관없이 스케치 코드의 변경을 최소화할 수 있게 개선한다.

  • 배열로 표현
세그먼트 스케치 코드 개선하기
//아두이노의 디지털 핀과 7세그먼트 연결
#define A 4
#define B 5
#define C 12
#define D 11
#define E 10
#define F 3
#define G 2
#define DP 13

//배열로 표현
int digit[10][8]={
// A, B, C, D, E, F, G, DP
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, 0, 0, 0, // 7
1, 1, 1, 1, 1, 1, 1, 0, // 8
1, 1, 1, 1, 0, 1, 1, 0  // 9
};

void setup(){
  
  //7세그먼트와 연결된 디지털 핀을 출력 모드로 설정
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
}

void displayDigit(int*digit);

void loop(){
  
  //7세그먼트로 0~9까지 숫자 출력
  displayDigit(digit[0]); delay(1000);
  displayDigit(digit[1]); delay(1000);
  displayDigit(digit[2]); delay(1000);
  displayDigit(digit[3]); delay(1000);
  displayDigit(digit[4]); delay(1000);
  displayDigit(digit[5]); delay(1000);
  displayDigit(digit[6]); delay(1000);
  displayDigit(digit[7]); delay(1000);
  displayDigit(digit[8]); delay(1000);
  displayDigit(digit[9]); delay(1000);
}


//7세그먼트를 숫자로 표시하는 함수 displayDigit
void displayDigit(int*digit){ //digit 2차원 배열의 한 행을 매개변수로 받음
  digitalWrite(A, digit[0]);  //digit 1차원 배열의 0번째 열 값을 A로 출력
  digitalWrite(B, digit[1]);
  digitalWrite(C, digit[2]);
  digitalWrite(D, digit[3]);
  digitalWrite(E, digit[4]);
  digitalWrite(F, digit[5]);
  digitalWrite(G, digit[6]);
  digitalWrite(DP, digit[7]);
}

 


2. 7세그먼트 디코더와 조합하기

▶ 7세그먼트 디코더(seven-segment decorder)란?
: 7세그먼트로 숫자를 표현할 때 필요한 제어선을 일곱 개에서 네 개로 줄일 수 있는 장치

7세그먼트 디코더의 핀 구서
  1. 전원(Vcc), 접지(GND)
  2. 7세그먼트에 연결할 출력 단자 7개
    --> A~F
  3. 아두이노 보드에 연결할 입력 단자 4개, 이 단자를 통해 아두이노로부터 입력값을 받아 7세그먼트의 출력을 제어
    --> AIN, BIN, CIN, DIN
  4. 7세그먼트 디코더를 테스트하기 위한 단자
    --> 램프 테스트(LT; lamp test), 귀선 소거(BI; blanking), 래치 활성화(LE; letch enable) 단자