Poniżej przykładowy kod do Arduino obsługujący rejestr szeregowy 74HC165. Jest to rejestr typu paraller In – serial Out – umożliwia odczyt stanów 8 wejść cyfrowych poprzez protokół SPI. Po drobnej modyfikacji kod może posłużyć do komunikacji z kontrolerami do gier Nintendo NES oraz SNES. Są one oparte o podobny układ CMOS 4021. Kontroler NES zawiera jeden rejestr, natomiast SNES – 2, co daje 16 bitów (nie wszystkie są wykorzystane). Ponieważ przyciski zwierają wejścia typu pull-up do masy, kontroler bez wciśniętych przycisków wysyła same jedynki. Jeżeli w naszym układzie wejście DATA złącza połączymy przez rezystor np. 1MΩ do masy, pozwoli to na wykrycie czy kontroler jest podpięty – niepodłączenie prześle same zera.
//Connect IC to the Arduino: #define HC165CLK 3 //Pin 2 of 74HC165, CLK #define HC165LD 4 //Pin 1 of 74HC165, SH/~LD #define HC165D 5 //Pin 9 if 74HC165, Qh void setup() { Serial.begin(9600); pinMode(HC165CLK, OUTPUT); pinMode(HC165LD, OUTPUT); pinMode(HC165D, INPUT); } void loop() { Serial.println(hc165ReadByte(),2); //Print readout in binary format delay(100); } byte hc165ReadByte(void){ byte data=0; digitalWrite(HC165LD, LOW); //delay(1); digitalWrite(HC165LD, HIGH); for(byte i=0; i<8;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; } byte NESReadByte(void){ /* * Bit order (from LSB to MSB): * 0: A * 1: B * 2: Select * 3: Start * 4: Up * 5: Down * 6: Left * 7: Right */ byte data=0; digitalWrite(HC165LD, HIGH); //delay(1); digitalWrite(HC165LD, LOW); for(byte i=0; i<8;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; } uint16_t SNESReadByte(void){ /* * Bit order (from LSB to MSB): * 0: B * 1: Y * 2: Select * 3: Start * 4: UP * 5: DOWN * 6: LEFT * 7: RIGHT * 8: A * 9: X * 10: L trigger * 11: R trigger * 12: ? * 13: ? * 14: ? * 15: ? */ uint16_t data=0; digitalWrite(HC165LD, HIGH); //delay(1); digitalWrite(HC165LD, LOW); for(byte i=0; i<16;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; }