В ряде проектов радиолюбители сталкиваются с ситуацией, когда количество контактов у используемого ими микроконтроллера является недостаточным для реализации всех функций проекта. Данная ситуация характерна для проектов с большим количеством используемых светодиодов (светодиодные кубы и т.д.), большим количеством семисегментных индикаторов и т.п. Решить проблему нехватки контактов микроконтроллера в этом случае могут регистры сдвига.
В данной статье мы рассмотрим подключение регистра сдвига 74HC595 к микроконтроллеру PIC. Для подключения данного регистра сдвига к микроконтроллеру необходимо всего лишь 3 контакта, а на его выходе мы получаем 8 параллельных контактов. Для еще большего увеличения необходимых контактов можно подключать регистры сдвига каскадом – подключив таким образом два регистра сдвига мы получим 16 выходных контактов.
Также на нашем сайте мы рассматривали подключение регистра сдвига 74HC595 к другим микроконтроллерам (платам):
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Регистр сдвига 74HC595 (купить на AliExpress).
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
- Резисторы 4,7 кОм и 1 кОм (купить на AliExpress).
- Светодиоды – 8 шт. (купить на AliExpress).
- Источник напряжения питания 5V.
- Макетная плата.
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Регистр сдвига 74HC595
Распиновка (назначение контактов) микросхемы регистра сдвига 74HC595 представлена на следующем рисунке. Расшифрованы контакты в таблице ниже.
Наименование контактов | Выполняемые функции |
Q0 — Q7 | Выходные контакты микросхемы (на рисунке обозначены красным прямоугольником), на них выдаются параллельно 8 бит данных. Мы к ним подключаем светодиоды. |
Data Pin (DS) | Контакт, на который мы передаем данные последовательно, бит за битом. Чтобы передать 1, мы с помощью подтягивающего резистора подаем на него напряжение высокого уровня (high), а чтобы передать 0 – мы подаем на него напряжение низкого уровня. |
Clock Pin (SHCP) | Контакт синхронизации. Каждый импульс на этом контакте заставляет регистр сдвига считать один бит с контакта Data Pin и сохранить его. |
Shift Output (STCP) | После приема 8 бит мы подаем импульс на этот контакт чтобы увидеть выход регистра сдвига. |
Алгоритм работы
Алгоритм взаимодействия с регистром сдвига показан на следующем рисунке.
1. Сначала мы передаем один бит данных на контакт Data Pin.
2. После этого мы подаем импульс на Clock Pin, в результате этого регистр сдвига считывает бит данных с контакта Data Pin и сохраняет его.
3. Затем мы подаем второй бит данных на контакт Data Pin и импульс на Clock Pin, в результате чего регистр сдвига считывает второй бит данных с контакта Data Pin и сохраняет его. Этот процесс мы продолжаем до тех пор, пока не передадим регистру сдвига все 8 бит.
4. Когда все 8 бит приняты последовательно, один за одним, мы подаем импульс на контакт Shift Output (STCP) чтобы передвинуть (передать) все сохраненные 8 бит на 8 выходных контактов микросхемы.
Таблица истинности регистра сдвига 74HC595 приведена на следующем рисунке
Схема проекта
Схема подключения регистра сдвига 74HC595 к микроконтроллеру PIC представлена на следующем рисунке.
Кварцевый генератор подключен к контактам OSC микроконтроллера. В данном проекте мы с помощью регистра сдвига будем последовательно включать светодиоды с Q0 по Q7.
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.
Объяснение программы для микроконтроллера PIC
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе настроим биты конфигурации микроконтроллера.
1 2 3 4 5 6 7 8 |
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) |
После этого укажем тактовую частоту кварцевого генератора (необходимо для правильной работы функции задержки) и дадим осмысленные имена используемым контактам.
1 2 3 4 5 6 7 8 |
#include <xc.h> /* Hardware related definition */ #define _XTAL_FREQ 20000000 //Crystal Frequency, used in delay #define DATA_595 PORTBbits.RB0 #define STROBE_595 PORTBbits.RB1 #define CLK_595 PORTBbits.RB2 |
Затем запрограммируем функцию system_init() – в ней мы будем задавать направление работы используемых контактов (в нашем случае на вывод данных).
1 2 3 |
void system_init(void){ TRISB = 0x00; } |
Далее запрограммируем импульсы, подаваемые на контакты clock и latch регистра сдвига.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* *This function will enable the Clock. */ void clock(void){ CLK_595 = 1; __delay_us(500); CLK_595 = 0; __delay_us(500); } /* *This function will strobe and enable the output trigger. */ void strobe(void){ STROBE_595 = 1; __delay_us(500); STROBE_595 = 0; } |
После этого запрограммируем функцию data_submit(unsigned int data), предназначенную для передачи последовательных данных на регистр сдвига 74HC595.
1 2 3 4 5 6 7 |
void data_submit(unsigned int data){ for (int i=0 ; i<8 ; i++){ DATA_595 = (data >> i) & 0x01; clock(); } strobe(); // Data finally submitted } |
На вход этой функции будут поступать 8-битные данные, каждый из этих битов мы будем передавать последовательно (друг за другом) используя оператор сдвига влево и оператор AND. Каждый бит будет записываться в регистр используя импульс синхронизации (функция clock()), а затем данные будут окончательно передаваться на выход с помощью функции strobe(). В этой функции сначала будут передавать наиболее значащие биты (MSB, Most Significant Bit), а затем менее значащие.
В основной функции программы main мы будем последовательно передавать на выход регистра двоичные числа чтобы по очереди зажигать светодиоды, подключенные к его выходам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
system_init(); // System getting ready 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); } return; } |
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
/* * File: main.c * Author: Sourav Gupta * By:- circuitdigest.com * Created on May 30, 2018, 2:26 PM */ // PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include <xc.h> /* Hardware related definition */ #define _XTAL_FREQ 20000000 //Crystal Frequency, used in delay #define DATA_595 PORTBbits.RB0 #define STROBE_595 PORTBbits.RB1 #define CLK_595 PORTBbits.RB2 #define LED PORTBbits.RB3 /* Other Specific definition */ void system_init(void); /* *This function will enable the Clock. */ void clock(void){ CLK_595 = 1; __delay_us(500); CLK_595 = 0; __delay_us(500); } /* *This function will strobe and enable the output trigger. */ void strobe(void){ STROBE_595 = 1; __delay_us(500); STROBE_595 = 0; } /* * эта функция будет последовательно передавать данные на регистр сдвига */ void data_submit(unsigned int data){ for (int i=0 ; i<8 ; i++){ DATA_595 = (data >> i) & 0x01; clock(); } strobe(); // Data finally submitted } void main(void) { system_init(); // System getting ready 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); } return; } /* This Function is for system initialisations. */ void system_init(void){ TRISB = 0x00; } |
2 ответа к “Подключение регистра сдвига 74HC595 к микроконтроллеру PIC”
А в какой программе писался код для этого контроллера?
В среде MPLAB-X