마이크로프로세서를 사용한 제품에서 숫자 표기장치로 제일 많이 사용하는 부품은 7-Segment(FND : Fluorescent numeric display, 형광 숫자 표시기)이다. FND는 숫자를 표기하기 위해 LED소자를 7개로 구성되어있다.
LED소자 7개로 숫자를 표현하기때문에 7-Segment라고 부른다. 소수점을 포함하는 DP단자까지 표현하면 총 8개의 LED로 구성되어있다.
7-segment는 Common cathode type과 Common anode type으로 나뉘는데 전자는 전원을 GND에 연결하고 소자에 0이라는 신호가 들어와야 LED가 점등되지만 후자는 전원을 VCC에, 소자에는 1이라는 신호를 입력해야 LED가 켜진다.
위 스펙은 7-segment의 모델마다 다르기 때문에 Datasheet을 무조건 참고해야한다.
참고로 본 회로를 연결할 때 LED에 들어가는 선에 220옴에서 470옴 사이의 저항을 연결해줘야한다.
FND 구동방식에는 Dynamic방식과 Static방식이 있다.
Dynamic 방식은 FND전체를 ON하는게 아닌 여러개의 Part를 번갈아 가면서 On, Off을 가해주는 방식이다. 즉 눈의 착시현상을 이용한 방식이다.
Static방식은 모든 FND를 포트나 플립 플롭을 이용해서 한번에 On하는 방식이지만 Dynamic방식에 비해 소자별 구동시간이 길어 전류소모량이 많다.
FND 폰트를 구성하는 방법은 두가지이다. Hex값을 이용하거나 이진수 값을 이용하는 방법이다. 아래가 그 표이다.
이진값을 이용하고싶다면 0bxxxxxxxx형식으로 배열을 만들어서 사용하면 되고 Hex값을 이용하면 0xc0와 같이 표기 가능하다. 나는 Hex값을 이용하였다.
아래의 코드는 7-segment를 1~9999까지 순서대로 증가하는 코드이다.
#include<mega128.h>
#include<delay.h>
#define Q0 PORTB.0
#define Q1 PORTB.1
#define Q2 PORTB.2
#define Q3 PORTB.3
#define S1 {Q0 = 1; Q1 = 0; Q2 = 0; Q3 = 0;} // 1번째 FND 선택
#define S2 {Q0 = 0; Q1 = 1; Q2 = 0; Q3 = 0;} // 2번째 FND 선택
#define S3 {Q0 = 0; Q1 = 0; Q2 = 1; Q3 = 0;} // 3번째 FND 선택
#define S4 {Q0 = 0; Q1 = 0; Q2 = 0; Q3 = 1;} // 4번째 FND 선택
#define FND PORTA // PORTA 활성화
const char Font[10] = {0xc0,0xf9,0xa4, // 0,1,2
0xb0,0x99,0x92, // 3,4,5
0x82,0xf8,0x80, // 6,7,8
0x90}; // 9
int count=0; // count 변수 생성
void segment(unsigned int number)
{
unsigned int Buff, i;
unsigned char D1000, D100, D10, D1;
D1000 = number/1000; //천의 자리
Buff = number % 1000; // 1000으로 나눈 나머지 값 저장
D100 = Buff / 100; // 백의자리
Buff = Buff % 100; // 100으로 나눈 나머지 값 저장
D10 = Buff / 10; // 십의자리
D1 = Buff % 10; // 일의자리
for (i = 0; i <10; i++)
{
S1; // 첫 번째 FND를 ON 시킨다.
FND = Font[D1000]; // 천의 자리수를 출력한다.
delay_us(500); // 500us 딜레이
FND = 0xff;
S2; // 두 번째 FND를 ON 시킨다.
FND = Font[D100]; // 백의 자리수를 출력한다.
delay_us(500);
FND = 0xff;
S3; // 세 번째 FND를 ON 시킨다.
FND = Font[D10]; // 십의 자리수를 출력한다.
delay_us(500);
FND = 0xff;
S4; // 네 번째 FND를 ON 시킨다.
FND = Font[D1]; // 일의 자리수를 출력한다.
delay_us(500);
FND = 0xff;
}
}
void Port_init(void)
{
DDRB = 0xff; // 포트 A를 출력으로 설정한다.
DDRA = 0xff; // 포트 B를 출력으로 설정한다.
}
void main(void)
{
Port_init();
Q0=Q1=Q2=Q3=0; // 모든 FND(0~3)를 선택(ON)한다.
while(1)
{
count++;
segment(count);
if(count == 9999) count = 0;
}
}
회로 구동 영상은 다음과 같다.
'Embedded > AVR' 카테고리의 다른 글
Atmega128 다중 LED제어 (0) | 2021.01.16 |
---|---|
📝ATmega128로 LED 켜보기 (0) | 2021.01.15 |
비전공자의 임베디드학습 준비 (1) | 2021.01.14 |