모듈 구성
: 메인칩 + 필요한 최소한의 회로
(쪽보드)
제어 단계
1. 칩, 부품 모델명 확인 : TM74HC595 , 7세그먼트
2. 데이터시트 구글링
1) TM74HC595
2) 모듈 자체의 데이터시트
QA , QB, QC ,,, 찾는법
1) 모듈 데이터시트
2) 쇼트테스트
3) 남이 정리한것 찾기
4) 샘플 코드를 구해서, 일단 동작시키고
> 그다음 추리
구글에 칩 sample code 검색..
@
STI 통신
CLK > DI( data )
클럭을 기준으로 데이터를 보냄
GPIO3개 outut > CLK, DATA Input , DATA output
@
cpp 코드 > stm 으로 변환 해석
void TM74HC595Display::send(unsigned char X)
{
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
digitalWrite(_DIO, HIGH);
}
else
{
digitalWrite(_DIO, LOW);
}
X <<= 1;
digitalWrite(_SCLK, LOW);
digitalWrite(_SCLK, HIGH);
}
}
>>>>>>>
void send(uint8_t x) {// unsigned 8bit ( char == 1byte )
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. if 문 > X & 0x80 ( 0x80 == 1000 0000 )
// 8번째 bit 가 1일때만 if문 통과
2. X<< 1 // 1칸 왼쪽 시프트
8개의 비트를 모두 확인
3. 클럭 LOW > HIGH 로 끝나므로 평소에 HIGH 유지
> 1 or 0 으로 셋팅후 클럭을 LOW > HIGH 로 바꾸면서 값 입력
CPP
// 이름 중복가능
void TM74HC595Display::send(unsigned char X, unsigned char port)
{
send(X);
send(port);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
}
C
// 이름 중복 불가
>>>>>>>>>>>>
void send_port(unsigned char X, unsigned char 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);
}
void TM74HC595Display::send(unsigned char X)
{
for (int i = 8; i >= 1; i--)
{
if (X & 0x80)
{
digitalWrite(_DIO, HIGH);
}
else
{
digitalWrite(_DIO, LOW);
}
X <<= 1;
digitalWrite(_SCLK, LOW);
digitalWrite(_SCLK, HIGH);
}
}
void TM74HC595Display::send(unsigned char X, unsigned char port)
{
send(X);
send(port);
digitalWrite(_RCLK, LOW);
digitalWrite(_RCLK, HIGH);
}
void TM74HC595Display::digit4(int n, int replay, bool showZero)
{
int n1, n2, n3, n4;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
n3 = (int) ((n % 1000) - n2 - n1) / 100;
n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000;
for(int i = 0; i<=replay; i++){
send(_LED_0F[n1], 0b0001);
if(showZero | n>9)send(_LED_0F[n2], 0b0010);
if(showZero | n>99)send(_LED_0F[n3], 0b0100);
if(showZero | n>999)send(_LED_0F[n4], 0b1000);
}
}
void TM74HC595Display::digit4(int n, int replay)
{
digit4(n,replay,false);
}
void TM74HC595Display::digit4(int n)
{
digit4(n,0,false);
}
void TM74HC595Display::digit4showZero(int n, int replay)
{
digit4(n, replay, true);
}
void TM74HC595Display::digit4showZero(int n)
{
digit4(n, 0, true);
}
void TM74HC595Display::digit2(int n, int port, int replay)
{
int n1, n2;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
for(int i = 0; i<=replay; i++){
send(_LED_0F[n1], port);
send(_LED_0F[n2], port<<1);
}
}
void TM74HC595Display::digit2(int n, int port)
{
digit2(n, port, 0);
}
>>>>
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);
}
}
void send_port(unsigned char X, unsigned char 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);
}
void digit4_show(int n, int replay, uint8_t showZero)
{
int n1, n2, n3, n4;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
n3 = (int) ((n % 1000) - n2 - n1) / 100;
n4 = (int) ((n % 10000) - n3 - n2 - n1) / 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_replay(int n, int replay)
{
digit4_show(n,replay,false);
}
void digit4(int n)
{
digit4_show(n,0,false);
}
void digit4showZero_replay(int n, int replay)
{
digit4_show(n, replay, true);
}
void digit4showZero(int n)
{
digit4_show(n, 0, true);
}
void digit2(int n, int port, int replay)
{
int n1, n2;
n1 = (int) n % 10;
n2 = (int) ((n % 100)-n1)/10;
for(int i = 0; i<=replay; i++){
send_port(_LED_0F[n1], port);
send_port(_LED_0F[n2], port<<1);
}
}
void digit2_port(int n, int port)
{
digit2(n, port, 0);
}
// 0b0010 > 0b : 2진수 나타내기위함, 값x
// == 0000 0010
헤더파일에서는 함수 이름만
.c 파일에서 함수구현
>
main.c 에서 include 한다음 함수에 값을 잘 넣어 활용