|
my_fnd_lib.h 파일 최종 버전 입니다.
#ifndef _my_fnd_lib_
#define _my_fnd_lib_
// Arduino 멀티펑션보드 FND 핀 신호 = 74hc595 사용 = 2022, 10, 18
#define S_data 8 // d8
#define S_clk 7
#define L_clk 4 //d4
// fnd scan define
#define x1000 8 // D8
#define x100 9
#define x10 10
#define x1 11 // d11
// fnd font data K-컴몬기준
const unsigned char fnd_font[] =
{
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, H, L, E, o, P, F,
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x76,0x38,0x79,0x5c,0x73,0x71,
// C, d, A, u, T, r, b, blk
0x39, 0x5e, 0x77, 0x1c, 0x44, 0x50, 0x7c, 0x00
};
// fnd maseg display
#define O 0x0d //o display
#define F 0x0f // F display
#define H 0x0a // H "
#define L 0x0b // L "
#define E 0x0c // E "
#define P 0x0e // P "
#define C 0x10 // C "
#define D 0x11 // d "
#define A 0x12 // A "
#define U 0x13 // u "
#define T 0x14 // t "
#define R 0x15 // r "
#define b 0x16 // b "
#define BLK 0x00 // fnd blk display
#define bit_set(ADDRESS, BIT) (ADDRESS |= (1<<BIT)) // bit hi
#define bit_clr(ADDRESS, BIT) (ADDRESS &= ~(1<<BIT)) // bit low
#define bit_chk(ADDRESS, BIT) (ADDRESS & (1<<BIT)) // bit chak
#define tgi(PORT, BIT) (PORT ^= (1<<BIT)) //bit 토글
// macro func
#define d_out(port, val) digitalWrite(port, val)
#define clk (d_out(S_clk, 1), delayMicroseconds(2), d_out(S_clk, 0))
char scan_cnt = 0;
//char tg_flag = 0;
// Arduino 멀티펑션보드 FND display func
void fnd_dis_595(char scan, unsigned char data)
{
char i;
d_out(L_clk, 0); // Latch ds
// fnd display data out
for(i = 0; i <= 7; i++)
{
if((data & 0x80) == 0x80) d_out(S_data, 1);
else d_out(S_data, 0);
clk;
/*
d_out(S_clk, 1);
delayMicroseconds(2);
d_out(S_clk, 0);
*/
data <<= 1;
}
// fnd com = digit en 출력
for(i = 0; i <= 7; i++)
{
if((scan & 0x80) == 0x80) d_out(S_data, 1);
else d_out(S_data, 0);
clk;
/*
d_out(S_clk, 1);
delayMicroseconds(2);
d_out(S_clk, 0);
*/
scan <<= 1;
}
// Latch clk out
d_out(L_clk, 1);
}
void fnd_595_out(char scan_cnt, int data)
{
if(scan_cnt==1) fnd_dis_595(0x01, ~fnd_font[data/1000] & 0x7f); // x1000
else if(scan_cnt==2) fnd_dis_595(0x02, ~fnd_font[data%1000/100]); // x100 == ^ 0x80
else if(scan_cnt==3)
{
//if(tg_flag == 1) fnd_dis_595(0x04, ~fnd_font[data%100/10] & 0x7f);
//else fnd_dis_595(0x04, ~fnd_font[data%100/10] | 0x80);
fnd_dis_595(0x04, ~fnd_font[data%100/10]); // x10
}
else if(scan_cnt==4) fnd_dis_595(0x08, ~fnd_font[data%10]); // x1
}
// time display fnd func
void fnd_dis_T(char t_min, char t_sec)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font[t_min/10];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = ~(fnd_font[t_min%10] | 0x80);
// dp 단자 표시방법
// PORTD = ~(fnd_font[t_min%10] | 0x80); // dp 단자 on시
// PORTD = ~(fnd_font[t_min%10] & 0x7f); // dp 단자 off시
// bit_Set(PORTD, 1);
// bit_clr(PORTD, 0);
// digitalWrite(7, 1);
// digitalWrite(7, 0);
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font[t_sec/10];
if(tg_flag == 1) digitalWrite(7, 0);
else digitalWrite(7, 1);
//if(tg_flag == 1) PORTD = (~(fnd_font[t_sec/10]) | 0x80); // on
//else PORTD = (~(fnd_font[t_sec/10]) & 0x7f); // off
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font[t_sec%10];
if(tg_flag == 0) digitalWrite(7, 0);
else digitalWrite(7, 1);
//if(tg_flag == 0) PORTD = (~(fnd_font[t_sec%10]) | 0x80); // on
// else PORTD = (~(fnd_font[t_sec%10]) & 0x7f);
d_out(x1, 1); // x1 on
break;
}
}
// fnd display func
// A컴몬 fnd 표시
void fnd_dis_A(int d_buf)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font[d_buf/1000];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = ~fnd_font[d_buf%1000/100];
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font[d_buf%100/10];
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font[d_buf%10];
d_out(x1, 1); // x1 on
break;
}
}
// // K컴몬 fnd 표시
void fnd_dis_K(int d_buf)
{
scan_cnt++;
if(scan_cnt > 4) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //x1000
d_out(x1, 0); // x1 fnd off
PORTD = fnd_font[A];//d_buf/1000];
d_out(x1000, 1); //x1000 on
break;
case 2: //x100
d_out(x1000, 0); // x1000 fnd off
PORTD = fnd_font[b];//d_buf%1000/100];
d_out(x100, 1); // x100 on
break;
case 3: //x10
d_out(x100, 0); // x100 fnd off
PORTD = fnd_font[H];//d_buf%100/10];
d_out(x10, 1); // x10 on
break;
case 4: //x1
d_out(x10, 0); // x10 fnd off
PORTD = fnd_font[F];//d_buf%10];
d_out(x1, 1); // x1 on
break;
}
}
const unsigned char fnd_font_bar[] ={0x01,0x01,0x01,0x01, 0x02, 0x04, 0x08,0x08,0x08,0x08, 0x10, 0x20};
//fnd_font[] =부분에 추가
void fnd_dis_rot()
{
scan_cnt++;
delay(100);
if(scan_cnt > 13) scan_cnt = 1;
switch(scan_cnt)
{
case 1: //min x10
d_out(x1, 0); // x1 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1]; \
d_out(x1000, 1); //x1000 on
break;
case 2: //min x1
d_out(x1000, 0); // x1000 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x100, 1); // x100 on
break;
case 3: //sec x10
d_out(x100, 0); // x100 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x10, 1); // x10 on
break;
case 4: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1 ];
d_out(x1, 1); // x1 on
break;
case 5: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 6: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 7: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1, 1); // x1 on
break;
case 8: //sec x1
d_out(x1, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x10, 1); // x1 on
break;
case 9: //sec x1
d_out(x10, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x100, 1); // x1 on
break;
case 10: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 11: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 12: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
case 13: //sec x1
d_out(x100, 0); // x10 fnd off
PORTD = ~fnd_font_bar[scan_cnt-1];
d_out(x1000, 1); // x1 on
break;
}
}
#endif