(( https://github.com/kostarev/TM74HC595-4dig-display/blob/master/TM74HC595Display.cpp
FND관련 깃헙 ))
VCC: 전력 공급
DIO: 직렬 데이터 입력
RCLK: 시계 맥박 신호
SCLK: 입력 시계 신호
GND: 지상
모듈을 제어할 때 사용하면 좋은 방법
1) 하드웨어 담당자에게 데이터시트 부탁하기
2) 모듈의 메인 칩의 이름을 찾는다
FND 메인칩 이름 : TM74HC595
pinMode(SCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(DIO, OUTPUT);
OUTPUT으로 설정되어 있는걸로 봐서 나도 OUTPUT으로 설정하면 되겠다.
🧧 SPI 관련해서 아주 잠깐 알아보자
SPI는 CLK(클럭)과 DIO(데이터)의 신호를 쏴줄 수 있다. CLK이 일정한 주기로 펄스를 보낸다면 DIO는 내가 원하는(SET, CLEAR)값을 담을 수 있다.
//아두이노 코드
void TM74HC595Display::send(unsigned char X)
{
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
digitalWrite(_DIO, HIGH); //STM32에선 DIO를 제어해주면 된다
}
else
{
digitalWrite(_DIO, LOW); //STM32에선 DIO를 제어해주면 된다
}
X <<= 1;
digitalWrite(_SCLK, LOW); //STM32에선 클럭을 제어한다.
digitalWrite(_SCLK, HIGH); //STM32에선 클럭을 제어한다.
}
}
//STM32로 재해석
void send(uint8_t X){ //unsigned char = uint8_t
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);
}
}
Q1 : 도대체 X는 어디서 온걸까?
A1 : digit2를 따라가보면 send_port가 나오는데, "send_port는 send_port(uint8_t X, uint8_t port)" 이렇게 생겼다. 즉 X는 _LED_0F[]의 배열이다.
(아마도 digit2의 n1, n2는 0~9를 맴돌면서 _LED_0F[]의 배열을 따라갈 것이다)
Q2 : 그렇다면 i는 어디에 쓰이는걸까?
A2 : 내가 보내고자 하는 X(8bit)를 i를 이용하여 8번 쪼갠다음 DIO(데이터)를 보내겠다는 뜻이다. 0x80와 X가 일치하다면 HIGH를 보내고, 0x80과 X가 일치하지 않는다면 LOW를 보낸다. (SPI는 8비트를 이용해 통신하기 때문)