본문 바로가기
디지털 논리회로

디코더 IC 7442 / 74138 / 7447 , BCD to 7segment decoder & 7seg LED ( FND ) 제어 (+ BCD란)

by eteo 2022. 5. 14.

 

1. 7442, BCD to Decimal Decoder

active low output

 

 

 

2. 7447, BCD to 7-Segment Decoder 와 FND

7447 핀 배치도

Lamp test, BI/RBO, RBI는 active low라서 사용 안할 땐 HIGH(5V)입력을 주면 된다. Lamp test는 모든 불이 잘 들어오는지 확인할 때 쓴다.

 

output은 active low

 

 

7447 진리표

 

 

 

 

 

 

 

FND(Flexible Numeric Display)는 애노드(+)타입 캐소드(-)타입이 있는데

애노드 타입은 COM(공통단자)에는 5V를 입력하고 원하는 단자에 low 신호를 줘서 led를 켜는 타입이고

캐소드 타입은 COM(공통단자)에 GND를 입력하고 원하는 단자에 high 신호를 줘서 led를 켜는 타입이다.

 

실습에는 애노드 타입을 사용하였다.

 

7447의 A0~A3의 입력은 0101(5)이고, 그림이 약간 잘못됐는데 출력은 b와 e는 1 나머지는 0이 된다. b와 e에는 전위차가 없으니 전류가 흐르지 않고 나머지 a, c, d, f, g는 전류가 흘러 led에 불이 들어온다.

330옴 저항은 위쪽 COM 단자 쪽에만 달았다.

그리고 dp(Decimal Point) 소수점은 사용하지 않았다.

 

 

 

 

 

  

 

3. 74138, 3 to 8 Decoder

 

 

 

active low output

 

E3은 active high, E1, E2는 active low

디코더로 사용시 E1, E2는 GND와 묶고 E3에 high를 준다.

 

enable 핀을 데이터입력으로 쓰고 A0-A2를 선택선으로 쓰면 1x8 디멀티플렉서로도 쓸 수 있는 칩이다.

 

 

 

 

BCD란?

 

BCD(Binary-Coded Decimal, 2진화 10진법)는 10진수를 이진수로 표현하는 방식 중 하나로, BCD에서는 각 자리의 10진수를 4비트의 이진수로 표현한다.

예를 들어, 10진수 '5'는 BCD에서 '0101'로, '9'는 '1001'로 변환된다.

 

  • 장점 : BCD Binary를 16진수로 표현하면 사람이 읽고 쓰기 쉬운 10진수와의 변환이 직관적이다. 각 자리의 숫자를 독립적으로 처리하여 변환이 가능하다.
  • 단점: 동일한 숫자를 표현하는데 일반적인 이진수보다 많은 비트를 사용한다. 예를 들어, 10진수 '99'를 BCD로 표현하면 '1001 1001'로 8비트가 필요하지만, 순수 이진수로 표현하면 '1100011'로 7비트만 필요하다.

 

 

- BCD to Decimal 변환 in C

#include <stdio.h>

// BCD to Decimal 변환 함수
int bcdToDec(unsigned int bcd) {
    int decimal = 0;
    int multiplier = 1;
    
    while (bcd) {
        if ((bcd & 0xF) > 9) {
            printf("Error: Invalid BCD input (contains values beyond 0-9)\n");
            return -1;
        }
        decimal += (bcd & 0xF) * multiplier;
        multiplier *= 10;
        bcd >>= 4;
    }
    
    return decimal;
}

int main() {
    // 테스트할 BCD 값들
    unsigned int testCases[] = {0x1234, 0x9, 0x56, 0x789, 0xABCD, 0x8001};
    int numCases = sizeof(testCases) / sizeof(testCases[0]);
    
    for (int i = 0; i < numCases; i++) {
        unsigned int bcd = testCases[i];
        int decimal = bcdToDec(bcd);
        if (decimal != -1) {
            printf("BCD: 0x%X -> Decimal: %d\n", bcd, decimal);
        }
    }

    return 0;
}