Rejestr szeregowy wejść 74HC165 i Arduino + NES + SNES

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;
}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.