임베디드 | 라즈베리파이 | ARM | 리눅스 | Qt | 딥러닝

7-segment 라고도 불리우고 FND 라고도 불리우는 것을 이용하여 숫자를 나타내는 것을 만들어보려고한다.

avr microchip 과 fnd를 이용하여 원하는 글자를 나타내려 할 때 가장 중요한것은

회로연결일 것이다.

FND와 avr의 회로 연결은 간단하다.

우선 FND는 총 . 까지 8개와 vcc 두개로 되어있다.

vcc 한개는 아래쪽 부분을 담당하며 나머지 한부분은 상단 부분의 불을 밝혀준다.











a 부터 F 그리고 . 이 하나 더있어 총 8개를 입력해주어야 완벽한 글자가 나타난다.


프로그래밍 완료후 글자가 제대로 나타나지 않는 이유는 다음과 같을 수 있다.

1. 코딩이 잘못되었다.

- 잘못된 핀 번호

2. 회로도상의 연결문제 

- 잘못된 핀 번호

3. vcc의 잘못된 연결 

-캐소드형과 애노드형 FND의 차이점을 알고있어야 한다.






기본적으로 한 예제를 작성해보도록 하자



#include <avr/io.h>

 

#define F_CPU   4000000UL

#include <util/delay.h>

 

int main(void)

{

    DDRA = 0xFF;    // Configure port B as output

 

    while(1)

    {

        //TODO:: Please write your application code

 

        PORTA = 0b00110000;     // Display Number 1

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b01011011;     // Display Number 2

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b01001111;     // Display Number 3

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b01100110;     // Display Number 4

        _delay_ms(1000);        // Wait for 1s

 

        PORTA = 0b01110111;     // Display Letter A

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b00111001;     // Display Letter C

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b01111001;     // Display Letter E

        _delay_ms(1000);        // Wait for 1s

        PORTA = 0b01110001;     // Display Letter F

        _delay_ms(1000);        // Wait for 1s

 

    }

 

    return 0;

}

< 소스 출처 :http://www.avr-tutorials.com/interfacing/interfacing-seven-segment-display-avr-microcontroller >

위 소스는 매우 간단하게 FND를 이해 할 수 있게 해주는 소스이다.

매 초마다 FND가 달라지는데

핀 A를 사용하였다.

delay는1000으로 설정하여 매초 로 해주었는데

만약 Atmega128 을 사용하고 오실레이터가 외부16Mhz라면  #define F_CPU   4000000UL 을 16000000UL로 변경해주면

1초에 1번씩 숫자가 변경되어진다.



이 이미지는 원하는 숫자를 표현할때 어떤 곳에 신호를 줘야하는지 쉽게 나타내었다.





나는 a를 avr의 PORTB의 1번으로

b를 avr의 PORTB의 2번으로

...

g를 avr의 PORTB의 7번으로 연결해놨습니다.

FND상에 1을 나타내고 싶다면

b,c를 선택해야한다.

fnd와 avr 선의 연결이 어떻게 되어있냐가 중요한다.

fnd 1번이 avr핀의 PBA1번으로 되어있다면




질문 b,c 로 설정하려면

0b01100000 일까

0b00000110 일까

0b01001000 일까


정답은 0b00000110이다.

왜냐하면 b,c 번 위치는 portB의 2,3번과 연결해 놓았기 때문이다.





7세그먼트 표시기는 애노드 공통형(common-anode type)과 캐소드 공통형(common-cathode type)

의 2가지가 있다. 


2가지 타입에 대한 구조는 아래와 같으며, 

애노드 공통형은 A형, 

캐소드 공통형은 K형이라고 부른다.


 애노드 공통형은 공통 단자에 Vcc가 공급되므로 각 단자 a~g가 0V일 때

각 세그먼트의 불이 켜진다. 


나의 세그먼트의 경우 GND에 연결해주어야 불이 들어온다. 즉 캐소드 공통형으로 부를 수 있다.

이 LED는 다이오드 형이므로 전구와 달리 반대로 전류를 넣어줬을때는 

불이 들어오지 않는다.



과전류가 흐르는 것을 방지하기 위하여 각 단자 a~g 마다 약 수백

Ω 정도의 저항을 직렬 연결하여야 한다. 

라고 추천하는데 연습시에는 저항을 궂이 연결하지 않아도 아무 이상없다.



소스 코드 작성시

여러가지로 작성하는 방법이 있다

1. 2진수

    PORTD = 0b10111111; // Display Number 0

_delay_ms(1000);

PORTD = 0b00000110; // Display Number 1   0x00으로하면 포트에서 0볼트 출력 0xff하면 5볼트 출력

_delay_ms(1000); // Wait for 1s

PORTD = 0b01011011; // Display Number 2

_delay_ms(1000); // Wait for 1s

PORTD = 0b01001111; // Display Number 3

_delay_ms(1000); // Wait for 1s

PORTD = 0b01100110; // Display Number 4

_delay_ms(1000); // Wait for 1s

PORTD = 0b01101101;  //5

_delay_ms(1000);

PORTD = 0b01111101;  //6

_delay_ms(1000);

PORTD = 0b00000111; //7

_delay_ms(1000);

PORTD = 0b01111111; //8

_delay_ms(1000);

PORTD = 0b01101111; //9

_delay_ms(1000);

PORTD = 0b01110111; // Display Letter A

_delay_ms(1000); // Wait for 1s

PORTD = 0b01111100; //B

_delay_ms(1000);

PORTD = 0b00111001; // Display Letter C

_delay_ms(1000); // Wait for 1s

PORTD = 0b01011110; //D

_delay_ms(1000);

PORTD = 0b01111001; // Display Letter E

_delay_ms(1000); // Wait for 1s

PORTD = 0b01110001; // Display Letter F

_delay_ms(1000); // Wait for 1s


2. 16진수


PORTD = 0x06;      // 7-Seg Value for Digit 1

PORTD = 0x5B;      // 7-Seg Value for Digit 2

PORTD = 0x4F;      // 7-Seg Value for Digit 3

PORTD = 0x66;      // 7-Seg Value for Digit 4

PORTD = 0x6D;      // 7-Seg Value for Digit 5

PORTD = 0x7D;      // 7-Seg Value for Digit 6





아두이노의 경우

digitalwrite(0,low); 와같이 간단하게 입력할 수있다.

digitalwrite(1,high);

아두이노 레퍼런스 : http://arduino.cc/en/Reference/digitalWrite