// How many of the shift registers
#define NUM_SHIFT_REGS_74HC165 1
#define NUM_SHIFT_REGS_74HC595 1
const uint8_t num74hc165Pins = NUM_SHIFT_REGS_74HC165 * 8;
const uint8_t num74hc595Pins = NUM_SHIFT_REGS_74HC165 * 8;
// Define Connections to 74HC165
int dataIn = 2; // Q7 pin 09
int clockIn_clockOut = 3; // CP pin 02
int load =4; // PL pin 01
int clockEnable_lachSTCP = 5; // CE pin 15
// Define Connections to 74HC595
//int latchPin = 7; // ST_CP pin 12
int dataOut = 8; // DS pin 14
//int clkPin = 9; // SH_CP pin 11
int outputEnablePin = 10; // OE pin 13
// Read Button
int readButton = 11;
bool statusButton = 0;
bool startReadWrite = 0;
bool debug = 0;
byte data74hc165 = 0;
byte last74hc165 = 0;
byte data74hc595 = 0;
//byte last74hc595 = 0;
boolean registers[num74hc595Pins];
boolean enable = 0;
/////////////////////////////////////
void setup() {
Serial.begin(15200);
// Setup 74HC165 connections
pinMode(load, OUTPUT);
pinMode(clockEnable_lachSTCP, OUTPUT);
pinMode(clockIn_clockOut, OUTPUT);
pinMode(dataIn, INPUT);
// Setup 74HC595 connections
//pinMode(latchPin, OUTPUT);
pinMode(dataOut, OUTPUT);
//pinMode(clkPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
digitalWrite(outputEnablePin, LOW);
}
void writeRegisters(){
digitalWrite(clockEnable_lachSTCP, LOW);
for(int i = num74hc595Pins - 1; i >= 0; i--){
digitalWrite(clockIn_clockOut, LOW);
int val = registers[i];
digitalWrite(dataOut, val);
digitalWrite(clockIn_clockOut, HIGH);
}
digitalWrite(clockEnable_lachSTCP, HIGH);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
/////////////////////////////////////
void loop() {
setRegisterPin(0, HIGH);
setRegisterPin(3, HIGH);
setRegisterPin(4, LOW);
setRegisterPin(5, HIGH);
setRegisterPin(6, HIGH);
writeRegisters(); //MUST BE CALLED TO DISPLAY CHANGES
//Only call once after the values are set how you need.
if (statusButton != digitalRead(readButton) ){
startReadWrite = 1;
}
if (startReadWrite == 1) {
enable != enable;
digitalWrite(outputEnablePin, enable);
startReadWrite =0;
}
//delay(500);
}
/*
// Gravacao e Leitura Placa Rele DT_CH16
// Start
digitalWrite(clockEnable_lachSTCP, 0); // (Pin 15 Esp32) Conectado ao CI C04F (inversor sinal) e porta 01 74hc165 (em Low le os dados(paralela) para buffler) ****
// (Pin 15 Esp32) To Low (Storage register 595 desativa e CLOCK INHIBIT 165 desativa)
// relay out to '595
for ( int i = num74hc595Pins ; i > 0 ; i-- ) {
digitalWrite(dataOut, data74hc595 & 1); // (Pin 13 Esp32) "outputs & 1" Operador AND Bitwise(&) se ambas entradas são 1, a saída resultante é 1, do contrário o resultado é 0. **** "outputs" variavel tipo bit saida
data74hc595 >>= 1; // "outputs >>= 1" Operador de deslocamento à direita(>>) o número '1' depois dele especifica o quanto ele deve ser deslocado.
// generate CLK pulse
digitalWrite(clockIn_clockOut, 1); // (Pin 14 Esp32) Clock de subida High para ler proximo bit.
digitalWrite(clockIn_clockOut, 0); // (Pin 14 Esp32) Clock Low estaciona bit.
}
// ending
digitalWrite(clockEnable_lachSTCP, 1); // (Pin 15 Esp32) to High (Storage register ativa os dados da saida paralela do 595 e CLOCK INHIBIT 165 ativa)
// input from '165
for ( int i = num74hc165Pins ; i > 0 ; i-- ) {
data74hc165 |= digitalRead(dataIn) ? last74hc165 : 0; // (Pin 14 Esp32) **** "in_bit" variavel tipo bit entrada
last74hc165 <<= 1; // "outputs <<= 1" Operador de deslocamento à esquerda(<<) o número '1' depois dele especifica o quanto ele deve ser deslocado.
// generate CLK pulse
digitalWrite(clockIn_clockOut, 1); // (Pin 14 Esp32) Clock de subida High para ler proximo bit.
digitalWrite(clockIn_clockOut, 0); // (Pin 14 Esp32) Clock Low estaciona bit.
}
if (statusButton != digitalRead(readButton) ){
startReadWrite = 1;
}
if (startReadWrite == 1) {
// Get data from 74HC165
read74hc165();
// Set data to 74HC595
write74hc595();
}
if (debug) printDebug();
delay(500);
}
void read74hc165() {
// Get data from 74HC165
digitalWrite(clockEnable_lachSTCP, HIGH);
digitalWrite(load, LOW);
digitalWrite(clockEnable_lachSTCP, LOW);
digitalWrite(load, HIGH);
// Read dataIn and write data74hc165
Serial.print("Reading 74hc165: ");
for (int b = num74hc165Pins -1; b >= 0; b--) {
int bit = digitalRead(dataIn);
if (bit == HIGH) {
Serial.print("1");
bitWrite(data74hc165,b,HIGH);
} else {
Serial.print("0");
bitWrite(data74hc165,b,LOW);
}
digitalWrite(clockIn_clockOut, HIGH); // Shift out the next bit
digitalWrite(clockIn_clockOut, LOW);
}
if (data74hc165 != last74hc165) {
for (int b = num74hc165Pins -1; b >= 0; b--) {
if (bitRead(data74hc165, b) != bitRead(last74hc165, b)) {
int pressed = bitRead(data74hc165, b);
if (pressed) {
bool data = (false == bitRead(data74hc595, b))?HIGH:LOW;
bitWrite(data74hc595, b, data);
Serial.print(" Altered Position: "); Serial.print(b+1);
Serial.print(" Data: "); Serial.print(data);
startReadWrite = 0;
}
}
}
last74hc165 = data74hc165;
}
}
void write74hc595() {
// ST_CP LOW to keep LEDs from changing while reading serial data
//if (data74hc595 != last74hc595) {
// Shift out the bits
shiftOut(dataOut, clockIn_clockOut, LSBFIRST, data74hc595);
Serial.println(" Writing 74hc595 ");
// ST_CP HIGH change LEDs
digitalWrite(clockEnable_lachSTCP, HIGH);
digitalWrite(load, LOW);
digitalWrite(clockEnable_lachSTCP, LOW);
digitalWrite(load, HIGH);
//last74hc595 = data74hc595;
//}
}
void printDebug() {
//Print data74hc165 byte
//for (int b = 7; b >= 0; b--) Serial.print(bitRead(data74hc165, b));
Serial.print("Data 74HC595: ");
for (int b = num74hc595Pins -1; b >= 0; b--) Serial.print(bitRead(data74hc595, b));
Serial.print(" Dec: ");
Serial.print(data74hc595, DEC);
Serial.println();
}*/