/*
* pin #10 = LATCH CS(chip select), SS(slave select), P12_595(ST_CP), P1_165(PL).
* pin #11 = MOSI (Master-out, slave-in), P14_595(DS).
* pin #12 = MISO (Master-in, slave-out), P9_165(Q7).
* pin #13 = CLOCK (SCK), P11_595(SH_CP), P2_165(CP).
*
* https://forum.arduino.cc/t/reading-74hc165-shift-registers-via-spi/394520
* https://www.forosdeelectronica.com/threads/protocolo-spi-emulado-por-software-bit-banging.180720/
* https://circuitdigest.com/article/introduction-to-bit-banging-spi-communication-in-arduino-via-bit-banging
* https://forum.arduino.cc/t/spi-bitbang-vs-spi-library/135298/6
* https://wokwi.com/projects/348888474188776020
*
*/
#include <SPI.h>
uint8_t latch = 10;
uint8_t inp;
uint8_t out;
void setup() {
Serial.begin (115200);
pinMode (latch, OUTPUT);
SPI.begin ();
//SPI.setDataMode (SPI_MODE3);
}
void loop () {
digitalWrite (Load, LOW); //load the push button state into the 74HC165
asm("nop\n nop\n"); //some delay
digitalWrite (Load, HIGH);
digitalWrite (SSin, LOW); //enable 74HC165 clock
asm("nop\n nop\n"); //some delay
byte Switches = SPI.transfer(0); //get the position
digitalWrite (SSin, HIGH); //disable 74HC165 clock
digitalWrite (latch, HIGH);
inp = SPI.transfer(0);
digitalWrite (latch, LOW);
Serial.println(inp);
SPI.transfer(inp);
delay(200);
/*
digitalWrite (latch, LOW);
delayMicroseconds(10);
digitalWrite (latch, HIGH);
*/
;
}
/*
```
const int pin_STCP = 10; // Latch
const int pin_SHCP = 9; // Clock
const int pin_DS = 8; // Datos
const int pin_Q7 = 7; // Salida del 74HC165
void setup() {
pinMode(pin_STCP, OUTPUT);
pinMode(pin_SHCP, OUTPUT);
pinMode(pin_DS, OUTPUT);
pinMode(pin_Q7, INPUT);
}
void loop() {
// Enviar datos al 74HC595
digitalWrite(pin_STCP, LOW); // Latch baja
shiftOut(pin_DS, pin_SHCP, MSBFIRST, 0x01); // Enviar datos
digitalWrite(pin_STCP, HIGH); // Latch alta
// Leer datos del 74HC165
digitalWrite(pin_SHCP, LOW); // Clock baja
byte datos = shiftIn(pin_Q7, pin_SHCP, MSBFIRST); // Leer datos
digitalWrite(pin_SHCP, HIGH); // Clock alta
Serial.println(datos, BIN);
delay(100);
}
```
74HC595 y 74HC165.
MOSI (SERO ; serial output que va al 74HC595)
CLOCK (SRCK ; shift clock)
LATCH (RCK ; output latch y/o paralell load)
MISO (SERI ; serial input que viene del 74HC165)
OUT (PUERTO As Byte)
INP (DATO As Byte)
DO
// se mandan los datos de manera serial a los 74HC595
SHOut SERO, SRCK, MsbFirst, [PUERTO]
// SHOUT: Synchronous serial output (SHIFT OUT) (for SPI interfaces).
// se envia el pulso para activar el latch del 74hc595 y a la ves OBTENER los datos del 74HC165
PulsOut RCK,8
// PULSOUT: Generate pulse to a pin. (PULSEOUT also allowed).
// se reciben los datos de manera serial de los 74HC165
SHIn SERI, SRCK, MsbPre,[DATO]
// SHIN: Synchronous serial input (SHIFT IN) (for SPI interfaces).
PUERTO=DATO
HSerOut ["Dato=",Dec3 DATO, 13,0]
// HSEROUT: Transmit data to the serial port on devices that contain a USART.
// hacemos una pausa solo para efecto de demostracion del presente programa, pero no es necesario
DelayMS 250
// Esta función realiza retardos del valor especificado. Dicho valor de tiempo es en milisegundos y el rango es 0-65535 sirve para obtener retardos // más largos así como retardos ‘variables’.
GoTo inicio
uint8_t inp_0;
uint8_t inp_1;
uint8_t out_0;
uint8_t out_1;
void loop() {
digitalWrite(latch, LOW); // Latch baja
byte datos = SPI.transfer(datos); // Enviar datos y leer respuesta
digitalWrite(latch, HIGH); // Latch alta
Serial.println(datos, BIN);
delay(100);
}
#include <SPI.h>
uint8_t latch = 10;
uint8_t inp;
uint8_t fila[8] = {0};
void setup() {
Serial.begin (115200);
pinMode (latch, OUTPUT);
SPI.begin ();
}
void loop () {
for (uint8_t i = 0; i < 8; i++) {
digitalWrite (latch, LOW);
SPI.transfer(inp);
SPI.transfer(1 << i);
digitalWrite (latch, HIGH);
digitalWrite (latch, LOW);
}
for (uint8_t i = 0; i < 8; i++) {
Serial.print(i + 1);
Serial.print(": ");
Serial.print(fila[i]);
Serial.println();
}
delay(500);
}
*/