Sunday, May 31, 2020

Interfacing a parallels in serial out shift register to PIC16F887 via digital pins

A digital IC, 74HC165 is a parallel in serial out shift registers. It has 8 parallel input and one serial output. It's commonly used for inputs expanding when the controller run out of digital I/O. It's communication interface's just like an SPI protocol. But without using the SPI module of the MCU, we can use software emulation to function an SPI-like protocol.


Interfacing a parallel in serial out shift register to PIC16F887 via digital pins
Pins diagram

Interfacing a parallel in serial out shift register to PIC16F887 via digital pins
Timing diagram of 74HC165

The load pin used for loading the 8-bit parallel inputs D0 to D7. The clock pin used for scanning all the inputs and shift them out serially via Serial Out pin.


Interfacing a parallel in serial out shift register to PIC16F887 via digital pins
The 74HC165 clock pin connects to RE0. The load pin connects to RE1.
And the serial out pin connects to RE2. PortD represents the digital data.

Source code:

#include<xc.h>
// PIC16F887 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
char serialRead(){
    char read=0,temp=0;
    /*Raise load pin*/
    RE1=1;
    for(int i=0;i<8;i++){
        /*Shift data left*/
        temp<<=1;
        /*if serial out high
         set read high*/
        read=((RE2==1)?1:0);
        /*clock pulse*/
        RE0=0;
        for(int k=0;k<100;k++);
        RE0=1;
        /*load data into variable*/
        temp|=read;      
    }
    /*Lower load pin*/
    RE1=0;
    return temp;
}
void main(){
    /*Port configuration*/
    PORTD=0x00;
    PORTE=0x00;
    TRISD=0x00;
    TRISE=0x04;
    /*Clear analog function
     on PortE*/
    ANSEL=0x00;
    while(1){
        /*Read the digital inputs*/
        PORTD=serialRead();
    }
}

Interfacing a parallel in serial out shift register to PIC16F887 via digital pins
A snap shot of running program, The 74HC165 loads 0x0F.


No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)