Mayroong mga posibilidad sa naka-embed na disenyo kung saan wala kang sapat na I / O na mga pin na magagamit sa iyong microcontroller. Maaari itong maging sanhi ng anumang kadahilanan, maaaring ang iyong aplikasyon ay nangangailangan ng maraming mga LED o nais mong gumamit ng maraming mga 7-segment na pagpapakita, ngunit hindi mo kinakailangan ng I / O na mga pin sa iyong microcontroller. Narito ang isang perpektong sangkap, rehistro ng shift. Tumatanggap ang shift register ng serial data at bigyan ang parallel output. Nangangailangan lamang ito ng 3 mga pin upang kumonekta sa iyong microcontroller at makakakuha ka ng higit sa 8 Mga output pin mula rito. Ang isa sa mga tanyag na rehistro ng paglilipat ay 74HC595. Mayroon itong 8 bit na rehistro ng imbakan at 8 bit na rehistro ng paglilipat. Matuto nang higit pa tungkol sa mga rehistro ng shift dito.
Magbibigay ka ng serial data sa shift register at mai- latched ito sa register ng imbakan at pagkatapos ay makokontrol ng rehistro ng storage ang 8 output. Kung nais mo ng higit na output magdagdag lamang ng isa pang paglilipat ng rehistro. Sa pamamagitan ng pag- cascading ng dalawang rehistro ng shift, makakakuha ka ng karagdagang 8 output, kabuuang 16bit na output.
Pagrehistro ng Shift 74HC595:
Narito ang diagram ng pin out ng 74HC595 ayon sa datasheet-
Ang HC595 ay may 16pins; kung nakikita natin ang datasheet mauunawaan natin ang mga pagpapaandar ng pin-
Ang QA hanggang QH, mula sa mga pin na numero 1 hanggang 7 at 15 na ginamit bilang 8 bit na output mula sa shift register, kung saan bilang pin 14 ay ginagamit para sa pagtanggap ng serial data. Mayroon ding talahanayan ng katotohanan tungkol sa kung paano gamitin ang iba pang mga pin at magamit ang iba pang mga pag-andar ng rehistro ng shift.
Kapag isinulat namin ang code para sa interface ng 74HC595, ilalapat namin ang talahanayan ng katotohanan na ito para sa pagkuha ng nais na mga output.
Ngayon, makikipag-ugnay kami sa 74HC595 sa PIC16F877A at makokontrol ang 8 LEDs. Nag-interfaced kami ng 74HC595 shift register sa iba pang mga microcontroller:
- Pag-interfacing ng 74HC595 Serial Shift Registro na may Raspberry Pi
- Paano Gumamit ng Shift Register 74HC595 kasama ang Arduino Uno?
- Ang pagitan ng LCD sa NodeMCU gamit ang rehistro ng shift
Kinakailangan ang Mga Bahagi:
- PIC16F877A
- 2 pcs 33pF ceramic disc capacitor
- 20Mhz Crystal
- 4.7k risistor
- 8pcs LEDs
- 1k resistor -1 pc (8 pcs 1k resistors kung kinakailangan ng magkahiwalay na resistors sa bawat leds)
- 74HC595 ic
- 5V adapter sa dingding
- Kapaligiran ng programa ng PIC
- Breadboard at mga wire
Diagram ng Circuit:
Sa circuit diagram, nakakonekta namin ang serial data pin; orasan at strobo (latch) na pin sa microcontroller's RB0, RB1 at RB2 pin ayon sa pagkakabanggit. Dito nagamit namin ang isang risistor para sa 8 LEDs. Alinsunod sa talahanayan ng katotohanan, pinagana namin ang output sa pamamagitan ng pagkonekta sa pin 13 ng 74HC595 sa lupa. Ang QH pin ay naiwang bukas dahil hindi kami magkakaskas ng isa pang 74HC595 kasama nito. Hindi namin pinagana ang malinaw na flag ng pag-input sa pamamagitan ng pagkonekta sa pin 10 ng shift register sa VCC.
Ang oscillator ng Crystal ay konektado sa mga pin ng OSC ng microcontroller. Ang PIC16F877A ay walang anumang panloob na oscillator. Sa proyektong ito ay sindihan namin ang pinangunahan nang paisa-isa mula Q0 hanggang Q7 gamit ang shift regitster.
Naitayo namin ang circuit sa isang breadboard-
Paliwanag sa Code:
Ang kumpletong code para sa pagkontrol sa mga LED na may rehistro ng shift ay ibinibigay sa pagtatapos ng artikulo. Tulad ng nakasanayan, kailangan naming itakda ang mga config bit sa PIC microcontroller.
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Paganahin ang bit (hindi pinagana ang WDT) #pragma config PWRTE = OFF // Power-up Timer Paganahin ang bit (PWRT hindi pinagana) # pragma config BOREN = ON // Brown-out Reset Paganahin ang bit (pinagana ang BOR) #pragma config LVP = OFF // Mababang Boltahe (Single-Supply) In-Circuit Serial Programming Paganahin ang bit (Ang RB3 / PGM na pin ay mayroong pagpapaandar sa PGM; mababa -nagawang pag-program ngvoltage) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Proteksyon ang code ng EEPROM code) #pragma config WRT = OFF // Flash Program Memory Sumulat Paganahin ang mga bits (Isulat ang proteksyon, maaaring ang lahat ng memorya ng programa isinulat sa pamamagitan ng kontrol ng EECON) #pragma config CP = OFF // Flash Program Memory Code ng Proteksyon ng kaunti (Proteksyon ng code off)
Pagkatapos nito ay idineklara namin ang dalas ng kristal na kinakailangan para sa pagkaantala at ang pin-out na deklarasyon para sa 74HC595.
# isama
Susunod na idineklara namin ang system_init () na pagpapaandar upang simulan ang direksyon ng pin.
void system_init (void) { TRISB = 0x00; }
Nilikha namin ang pulso ng orasan at latch pulse gamit ang dalawang magkakaibang pag-andar
/ * * Ang pagpapaandar na ito ay magpapagana sa Clock. * / void na orasan (walang bisa) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
at
/ * * Ang pagpapaandar na ito ay mag-strobo at paganahin ang output gatilyo. * / void strobo (walang bisa) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Matapos ang dalawang pagpapaandar na ito ay idineklara namin ang pagpapaandar ng data_submit (unsigned int data) upang magsumite ng serial data sa 74HC595.
void data_submit (unsigned int data) { para (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; orasan (); } strobo (); // Ang data sa wakas ay isinumite }
Sa pagpapaandar na ito, tinatanggap namin ang data ng 8bit at ipinapadala ang bawat bit gamit ang dalawang kaliwang operator na kaliwang shift at AT operator. Una naming binago ang data isa-isa at alamin ang eksaktong piraso kung 0 o 1 ito gamit ang AT operator na may 0x01. Ang bawat data ay naka-imbak ng pulso ng orasan at pangwakas na output ng data na tapos na gamit ang latch o strobe pulse. Sa prosesong ito ang data output ay magiging MSB (Most Significant Bit) muna.
Sa pangunahing pag- andar ay isinumite namin ang binary at ginawa isa-isa ang mga output pin.
system_init (); // Naghahanda ang system habang (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); } bumalik; }
Iyon ay kung paano maaaring magamit ang isang rehistro sa paglilipat upang makakuha ng mas maraming mga libreng I / O na pin sa anumang microcontroller para sa pagkonekta ng maraming mga sensor.