아두이노/이론

아두이노 shiftOut함수 알아보기

원원 2022. 12. 26. 23:43

안녕하세요. 오늘은 아두이노에있는 shiftOut함수에 대해 알아보겠습니다.

shiftOut함수는  1바이트가 있으면 1바이트를 8비트로 쪼개서 HIGH/LOW로 출력해줍니다. HIGH/LOW로 출력할때 clock도 같이 보내줍니다.
예를들어 0x44를 shiftOut함수 태우면 HIGH/LOW로 01000100(MSB FIRST) or 00100010(LSB FIRST)가 나옵니다. 

위의 파형은 0x44를 shiftOut함수를 태운 01000100(MSB FIRST) 입니다. 파형만 봐서는 01000100인지 00100010인지 구분이 안됩니다. 그래서 HIGH / LOW마다 clock을 같이 출력해줍니다

clock가 표시가되므로 01000100이란걸 알 수 있습니다

함수 void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
shiftOuit함수는 출력핀이 두개 필요합니다. 데이터를 출력해줄 dataPin핀, 클럭을 출력해줄 clockPin.
그리고 출력할 data가 MSB FIRST인지, LSB FIRST인지 구분을 해줘야하는데 그건 bitOrder로 해줍니다.
MSB FIRST는 MSBFIRST (1)로 define되어있고 LSB FIRST는 LSBFIRST (0)으로 define되어있습니다.
0x44와같은 데이터는 val변수에 넣어주면 됩니다.

int clockPin = 5;
int dataPin = 4;

void setup() 
{
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);
}
void loop() 
{
  shiftOut(dataPin,clockPin,MSBFIRST,0x44); //0b01000100
  delay(100);
}

위의 코드를 실행하면 파형이 아래처럼 나옵니다

 

------------------
shiftOut함수는 wiring_shift.c에 정의되어있습니다.

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}