У вбудованому дизайні є можливості, коли у вашому мікроконтролері недостатньо штифтів вводу-виводу. Це може бути пов’язано з будь-якою причиною, можливо, вашій програмі потрібні кілька світлодіодів або ви хочете використовувати кілька 7-сегментних дисплеїв, але у вашому мікроконтролері немає необхідних контактів вводу-виводу. Ось ідеальна складова, регістр зсуву. Регістр зсуву приймає послідовні дані та дає паралельний вихід. Для підключення до мікроконтролера потрібно лише 3 висновки, і ви отримаєте від нього більше 8 вихідних висновків. Одним з популярних змінних реєстрів є 74HC595. Він має 8-бітний регістр зберігання та 8-бітний регістр зсуву. Дізнайтеся більше про регістри змін тут.
Ви надасте послідовні дані в регістр зсуву, і вони будуть закріплені на регістрі зберігання, а потім регістр зберігання буде контролювати 8 виходів. Якщо ви хочете отримати більше результатів, просто додайте ще один регістр зсуву. За каскадним два регістра зсуву, ви отримаєте додаткові 8 виходів, загальний вихід 16bit.
Реєстр зміни 74HC595:
Ось схема виводу 74HC595 відповідно до таблиці
HC595 має 16 шпильок; якщо ми побачимо таблицю даних, ми зрозуміємо функції штифтів -
Від QA до QH, від номерів контактів від 1 до 7 і 15 використовується як 8-бітний вихід з регістру зсуву, де як контакт 14 використовується для прийому послідовних даних. Існує також таблиця правди про те, як використовувати інші штифти та користуватися іншими функціями регістру зсуву.
Коли ми пишемо код для взаємодії з 74HC595, ми застосуємо цю таблицю істинності для отримання бажаних результатів.
Тепер ми встановимо інтерфейс 74HC595 з PIC16F877A і будемо керувати 8 світлодіодами. Ми зв’язали регістр зсуву 74HC595 з іншими мікроконтролерами:
- Взаємодія 74HC595 Серійний реєстр зсуву з Raspberry Pi
- Як використовувати Shift Register 74HC595 з Arduino Uno?
- Зв'язок РК з NodeMCU за допомогою реєстру зсуву
Необхідні компоненти:
- PIC16F877A
- 2шт 33pF керамічні дискові конденсатори
- Кристал 20 МГц
- Резистор 4.7k
- 8шт світлодіодів
- 1k резистор -1 шт (8 шт. 1k резистори потрібні, якщо потрібні окремі резистори на кожному світлодіоді)
- 74HC595 ic
- 5В настінний адаптер
- Середовище програмування PIC
- Макет і дроти
Кругова діаграма:
На принциповій схемі ми підключили послідовний контакт даних; годинник та штробовий (фіксатор) штифт на штифтах RB0, RB1 та RB2 мікроконтролера відповідно. Тут ми використали один резистор на 8 світлодіодів. Відповідно до таблиці істинності, ми ввімкнули вихід, підключивши штифт 13 74HC595 до землі. QH штифт залишається відкритим, оскільки ми не каскадом інший 74HC595 з ним. Ми відключили чіткий прапорець введення, підключивши штифт 10 регістру зсуву до VCC.
Кристалічний генератор підключений на OSC штифтах мікроконтролера. PIC16F877A не має жодного внутрішнього генератора. У цьому проекті ми будемо висвітлювати світлодіоди по черзі від Q0 до Q7 за допомогою регулятора зміни.
Ми побудували схему в макеті-
Пояснення коду:
Повний код управління світлодіодами з регістром зсуву подано в кінці статті. Як завжди, нам потрібно встановити біти конфігурації в мікроконтролері PIC.
#pragma конфігурації FOSC = HS // Біти вибору Oscillator (HS генератор) #pragma конфігурації WDTE = OFF // Включення сторожового таймера біт (WDT відключений) #pragma конфігурації 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 // Flash Program Memory Ввімкнути біти (Запис захисту вимкнено; вся пам'ять програми може бути написано контролером EECON) #pragma config CP = OFF // Біт захисту коду пам'яті Flash-програми (захист коду вимкнений)
Після цього ми оголосили частоту кристалів, яка необхідна для затримки, і декларацію про вивід для 74HC595.
#включати
Далі ми оголосили функцію system_init () для ініціалізації напрямку виводу.
void system_init (void) { TRISB = 0x00; }
Ми створили тактовий імпульс та імпульс засувки, використовуючи дві різні функції
/ * * Ця функція вмикає годинник. * / порожній годинник (порожній) { CLK_595 = 1; __затримка_ (500); CLK_595 = 0; __затримка_ (500); }
і
/ * * Ця функція буде стробоскопом і активуватиме вихідний тригер. * / порожній стробоскоп (порожній) { STROBE_595 = 1; __затримка_ (500); STROBE_595 = 0; }
Після цих двох функцій ми оголосили функцію data_submit (непідписані дані int) для подання послідовних даних на 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; годинник (); } стробоскоп (); // Дані остаточно надіслані }
У цій функції ми приймаємо 8-бітові дані і відправляємо кожен біт, використовуючи два побітові оператори лівого зсуву та оператора AND. Спочатку ми зміщуємо дані по одному і з’ясовуємо точний біт, 0 чи 1, використовуючи оператор І з 0x01. Кожні дані зберігаються за синхронізуючим імпульсом і кінцевим висновком даних, виконаним за допомогою фіксатора або імпульсу стробоскопа. У цьому процесі вихід даних буде спочатку MSB (найбільш значущий біт).
В основній функції ми подали двійковий файл і зробили вихідні штифти високими по одному.
system_init (); // Система готується до (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); } повернення; }
Ось як регістр зсуву можна використовувати для отримання більше вільних контактів вводу-виводу в будь-якому мікроконтролері для підключення більшої кількості датчиків.