[ATmega128] 7 세그먼트

해당 예제는 WinAVR 컴파일러 환경에서 동작합니다.

이번 예제는 스위치로 시계 같은 장치에서 사용되는 7세그먼트를 직접 제어하는 예제이다.


회로도


소스코드

#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
unsigned char num_data[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};    
//cathod common 형의 비트 패턴

void main(void){
    unsigned char ch;
    DDRB=0xff;            //PB를 출력으로 설정
    DDRD=0x00;            //PD를 입력으로 설정
    PORTD= 0x0f;        //풀업저항 사용
    while(1){
        ch = (~PIND)&0x0f;    
//스위치에 따른 입력값을 정수로 숫자로 변환
        PORTB = num_data[ch];    //PORTB에 숫자에 따른 비트 패턴을 출력
    }
}

코드는 오히려 LED 예제보다 더 간단하다. 스위치를 통해 2진수 입력을 받아서 7-세그먼트에 16진수 숫자를 출력하는 프로그램이다. num_data[]배열은 7-세그먼트 부품마다 다르게 입력해 주어야 한다. 여기서 사용한 7-세그먼트는 7SEG-COM-CATHODE라는 소자로 공통 단자가 GND이고 LED에 HIGH 신호가 인가되면 LED가 켜지는 구조이다.

위 사진과 비슷하지만 DP 단자가 없다. 예를 들어서 2를 켜기 위해서는 a, b, d, e, g LED가 활성화 되어야하기 때문에0b01011011 가 출력되어야 한다. cathode, athode 방식에 따라서 num_data[] 배열이 달라진다. 그 이유는 공통 단자가 GND이냐 Vcc이냐에 따라 HIGH를 출력하면 불이 켜지는지 LOW를 출력하면 불이 켜지는 지 달라지기 때문이다.


주의할 점

스위치가 택트 스위치가 아니라 푸쉬 스위치를 써서 입력값을 유지할 수 있다.

스위치 입력값을 확인할 때 스위치가 눌려져 있으면 1을 의미하지만 핀으로는 LOW가 입력된다. 예를 들어서 입력을 10 = 0b1010으로 주었을 때 PIND는 0101을 입력으로 받는다. 따라서 not연산~ 을 해준 다음 0x0f와 &연산을 해준다.

'임베디드 > ATmega128' 카테고리의 다른 글

[ATmega128] GPIO 활용 - LED 예제2  (0) 2021.10.02
[ATmega128] GPIO 활용 - LED 예제1  (0) 2021.10.02

+ Recent posts