[임베디드 20강] FND 제어소스 분석

강지원·2024년 7월 25일

STM32 강의

목록 보기
20/33
post-thumbnail

소스 분석

1. 소스 시작점

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

보내고 싶은 한 바이트의 데이터를 보냄

선 2개 사용(DIO, SCLK)

SCLK의 한 주기마다 보내고 싶은 데이터를 HIGH, LOW로 보냄
만약 1001 1100 이면 HLLH HHLL 로 보낼 수 있다

-> 오실로스코프로 찍어보면 파형 확인 가능함
소프트웨어적으로 만든 파형이여서 파형간격이 완벽하진 않지만 작동은 잘 한다

2. Send port 함수

void send_port(uint8_t X, uint8_t port)
{
	send(X);
	send(port);
	HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin , LOW);
	HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin , HIGH);
}

데이터 8비트 + 포트 8비트 + RCLK 가 한번 LOW -> HIGH 면 작동한다

3. 7segment 키는 방법

0 일때 LED ON, 1일 때 LED OFF
DP G F E  D C B A -> 이 순서로 동작

예를 들어 7을 나타내고 싶으면
1111 1000 = OXF8을 데이터로 보내면 된다

4. FND 4칸 전부 숫자 표시하는 코드

void digit4_show(int n, int replay, uint8_t showZero)
{
  int n1, n2, n3, n4;
  n1 = (int)  n % 10;
  n2 = (int) (n % 100)/10;
  n3 = (int) (n % 1000) / 100;
  n4 = (int) (n % 10000) / 1000;

 for(int i = 0; i<=replay; i++){
	 send_port(_LED_0F[n1], 0b0001);
    if(showZero | n>9)send_port(_LED_0F[n2], 0b0010);
    if(showZero | n>99)send_port(_LED_0F[n3], 0b0100);
    if(showZero | n>999)send_port(_LED_0F[n4], 0b1000);
 }
}

표시할 숫자를 각 자리수로 나눠서 저장한 후 각 칸에 표시한다

온도센서 제어용으로 코드 수정

void digit4_temper(int n, int replay)
{
  int n1, n2, n3, n4;
  n1 = (int)  n % 10;
  n2 = (int) (n % 100)/10;
  n3 = (int) (n % 1000) / 100;
  n4 = (int) (n % 10000) / 1000;

 for(int i = 0; i<=replay; i++){
	 send_port(_LED_0F[n1], 0b0001);
     send_port((_LED_0F[n2] & 0x7F), 0b0010);
     send_port(_LED_0F[n3], 0b0100);
     send_port(_LED_0F[n4], 0b1000);
 }
}

3번째 칸에 소수점 표시를 위한 점이 찍히도록 코드를 수정한다

0개의 댓글