FND 소스 분석(1)

김지성·2022년 7월 25일
1

Embedded

목록 보기
12/19
post-thumbnail

1.1 기본 설정

TM74HC595Display::TM74HC595Display(int SCLK, int RCLK, int DIO)
{
  pinMode(SCLK, OUTPUT);		//GPIO를 OUPUT으로 설정했음
  pinMode(RCLK, OUTPUT);
  pinMode(DIO, OUTPUT);
  
  _SCLK = SCLK;
  _RCLK = RCLK;
  _DIO = DIO;
  
  _LED_0F[0] = 0xC0; //0
  _LED_0F[1] = 0xF9; //1
  _LED_0F[2] = 0xA4; //2
  _LED_0F[3] = 0xB0; //3
  _LED_0F[4] = 0x99; //4
  _LED_0F[5] = 0x92; //5
  _LED_0F[6] = 0x82; //6
  _LED_0F[7] = 0xF8; //7
  _LED_0F[8] = 0x80; //8
  _LED_0F[9] = 0x90; //9
  _LED_0F[10] = 0x88; //A
  _LED_0F[11] = 0x83; //b
  _LED_0F[12] = 0xC6; //C
  _LED_0F[13] = 0xA1; //d
  _LED_0F[14] = 0x86; //E
  _LED_0F[15] = 0x8E; //F
  _LED_0F[16] = 0xC2; //G
  _LED_0F[17] = 0x89; //H
  _LED_0F[18] = 0xF9; //I
  _LED_0F[19] = 0xF1; //J
  _LED_0F[20] = 0xC3; //L
  _LED_0F[21] = 0xA9; //n
  _LED_0F[22] = 0xC0; //O
  _LED_0F[23] = 0x8C; //P
  _LED_0F[24] = 0x98; //q
  _LED_0F[25] = 0x92; //S
  _LED_0F[26] = 0xC1; //U
  _LED_0F[27] = 0x91; //Y
  _LED_0F[28] = 0xFE; //hight -
}

1.2 첫 번째 send 분석

//Aduino ver.

void TM74HC595Display::send(unsigned char X)
{

  for (int i = 8; i >= 1; i--)
  {
    if (X & 0x80)
    {
      digitalWrite(_DIO, HIGH);		// DIO를 HIGH로 높여주겠다.
    }
    else
    {
      digitalWrite(_DIO, LOW);		// DIO를 LOW로 낮춰주겠다.
    }
    X <<= 1;
    digitalWrite(_SCLK, LOW);		// SCLK를 LOW로 낮춰주겠다.
    digitalWrite(_SCLK, HIGH);  	// SCLK를 HIGH로 높여주겠다.
  }
}
								∨∨∨∨∨∨∨∨∨∨∨∨∨
//STM32 ver.

void send(uint8_t X){

  for (int i = 8; i >= 1; i--)
  {
	if (X & 0x80)
	{
	  HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, HIGH);
	}
	else
	{
		HAL_GPIO_WritePin(FND_DIO_GPIO_Port, FND_DIO_Pin, LOW);
	}
	X <<= 1;
	HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
	HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);
  }
}

1.2.1 if(X & 0x80) 이해하기

unsigned int = X이고, X=52일 경우 이진수를 비트로 나타내면 0b01010010로 나타낼 수 있다. 0x80은 0b10000000이다. 이때 두 값을 "&"한다면 0이 나온다. 결과적으로 else문을 수행하게 될 것이고, 1이 나온다면 if문을 수행할 것이다.

1.2.2 X <<=1 이해하기

X=52일 경우 왼쪽으로 1씩 쉬프트한다면 0b10100100이 나오고, 다시 0b10000000와 "&"연산을 한다면 값은 1이 나올 것이다.

1을 출력하기 위해서는 10진수로 128이 되야하고, 0을 출력하기 위해서는 10진수로 0이 되야한다.

결과적으로 unsigned int값(1Byte)을 8bit로 쪼갬으로써 원하는 펄스를 만들어내겠다는 의도이다. (SPI통신이 8bit 단위로 움직이기 때문에 8bit로 쪼갠걸로 예측된다.)

1.2.3 SCLK 이해하기

LOW와 HIGH를 반복적으로 펄스를 보내다가 마지막에는 HIGH로 끝나는걸 알 수 있다.

Datasheet를 보면 HIGH로 시작하는걸 볼 수 있다. 평상시에는 HIGH로 유지되야 한다는 뜻이다. 코드에서도 LOW와 HIGH를 반복하다가 for문이 끝날때 다시 HIGH로 올려준걸 볼 수 있다.
(HIGH로 시작하는지 LOW로 시작하는지는 Datasheet를 봐야지만 알 수 있다.)


1.3 FND 돌려보기

  while (1)
  {
	  for(int i = 0; i<=99; i++){
		  digit2(i, 0b0001, 50);
	  }

	  for(int i = 0; i<=100; i++){
		  digit4showZero_replay(i, 50);
	  }


	  for(int i = 0; i<=9999; i++){

		  digit4_replay(i, 50);}
   		  //digit4showZero_replay=digit4_replay
 }

다음 글에서 더 자세하게 소스를 분석해보도록 한다.

profile
JUST DO IT

0개의 댓글