[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 |