마이크로 컨트롤러에서 사용 가능한 I / O 핀이 충분하지 않은 임베디드 설계의 가능성이 있습니다. 어떤 이유로 든 애플리케이션에 여러 개의 LED가 필요하거나 여러 개의 7 세그먼트 디스플레이를 사용하려고하지만 마이크로 컨트롤러에 필요한 I / O 핀이 없을 수 있습니다. 여기에 완벽한 구성 요소 인 시프트 레지스터가 있습니다. 시프트 레지스터는 직렬 데이터를 받아들이고 병렬 출력을 제공합니다. 마이크로 컨트롤러와 연결하는 데 단 3 개의 핀만 필요하며 여기에서 8 개 이상의 출력 핀 을 얻을 수 있습니다. 인기있는 시프트 레지스터 중 하나는 74HC595 입니다. 이 갖는 8 비트 저장 레지스터 및 8 비트 시프트 레지스터. 여기에서 시프트 레지스터에 대해 자세히 알아보십시오.
직렬 데이터를 시프트 레지스터 에 제공하고 저장 레지스터에 래치 된 다음 저장 레지스터가 8 개의 출력을 제어합니다. 더 많은 출력을 원하면 다른 시프트 레지스터를 추가하십시오. 두 개의 시프트 레지스터 를 계단식으로 연결 하면 추가로 8 개의 출력, 총 16 비트 출력을 얻을 수 있습니다.
시프트 레지스터 74HC595:
다음은 데이터 시트 에 따라 74HC595 의 핀 아웃 다이어그램입니다.
HC595에는 16 핀이 있습니다. 데이터 시트를 보면 핀 기능을 이해할 수 있습니다.
QH에 QA 핀 번호으로부터, 1 내지 7 및 15 으로 사용할 8 비트 출력 은 AS 시프트 레지스터로부터 핀 (14)이 수신을 위해 사용되는 직렬 데이터. 다른 핀을 사용하고 시프트 레지스터의 다른 기능을 사용하는 방법에 대한 진리표도 있습니다.
74HC595 인터페이스를위한 코드를 작성할 때 원하는 출력을 얻기 위해이 진리표를 적용합니다.
이제 74HC595를 PIC16F877A와 인터페이스하고 8 개의 LED를 제어합니다. 74HC595 시프트 레지스터를 다른 마이크로 컨트롤러와 인터페이스했습니다.
- 74HC595 직렬 시프트 레지스터를 Raspberry Pi와 인터페이스
- Arduino Uno에서 시프트 레지스터 74HC595를 사용하는 방법?
- 시프트 레지스터를 사용하여 NodeMCU와 LCD 인터페이스
필요한 구성 요소:
- PIC16F877A
- 2pcs 33pF 세라믹 디스크 커패시터
- 20Mhz 크리스탈
- 4.7k 저항
- 8pcs LED
- 1k 저항 -1 pc (각 LED에 별도의 저항이 필요한 경우 8 개의 1k 저항 필요)
- 74HC595 IC
- 5V 벽면 어댑터
- PIC 프로그래밍 환경
- 브레드 보드 및 와이어
회로도:
회로도에서 직렬 데이터 핀을 연결했습니다 . 마이크로 컨트롤러의 RB0, RB1 및 RB2 핀에있는 클럭 및 스트로브 (래치) 핀. 여기서 우리는 8 개의 LED에 대해 하나의 저항을 사용했습니다. 진리표에 따라 74HC595 의 핀 13을 접지 에 연결하여 출력을 활성화했습니다. QH의 우리가 또 다른 연쇄하지 않으므로 핀은 개방되어 74HC595를 함께. 우리는 클리어 입력 플래그를 비활성화 연결하여 VCC와 시프트 레지스터의 핀 (10).
수정 발진기는 마이크로 컨트롤러의 OSC 핀에 연결됩니다. PIC16F877A에는 내부 발진기가 없습니다. 이 프로젝트에서 우리는 shift regitster를 사용하여 Q0에서 Q7 까지 하나씩 LED를 밝힐 것 입니다.
브레드 보드에 회로를 구성했습니다.
코드 설명:
시프트 레지스터로 LED를 제어하기위한 완전한 코드 는 기사 끝에 제공됩니다. 항상 그렇듯이 PIC 마이크로 컨트롤러에서 구성 비트를 설정해야합니다.
#pragma config FOSC = HS // 오실레이터 선택 비트 (HS 오실레이터) #pragma config WDTE = OFF // 워치 독 타이머 활성화 비트 (WDT 비활성화 됨) #pragma config PWRTE = OFF // 파워 업 타이머 활성화 비트 (PWRT 비활성화 됨) # pragma config BOREN = ON // 저전압 리셋 활성화 비트 (BOR 활성화 됨) #pragma config LVP = OFF // 저전압 (단일 전원) 인-서킷 직렬 프로그래밍 활성화 비트 (RB3 / PGM 핀에는 PGM 기능이 있음; 낮음 -전압 프로그래밍 활성화 됨) #pragma config CPD = OFF // 데이터 EEPROM 메모리 코드 보호 비트 (데이터 EEPROM 코드 보호 해제) #pragma config WRT = OFF // 플래시 프로그램 메모리 쓰기 활성화 비트 (쓰기 방지 해제, 모든 프로그램 메모리는 EECON 제어에 의해 작성 됨) #pragma config CP = OFF // 플래시 프로그램 메모리 코드 보호 비트 (코드 보호 해제)
그 후 우리는 74HC595 에 대한 지연과 핀아웃 선언에 필요한 수정 주파수를 선언했습니다.
#포함
다음으로 우리는 pin 방향을 초기화하기 위해 system_init () 함수를 선언했습니다.
무효 system_init (무효) { TRISB = 0x00; }
두 가지 다른 기능을 사용하여 클럭 펄스와 래치 펄스를 만들었습니다.
/ * *이 기능은 시계를 활성화합니다. * / 무효 시계 (무효) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
과
/ * *이 기능은 출력 트리거를 활성화하고 활성화합니다. * / 보이드 스트로브 (보이드) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
이 두 함수 이후에 우리는 74HC595에 직렬 데이터를 제출하기 위해 data_submit (unsigned int data) 함수를 선언했습니다.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; 시계(); } strobe (); // 최종 제출 된 데이터 }
이 함수에서 우리는 8 비트 데이터를 받아들이고 두 개의 비트 연산자 left shift 및 AND 연산자를 사용하여 각 비트를 보냅니다. 먼저 데이터를 하나씩 이동하고 0x01과 함께 AND 연산자를 사용하여 0인지 1인지 정확한 비트를 찾습니다. 각 데이터는 래치 또는 스트로브 펄스를 사용하여 수행 된 클록 펄스 및 최종 데이터 출력 에 의해 저장됩니다. 이 과정에서 데이터 출력은 먼저 MSB (Most Significant Bit)가 됩니다.
에서 주요 기능 우리는 이진을 제출하고 하나의 출력 핀 높이를 만들었다.
system_init (); // 시스템 준비 while (1) { data_submit (0b00000000); __delay_ms (200); data_submit (0b10000000); __delay_ms (200); data_submit (0b01000000); __delay_ms (200); data_submit (0b00100000); __delay_ms (200); data_submit (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); data_submit (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); data_submit (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } 반환; }
이것이 시프트 레지스터를 사용하여 더 많은 센서를 연결하기 위해 모든 마이크로 컨트롤러에서 더 많은 무료 I / O 핀을 얻을 수있는 방법 입니다.