7세그먼트는 숫자나 시간을 표시하는데 사용되며 우리 주변에서 흔히 볼 수 있는 부품이다. 외관은 아래와 같다.


[그림 1] 7세그먼트의 외관

구동원리는 LED 어레이와 동일하고 도트까지 포함해서 총 8개의 LED가 숫자를 표시하기 위한 레이아웃으로 배치되어 있다. 각각의 LED의 위치 및 명칭과 구조는 다음 [그림 2]와 같다.

[그림 2] 7세그먼트의 구조와 각 LED의 명칭


7세그먼트는 애노드 공통형(anode common type)과 캐소드 공통형(cathod common type)으로 나뉘는데 이는 LED들을 어디에서 결선했는지에 따라서 달라지며 각각에 대한 내부 회로도는 다음 [그림 3]과 같다.


[그림 3] 7세그먼트의 내부 회로도


ATmega8(A)을 이용한 7세그먼트 실험을 위한 회로도는 [그림 4]와 같다. 이것을 구동하기 위해서는 DDRD6='0', PORTD6='1'로 설정해서 GND에 연결된 트랜지스터를 ON시켜야 하여 매크로 Turn7SegOn에 이 동작을 수행하도록 정의하였다. 포트핀의 방향 설정은 초기화 함수 InitAM8()에서 수행한다.

[그림 4] 실험 키트의 7세그먼트 회로도


예를 들어서 숫자 1을 표시 하는 경우는 아래와 같이 LED B와 C를 켜면 된다.

[그림 5] 숫자 1을 표시할 경우


표시 숫자에 따른 전체 데이터 값들은 다음 그림과 같다.


[표 1] 7세그먼트의 숫자 표시 데이터


숫자 0부터 9까지 순차적으로 표시하기

 가장 간단한 실험인 숫자 0부터 9까지 순차적으로 표시하기를 수행한다. <표 5.4.1>에 적힌 데이터를 포트B에 순서대로 내보내기만 하면 된다.


#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include "Am8USBasp.h"
uchar nums[10] =
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
int main(void) {
   uchar byNumId;
   InitAM8();
   while(1) {
       for (byNumId=0; byNumId<10; byNumId++) {
           SEG(nums[byNumId]);
           _delay_ms(500);
       }
   }
}


숫자 데이터를 저장하기 위해서 배열을 사용했다. main()함수에서 하는 일은 이 배열의 데이터를 시차를 두고 내보는 일을 무한히 반복하는 것이다.



Posted by 살레시오
,