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

0 일때 LED ON, 1일 때 LED OFF
DP G F E D C B A -> 이 순서로 동작
예를 들어 7을 나타내고 싶으면
1111 1000 = OXF8을 데이터로 보내면 된다
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번째 칸에 소수점 표시를 위한 점이 찍히도록 코드를 수정한다
