// SCLK
HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, LOW);
HAL_GPIO_WritePin(FND_SCLK_GPIO_Port, FND_SCLK_Pin, HIGH);
// HIGH 로 끝나므로 시작도 HIGH
// DO (DATA OUT)
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);
}
send(0xF8);
HAL_Delay(1000);
> 오실로스코프로 1111 1000 확인
//
1. send(0xF8);
2. send(0b0001); // b: binary 2진수 //
// 0b1000 : 세그먼트 4번째가 on
// 0b0100 : 세그먼트 3번째가 on
"
// 0b0001 : 세그먼트 1번째가 on
3. HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, LOW);
4. HAL_GPIO_WritePin(FND_RCLK_GPIO_Port, FND_RCLK_Pin, HIGH);
>> LOW 갔다가 HIGH 가 되면서 RCLK 작동
> 데이터 표시 확정
1.+ 2. > 16개bit 의 SCLK 에
1111 1000 0000 0001 // send
3. + 4. > 또다른 RCLK 가 SCLK 다끝나고 L > H
uint8_t X : X 가 low로 떨어져야 세그먼트 ON
1111 1000 : 0번, 1번, 2번 ON
__ // 0번
|__ | // 1번
|__ | . // 2번
가운데 -- : 6번
마지막 ' . ' : 7번
함수분석
for(int i=0; i<=9999;i++){
digit4_replay(i,50);
}
>
void digit4_replay(int n, int replay)
{
digit4_show(n,replay,false);
}
>
void digit4_show(int n, int replay, uint8_t showZero)
{
int n1, n2, n3, n4;
n1 = (int) n % 10; // 1의자리
n2 = (int) ((n % 100)-n1)/10; // 10의자리
n3 = (int) ((n % 1000) - n2 - n1) / 100; // 100의자리
n4 = (int) ((n % 10000) - n3 - n2 - n1) / 1000; // 1000의 자리
// 코드오류: n3-n2-n1 : *100, *10 *1 을 해주어야함
// > 사실 빼도 달라지진 않음 int 나누기 몫 게산 > 나머지가 버려짐
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);
}
}
digit4_show(n,replay,false);
> showZero == true > n이 어떤값이는 세그먼트 2번, 3번,4번이 켜짐
> showZero == false >
n>9 일때, n>99 일떄, n>999 일때여야 2번,3번,4번이켜짐
> bit OR 계산
replay : 보여주는 길이 // ~= Delay
replay = 1 > 1을 2번 하고 2, 2를 1번하고 3..
replay = 50 > 1을 51번 하고 2, 2를 51번하고 3..
>> replay 가 길수록 1~9 ~99 ~999 의 과정을 하나하나 다 볼 수 있음
전체과정!!
Start : main.c 에서 for문 i=0 > digit4_replay 함수 > digit4_show함수 > for문 replay 만큼 실행 .. 0이 51번 실행 > for문 종료
> digit4_show함수 종료 > digit4_replay 함수 종료 > mai.c 에서 for문 i++ (i=1) > end
다시 Start ,,,, 9999번 반복
앞으로 온도표시...
ex)
3000 > 300.0 도
22 > 2.2 도
1005 > 100.5 도
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);
}
}
>>>>
1. 최소가 0.1 이므로 두번째 자리까진 반드시 나와야함
send_port(_LED_0F[n1], 0b0001);
send_port(_LED_0F[n2], 0b0010);
2. 반드시 두번째 세그먼트 에는 ' . ' 이 찍혀야함
' . ' = 7번 (8번째) 자리 0111 1111 == 0x7F
_LED_0F[n2]의 값이
0xF9
0xA4
0xB0
....
>> 비트 AND 연산
1. 8번bit > 0 과 만나면 뭐가됐든 0 이 나옴
2. 세그먼트 ON 은 0 이되면 켜지도록 셋팅했음
>나머지 111 1111 을 and로 하면 그대로 나옴
ex) 0111 1111 : 0x7F
1111 1001 : 0xF9
------------
0111 1001
> 8번bit는 0 이나오면서 : 점 찍힘
나머지bit는 데이터값 그대로 나옴 2번bit 3번bit ON > 숫자 1