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.
![]() |
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.
![]() |
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();
}
}
![]() |
A snap shot of running program, The 74HC165 loads 0x0F. |
No comments:
Post a Comment