В ряде проектов радиолюбители сталкиваются с ситуацией, когда количество контактов у используемого ими микроконтроллера является недостаточным для реализации всех функций проекта. Данная ситуация характерна для проектов с большим количеством используемых светодиодов (светодиодные кубы и т.д.), большим количеством семисегментных индикаторов и т.п. Решить проблему нехватки контактов микроконтроллера в этом случае могут регистры сдвига.
В данной статье мы рассмотрим подключение регистра сдвига 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 представлена на следующем рисунке.
В схеме мы подключили контакты регистра сдвига data, clock и strobe к контактам RB0, RB1 и RB2 микроконтроллера PIC соответственно. Для всех 8 светодиодов используется один токоограничивающий резистор. Для того, чтобы задействовать работу контактов вывода регистра сдвига 74HC595, необходимо замкнуть его контакт 13 на землю. Контакт QH регистра сдвига мы оставим неподключенным поскольку мы не будем подключать еще один регистр сдвига каскадом. Мы отключаем флаг очистки входа (clear input flag) при помощи подключения контакта 10 регистра сдвига к VCC.
Кварцевый генератор подключен к контактам 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; } |
А в какой программе писался код для этого контроллера?
В среде MPLAB-X