Existen posibilidades en el diseño integrado en las que no tiene suficientes pines de E / S disponibles en su microcontrolador. Esto puede deberse a cualquier motivo, puede ser que su aplicación necesite varios LED o desee utilizar varias pantallas de 7 segmentos, pero no tiene los pines de E / S necesarios en su microcontrolador. Aquí viene un componente perfecto, registro de desplazamiento. El registro de desplazamiento acepta datos en serie y proporciona una salida en paralelo. Solo requiere 3 pines para conectarse con su microcontrolador y obtendrá más de 8 pines de salida. Uno de los registros de desplazamiento más populares es el 74HC595. Tiene registro de almacenamiento de 8 bits y registro de desplazamiento de 8 bits. Obtenga más información sobre los registros de turnos aquí.
Proporcionará datos en serie al registro de desplazamiento y se bloqueará en el registro de almacenamiento y luego el registro de almacenamiento controlará las 8 salidas. Si desea más salida, simplemente agregue otro registro de desplazamiento. Al conectar en cascada dos registros de desplazamiento, obtendrá 8 salidas adicionales, una salida total de 16 bits.
Registro de cambios 74HC595:
Aquí está el diagrama de pines del 74HC595 según la hoja de datos-
HC595 tiene 16 pines; si vemos la hoja de datos entenderemos las funciones de los pines-
El QA a QH, de los números de pin 1 a 7 y 15 se usa como salida de 8 bits del registro de desplazamiento, mientras que el pin 14 se usa para recibir los datos en serie. También hay una tabla de verdad sobre cómo usar otros pines y aprovechar otras funciones del registro de desplazamiento.
Cuando escribamos el código para interconectar el 74HC595, aplicaremos esta tabla de verdad para obtener los resultados deseados.
Ahora, conectaremos 74HC595 con PIC16F877A y controlaremos 8 LED. Hemos interconectado el registro de desplazamiento 74HC595 con otros microcontroladores:
- Interfaz del registro de cambio en serie 74HC595 con Raspberry Pi
- ¿Cómo usar Shift Register 74HC595 con Arduino Uno?
- Interfaz de LCD con NodeMCU mediante registro de desplazamiento
Componentes requeridos:
- PIC16F877A
- Condensadores de disco cerámico de 2 piezas 33pF
- 20Mhz de cristal
- Resistencia de 4.7k
- LED de 8 piezas
- Resistencia de 1k -1 pieza (se requieren 8 resistencias de 1k si se necesitan resistencias separadas en cada LED)
- 74HC595 ic
- Adaptador de pared de 5V
- Entorno de programación PIC
- Protoboard y alambres
Diagrama de circuito:
En el diagrama de circuito, hemos conectado el pin de datos en serie; pin de reloj y estroboscópico (pestillo) en el pin RB0, RB1 y RB2 del microcontrolador , respectivamente. Aquí hemos utilizado una resistencia para 8 LED. Según la tabla de verdad, habilitamos la salida conectando el pin 13 de 74HC595 a tierra. El pin QH se deja abierto ya que no conectaremos otro 74HC595 con él. Nos inhabilitó de la bandera de entrada clara conectando el pin 10 del registro de desplazamiento con VCC.
El oscilador Crystal está conectado a los pines OSC del microcontrolador. PIC16F877A no tiene ningún oscilador interno. En este proyecto iluminaremos los led uno a uno de Q0 a Q7 utilizando el regulador de cambios.
Hemos construido el circuito en una placa de pruebas.
Explicación del código:
El código completo para controlar los LED con registro de desplazamiento se proporciona al final del artículo. Como siempre, necesitamos establecer los bits de configuración en el microcontrolador PIC.
#pragma config FOSC = HS // Bits de selección del oscilador (oscilador HS) #pragma config WDTE = OFF // Bit de habilitación del temporizador de vigilancia (WDT deshabilitado) #pragma config PWRTE = OFF // Bit de habilitación del temporizador de encendido (PWRT deshabilitado) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR habilitado) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (el pin RB3 / PGM tiene función PGM; bajo -programación de voltaje habilitada) #pragma config CPD = OFF // Bit de protección de código de memoria EEPROM de datos (protección de código EEPROM de datos desactivada) #pragma config WRT = OFF // Bits de habilitación de escritura de memoria de programa flash (protección de escritura desactivada; toda la memoria de programa puede ser escrito por el control EECON) #pragma config CP = OFF // Bit de protección de código de memoria de programa flash (protección de código desactivada)
Después de eso, declaramos la frecuencia de cristal que se requiere para el retraso y la declaración de pin-out para 74HC595.
#incluir
A continuación, declaramos la función system_init () para inicializar la dirección del pin.
vacío system_init (vacío) { TRISB = 0x00; }
Creamos el pulso de reloj y el pulso de pestillo usando dos funciones diferentes
/ * * Esta función habilitará el Reloj. * / void clock (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
y
/ * * Esta función parpadeará y habilitará el disparador de salida. * / void estroboscópico (vacío) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Después de estas dos funciones, declaramos la función data_submit (unsigned int data) para enviar datos en serie al 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; reloj(); } estroboscópico (); // Datos finalmente enviados }
En esta función aceptamos datos de 8 bits y enviamos cada bit utilizando dos operadores bit a bit, desplazamiento a la izquierda y operador AND. Primero cambiamos los datos uno por uno y averiguamos el bit exacto si es 0 o 1 usando el operador AND con 0x01. Cada dato es almacenado por el pulso de reloj y la salida de datos final se realiza usando el pulso de pestillo o estroboscópico. En este proceso, la salida de datos será MSB (Bit más significativo) primero.
En la función principal enviamos el binario e hicimos los pines de salida altos uno por uno.
system_init (); // El sistema se prepara mientras (1) { data_submit (0b00000000); __delay_ms (200); envío_de_datos (0b10000000); __delay_ms (200); envío_datos (0b01000000); __delay_ms (200); envío_de_datos (0b00100000); __delay_ms (200); envío_datos (0b00010000); __delay_ms (200); envío_datos (0b00001000); __delay_ms (200); envío_datos (0b00000100); __delay_ms (200); envío_datos (0b00000010); __delay_ms (200); envío_datos (0b00000001); __delay_ms (200); envío_datos (0xFF); __delay_ms (200); } volver; }
Así es como se puede usar un registro de desplazamiento para obtener más pines de E / S libres en cualquier microcontrolador para conectar más sensores.