임베디드 용어설명

74HC595 / 74HC165 시프트레지스터(Shift Register)

젊은우산 2019. 3. 11. 13:46
반응형

조이스틱을 뜯어보던중 LED를 켜기위한 칩으로 74HC595가 있는 것을 확인

 

LED 하나를 켜기위해서 아두이노 디지털핀 하나를 사용하지만, LED가 8개라면? 디지털 핀 8개를 사용하면된다. 

하지만 16개 이상 혹은 그이상이 되면 디지털 출력핀의 수가 많아진다. 이 때 시프트 레지스터를 사용하게된다.

 

Serial to Parallel Converter 

시리얼(직렬) 로 입력되는 데이터를 패러렐(병렬)로 바꿔주는 소자이다. 

시프트 레지스터에게 데이터가 전달된다고 알려주는 클럭신호와 함께 8개의 핀 출력이 어떻게 되는지 알려주는 시리얼 데이터를

일렬로 보내준다. 첫번째 핀만 on시키고 싶다면, [1000 0000]을 보내면된다. 시프트 레지스터는 8개의 신호를 받아 8개의 핀을 신호에 맞게 출력해준다. 이런 방식으로 2개의 핀으로 8개 혹은 그 이상의 핀을 제어할 수 있다.(실제로는 제어선3개사용)

 

LED출력 뿐만아니라 수십개의 버튼 입력을 받을 때도 시프트레지스터를 사용할 수 있다. 버튼 입력을 받을 때는 동작이 반대로 된다. 

시프트 레지스터는 두개로 나뉘는데 (SIPO : Serial IN Parallel OUT)과, PISO(Parallel IN Serial OUT) 방식이다. 

 

74HC595 는 SIPO

 

74HC165 는 PISO

 

 

출처:http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2826

 

 

 

ESP32-WROOM 을 이용한 74HC165 실습. 8개의 버튼입력을 하나의 SO핀으로 보냄. 총 3개의 IO 핀사용

#define SO  36     // SO-Serial output
#define SH_LD  21  // SH/LD  of 74165  
#define CLK  19    // CLK of 74165 


// variables will change:
int i = 0;         // variable for reading 8-bit data
int PinState[8] = {0,};   //read the state of the SO pin
int Parallel_data = 0;//To store parallel data


void setup() 
{
  Serial.begin(115200);
  // initialize the SH_LD & CLK pin as an output:
  pinMode(SH_LD, OUTPUT);
  pinMode(CLK, OUTPUT);  


  // initialize the SO-Serial output pin as an input:
  pinMode(SO, INPUT); 
}
void loop()
{

  digitalWrite(CLK, LOW); 
  /*Parallel data that will be entered through D0 - D7 Pins of 74HC165  **/
  digitalWrite(SH_LD, LOW); 
  delay(5);
  /*******************  INHIBIT SECTION START HERE  *****************/
  digitalWrite(SH_LD, HIGH);
  /*******************  INHIBIT SECTION ENDS HERE ******************/
  /************** SERIAL SHIFT SECTION START HERE **********/ 
  //Read 8-bit data from 74HC165
  //Serial.print("Parallel Data:");
   for(i=0;i<8;i++)
    {  
      // 하나씩 버퍼로 저장시켜서, 버퍼값이 변할 때마다 버튼 입력으로 인식
        PinState[i] = digitalRead(SO);// read the state of the SO:
        digitalWrite(CLK, LOW);
        delay(1);
        digitalWrite(CLK, HIGH);
        delay(1);
        Parallel_data = (Parallel_data<<1)|PinState[i]; //Store the value in Parallel_data
    }
    Serial.print(PinState[0]);  // RIGHT
    Serial.print(PinState[1]);  // LEFT
    Serial.print(PinState[2]);  // SPD_UP
    Serial.print(PinState[3]);  // SPD_DOWN
    Serial.print(PinState[4]);  // LAMP
    Serial.print(PinState[5]);  // EMG
    Serial.print(PinState[6]);  // Buzzer
    Serial.print(PinState[7]);  // POWER
   Serial.println();
}

 

반응형