74LS165 kaskade

Hallo zusammen,

ich bin neu hier im Forum und ein absoluter Anfänger was das Thema Programmierung und Elektronik angeht. Ich verfahre hier einfach nach dem Motto "Probieren geht über studieren" :smiley:
Nun habe ich aber ein Problem, bei dessen Lösung ich alleine nicht mehr weiter komme und da hoffe ich auf entsprechende Hilfe hier im Forum zu bekommen.

Folgende Problematik:
Ich möchte den Schaltzustand von 16 Tastern abfragen. Dafür habe ich mir das 74LS165 IC herausgesucht und steuere über meinen Arduino Uno und ein entsprechendes Programm diesen Baustein an.

#include <SPI.h>

enum { REG_LATCH = 8 };


void setup()
{
    Serial.begin(9600);
  SPI.begin();
  pinMode(REG_LATCH, OUTPUT);
  digitalWrite(REG_LATCH, HIGH);
}


void loop()
{
  static uint8_t last_input_states = 0;

   digitalWrite(REG_LATCH, LOW);
  digitalWrite(REG_LATCH, HIGH);
  
  uint8_t states = SPI.transfer(0);

    if (states != last_input_states)
  {
        uint8_t changed = states ^ last_input_states;
    last_input_states = states; 

    for (int i = 0; i < 8; ++i)
    {
      if (changed & 1) 
      {
        Serial.print("#");
        Serial.print(i); 
        Serial.print(" -> ");
        Serial.println(states & 1); 
      }

            changed >>= 1;
      states >>= 1;
    }
  }
}

Das funktioniert auch genau so wie ich es mir vorstelle aber nur für 8 Taster.
Nun ist mein Problem, wie ändere ich diesen Code so ab, das ich zwei Schieberegister abfragen kann.
Die Hardwareumsetzung habe ich schon entsprechend umgesetzt.
Kann mir hier jemand helfen und das mal für einen Dummie erklären oder noch besser umsetzen?
Und eins vorweg, ich habe in den letzten Tagen alle möglichen Seiten im Internet durchstöbert.
Entweder war ich nicht in der Lage das umzusetzten was dort beschrieben war oder ich habe dann vielleicht doch nicht die richtigen seiten gefunden :confused:

Herzlichen Dank

Hallo,
das die Leute immer zu faul zum suchen sind...
Gruß und Spaß
Andreas

Ein weiterer Aufruf

  uint8_t upperStates = SPI.transfer(0);

sollte dir die nächsten 8 Bit liefern.
Ich hätte wahrscheinlich eher shiftIn benutzt.

Ich würde aber nicht die LS Familie verwenden sondern die HC als 74HC165.
Grüße Uwe

SkobyMobil:
Hallo,
das die Leute immer zu faul zum suchen sind...
Gruß und Spaß
Andreas

Hallo Andreas,
danke für den Link aber den hatte ich auch schon gefunden. Ich wollte aber einen Code verwenden der über SPI funktioniert.

Ich wollte aber einen Code verwenden der über SPI funktioniert.

Kannst ja auch machen....

Tipp:
Wer 2 Byte lesen will, sollte das dann auch tun.

uwefed:
Ich würde aber nicht die LS Familie verwenden sondern die HC als 74HC165.
Grüße Uwe

Hallo Uwe,

wie bereits erwähnt habe ich nicht die große Ahnung in Bezug auf Programmieren und Elektronik.
Daher interessiert es mich natürlich warum du lieber die HC Familie bevorzugst.

Gruß Uwe

Whandall:
Ein weiterer Aufruf

  uint8_t upperStates = SPI.transfer(0);

sollte dir die nächsten 8 Bit liefern.
Ich hätte wahrscheinlich eher shiftIn benutzt.

Hallo und herzlichen Dank für den entscheidenden Tip, nun klappt es.

Der Unterschied sind die vor allem die Schaltschwellen und der Eingangsstromverbrauch.
Grüße Uwe