//By NMD weerasinghe COTMD
// To demonstrate Serial In Parallel Out (SIPO) Shift Register and
// Parallel in Serial Out (PISO) Shift Registor
#define ClkDelay 500 //delay in milliseconds of each half of clock pulse
#define ClockPin 2
#define SerialDataPin 3
#define LatchPin 4
#define PISOClkEn 5 // Piso Clock enable active low
#define PISOPrllLoad 6 // PISO Parallel Load active Low
#define Maxbit 7
#define printEnable 0 // if 1 enable Serial print debug details
void sendSerialdata(int fpattern, bool order);
void sendClockpulse(int NoOfPulse);
void LoadSIPOandRun();
int pattern = 0b10101010;
int mask = 0b0000001;
//int Maxbit = 7;
void setup() {
pattern = 0b11100100;
pinMode(ClockPin, OUTPUT);
pinMode(SerialDataPin, OUTPUT);
pinMode(LatchPin, OUTPUT);
pinMode(PISOClkEn, OUTPUT);
pinMode(PISOPrllLoad, OUTPUT);
Serial.begin(9600);
if(printEnable) Serial.begin(9600);
delay(1000);
digitalWrite(ClockPin,LOW); // clock pin to low initially
digitalWrite(PISOClkEn,HIGH); // disable SIPO clock pin initially
digitalWrite(PISOPrllLoad,HIGH);// disable SIPO parallel load pin initially
//sendClockpulse(8);
sendSerialdata(pattern,false); // true left to right false right to left to SIPO
delay(ClkDelay*3);
//LoadSIPOandRun();
sendSerialdata(pattern,true); // to SIPO
delay(ClkDelay*3);
}
void loop() {
// put your main code here, to run repeatedly:
}
void LoadSIPOandRun()
{
digitalWrite(PISOClkEn,LOW); // enable SIPO clock pin
digitalWrite(PISOPrllLoad,LOW);// enable SIPO parallel load pin
sendClockpulse(8);
digitalWrite(PISOClkEn,HIGH); // disable SIPO clock pin
digitalWrite(PISOPrllLoad,HIGH);// disable SIPO parallel load pin
}
void sendSerialdata(int fpattern, bool order) //to SIPO
{
if(order) // left to right
{
for(int bitNo = 0; bitNo < Maxbit + 1; bitNo++ )
{
digitalWrite(LatchPin,LOW);
int pattern = fpattern >> bitNo;
bool bit = pattern & mask;
if(printEnable)
{
Serial.println(bit);
Serial.println(pattern,BIN);
}
digitalWrite(SerialDataPin,bit);
digitalWrite(ClockPin,HIGH);
delay(ClkDelay);
digitalWrite(ClockPin,LOW);
delay(ClkDelay);
digitalWrite(LatchPin,HIGH);
}
}
else // right to left
{
for(int bitNo = Maxbit; bitNo > -1; bitNo--)
{
digitalWrite(LatchPin,LOW);
int pattern = fpattern >> bitNo;
bool bit = pattern & mask;
if(printEnable)
{
Serial.println(bit);
Serial.println(pattern,BIN);
}
digitalWrite(SerialDataPin,bit);
digitalWrite(ClockPin,HIGH);
delay(ClkDelay);
digitalWrite(ClockPin,LOW);
delay(ClkDelay);
digitalWrite(LatchPin,HIGH);
}
}
}
void sendClockpulse(int NoOfPulse)
{
//Serial.println("Entclockpulse");
for (int i = 0 ; i < NoOfPulse; i++)
{
//Serial.println("clockpulse");
digitalWrite(ClockPin,HIGH);
delay(ClkDelay);
digitalWrite(ClockPin,LOW);
}
}