본문으로 건너뛰기

7 세그먼트 프로그래밍

소개

7 Segment

길쭉한 모양의 7개의 LED를 붙여서
숫자, 기호 등을 표시할 수 있도록 만든 소자로
각 LED는 A ~ G까지 기호가 붙어있음

  • 위, 아래로 10개의 핀이 있으며 이 핀들은 각각 A ~ G까지의 LED와 점(DP)와 연결됨

  • 1을 만들고 싶으면 B, C에 불이 들어오게 하면 됨
    alt text

  • 7 세그먼트를 on 시키려면 PORTB에 1을 출력하면 됨



기본 프로그램

  • PORTA 와 PORTB 에 1을 전달하여 출력했을 때

    • 코드
    PORTA 와 PORTB 비교
    #define F_CPU16000000UL
    #include<util/delay.h>
    #include<avr/io.h>

    int main(void){
    DDRA = 0b11111111;
    DDRB = 0b11111111;

    while(1){
    PORTA = 0b11111111;
    PORTB = 0b11111111;
    }

    return 0;
    }

    • 결과

    출력 결과



연결 확인

7 Segment 모두 출력
 #define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
DDRA = 0b11111111; // 0xFF
DDRB = 0b11111111; // 0xFF

while(1){
PORTA = 0b00000001; // 0x01
PORTB = 0b00000001; // 0x01
_delay_ms(3000);

PORTA = 0b00000010; // 0x02
PORTB = 0b00000010; // 0x02
_delay_ms(3000);

PORTA = 0b00000100; // 0x04
PORTB = 0b00000100; // 0x04
_delay_ms(3000);

PORTA = 0b00001000; // 0x08
PORTB = 0b00001000; // 0x08
_delay_ms(3000);

PORTA = 0b00010000; // 0x10
PORTB = 0b00010000; // 0x10
_delay_ms(3000);

PORTA = 0b00100000; // 0x20
PORTB = 0b00100000; // 0x20
_delay_ms(3000);

PORTA = 0b01000000; // 0x40
PORTB = 0b01000000; // 0x40
_delay_ms(3000);

PORTA = 0b10000000; // 0x80
PORTB = 0b10000000; // 0x80
_delay_ms(3000);
}
return 0;
}

7 Segment << 연산자를 사용
 #define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
DDRA = 0b11111111;
DDRB = 0b11111111;
int data = 0x01; // 0b00000001

while(1){
PORTA = data;
PORTB = data;
_delay_ms(2000);
data = data << 1; // data <<= 1
if (data == 0x100) data = 0x01; // 초기화
}
return 0;
}


숫자 0을 출력

7 Segment로 0을 출력
 #define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
DDRA = 0xFF;
DDRB = 0xFF;

while(1){
PORTA = 0b00111111;
PORTB = 0b00111111;
_delay_ms(2000);
}
return 0;
}
  • 숫자 0을 만들기 위해 abcdef를 on 시킨다

7세그먼트 - 0



숫자 0부터 숫자 4를 출력

7 Segment로 0 ~ 4 출력
 #define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
DDRA = 0xFF;
DDRB = 0xFF;

while(1){
//pgfedcba
PORTA = 0b00111111; // 0
PORTB = 0b00111111;
_delay_ms(2000);
//pgfedcba
PORTA = 0b00000110; // 1
PORTB = 0b00000110;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01011011; // 2
PORTB = 0b01011011;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01001111; // 3
PORTB = 0b01001111;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01100110; // 4
PORTB = 0b01100110;
_delay_ms(2000);

}
return 0;
}


숫자 5부터 숫자 9를 출력

7 Segment로 5 ~ 9 출력
 #define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
DDRA = 0xFF;
DDRB = 0xFF;

while(1){
//pgfedcba
PORTA = 0b01101101; // 5
PORTB = 0b01101101;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01111101; // 6
PORTB = 0b01111101;
_delay_ms(2000);
//pgfedcba
PORTA = 0b00100111; // 7
PORTB = 0b00100111;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01111111; // 8
PORTB = 0b01111111;
_delay_ms(2000);
//pgfedcba
PORTA = 0b01100111; // 9
PORTB = 0b01100111;
_delay_ms(2000);

}
return 0;
}


배열을 이용하여 0부터 9까지 출력

배열로 하드코딩을 개선
#define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
int i = 0;
DDRA = 0xFF;
DDRB = 0xFF;

unsigned char seg[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01100111, // 9
}

while(1){
PORTA = seg[i];
PORTB = seg[i];
_delay_ms(2000);
i++;
if ( i > 9 ) i = 0; // reset
}
return 0;
}


배열을 이용하여 A부터 F까지 출력

배열로 하드코딩을 개선
#define F_CPU16000000UL
#include<util/delay.h>
#include<avr/io.h>

int main(void){
int i = 0;
DDRA = 0xFF;
DDRB = 0xFF;

unsigned char seg[] = {
0x77,
0x7C,
0x58,
0x5E,
0x79,
0x71
}

while(1){
PORTA = seg[i];
PORTB = seg[i];
_delay_ms(2000);
i++;
if ( i > 5 ) i = 0; // reset
}
return 0;
}