Hi ha possibilitats en el disseny incrustat en què no teniu suficients pins d'E / S disponibles al vostre microcontrolador. Això es pot deure a qualsevol motiu, pot ser que l'aplicació necessiti diversos LEDs o que vulgueu utilitzar diverses pantalles de 7 segments, però no necessiteu pins d'E / S al microcontrolador. Aquí ve un component perfecte, registre de desplaçament. El registre de majúscules accepta dades de sèrie i dóna sortida paral·lela. Només requereix 3 pins per connectar-se amb el microcontrolador i obtindrà més de 8 pins de sortida. Un dels registres de torns més populars és el 74HC595. Té 8 registre d'emmagatzematge de bits i 8 bits de l'registre de desplaçament. Obteniu més informació sobre els registres de torns aquí.
Proporcionareu dades de sèrie al registre de torns i es guardaran al registre d’emmagatzematge i, a continuació, el registre d’emmagatzematge controlarà les 8 sortides. Si voleu més sortida, afegiu un altre registre de torns. Mitjançant dos registres de desplaçament en cascada, obtindreu 8 sortides addicionals, total de 16 bits.
Registre de torns 74HC595:
Aquí teniu el diagrama de fixació del 74HC595 segons el full de dades.

HC595 té 16 clavilles; si veiem el full de dades, entendrem les funcions de pin

El QA a QH, des dels números de l' 1 al 7 i el 15, s'utilitza com a sortida de 8 bits del registre de desplaçament, on s'utilitza el pin 14 per rebre les dades de sèrie. També hi ha una taula de veritat sobre com utilitzar altres pins i aprofitar altres funcions del registre de torns.

Quan escrivim el codi per a la interfície del 74HC595, aplicarem aquesta taula de veritat per obtenir les sortides desitjades.
Ara, farem una interfície 74HC595 amb PIC16F877A i controlarem 8 LED. Hem interfaçat el registre de desplaçament 74HC595 amb altres microcontroladors:
- Interfacing 74HC595 Registre de canvis de sèrie amb Raspberry Pi
- Com utilitzar Shift Register 74HC595 amb Arduino Uno?
- Interfície LCD amb NodeMCU mitjançant registre de desplaçament
Components necessaris:
- PIC16F877A
- Condensadors de disc de ceràmica de 2 peces de 33 pF
- Cristall de 20Mhz
- Resistència de 4,7 k
- 8pcs LEDs
- 1k resistència -1 pc (es requereixen 8 resistències 1k si es necessiten resistències separades en cada led)
- 74HC595 ic
- Adaptador de paret de 5V
- Entorn de programació PIC
- Taula de pa i cables
Esquema de connexions:

Al diagrama de circuits, hem connectat el pin de dades sèrie; rellotge i pin estroboscòpic (pestell) al pin RB0, RB1 i RB2 del microcontrolador respectivament. Aquí hem utilitzat una resistència per a 8 LED. Segons la taula de veritat, hem activat la sortida connectant el pin 13 de 74HC595 a terra. El pin QH es deixa obert, ja que no farem cap cascada amb un altre 74HC595. Hem desactivat el senyal d’entrada neta connectant el pin 10 del registre de desplaçament amb VCC.
L'oscil·lador Crystal està connectat als pins OSC del microcontrolador. El PIC16F877A no té cap oscil·lador intern. En aquest projecte il·luminarem el led un per un de Q0 a Q7 mitjançant shift regitster.
Hem construït el circuit en una taula

Explicació del codi:
Al final de l'article es dóna un codi complet per controlar els LED amb registre de desplaçament. Com sempre, hem d’establir els bits de configuració al microcontrolador PIC.
#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 (El pin RB3 / PGM té funció PGM; baix -programació de tensió activada) #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 (Protecció contra escriptura desactivada; tota la memòria del programa pot ser escrit per control EECON) #pragma config CP = OFF // Bit de protecció del codi de memòria del programa Flash (protecció del codi desactivada)
Després vam declarar la freqüència de cristall necessària per al retard i la declaració de pin-out per al 74HC595.
#incloure
A continuació, vam declarar la funció system_init () per inicialitzar la direcció del pin.
void system_init (void) { TRISB = 0x00; }
Hem creat el pols de rellotge i el pols de tancament mitjançant dues funcions diferents
/ * * Aquesta funció habilitarà el rellotge. * / rellotge buit (buit) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
i
/ * * Aquesta funció farà estroboscòpica i activarà el disparador de sortida. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Després d'aquestes dues funcions, vam declarar la funció data_submit (dades sense signar int) per enviar dades de sèrie al 74HC595.
void data_submit (dades sense signar int) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; rellotge (); } estroboscòpic (); // Dades finalment enviades }
En aquesta funció acceptem dades de 8 bits i enviem cada bit mitjançant dos operadors de bits a l’ esquerra shift i operador AND. Primer canviem les dades un per un i descobrim el bit exacte si és 0 o 1 utilitzant l’operador AND amb 0x01. Cada dada s’emmagatzema mitjançant el pols del rellotge i la sortida final de dades mitjançant el pols de tancament o estroboscòpic. En aquest procés, la sortida de dades serà primer MSB (bit més significatiu).
A la funció principal hem enviat el binari i hem fet que els pins de sortida es posessin alts un per un.
system_init (); // El sistema es prepara mentre (1) { data_submit (0b00000000); __delay_ms (200); enviament_dades (0b10000000); __delay_ms (200); enviament_dades (0b01000000); __delay_ms (200); enviament_dades (0b00100000); __delay_ms (200); enviament_dades (0b00010000); __delay_ms (200); data_submit (0b00001000); __delay_ms (200); enviament_dades (0b00000100); __delay_ms (200); data_submit (0b00000010); __delay_ms (200); enviament_dades (0b00000001); __delay_ms (200); data_submit (0xFF); __delay_ms (200); } tornar; }
És així com es pot utilitzar un registre de desplaçament per obtenir més pins d'E / S gratuïts en qualsevol microcontrolador per connectar més sensors.
