/*
///////////////////////////////////////////////////////////////////////////////
ATMEGA 128, 2561 Clock-FND Library V.1.0
1st v.1.0 : 2011년 9월 23일
제작자 : (주)이지플로우
///////////////////////////////////////////////////////////////////////////////
*/
#ifdef EF_FND4CLOCK
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// 시계용 FND 포트를 정의합니다.
// FND Segment Bit:Bit a,b,c,d,e,f,g,h
// FND data Output:Bit 0,1,2,3,4,5,6,7
// Row Output:Bit 0,1,2,3,4
#define FND4CLOCK_DATA (PORTC)
#define FND4CLOCK_DATA_DIR (DDRC)
#define FND4CLOCK_ROW_DATA (PORTA)
#define FND4CLOCK_ROW_DIR (DDRA)
#define FND4CLOCK_ROW_BIT ( (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4) )
#define FND4CLOCK_ROW_BIT0 SETBIT (FND4CLOCK_ROW_DATA, 0)
#define FND4CLOCK_ROW_BIT1 SETBIT (FND4CLOCK_ROW_DATA, 1)
#define FND4CLOCK_ROW_BIT2 SETBIT (FND4CLOCK_ROW_DATA, 2)
#define FND4CLOCK_ROW_BIT3 SETBIT (FND4CLOCK_ROW_DATA, 3)
#define FND4CLOCK_ROW_BIT4 SETBIT (FND4CLOCK_ROW_DATA, 4)
#define FND4CLOCK_SKIPCOUNT 4 //1ms*4*5 = 20ms
//FND 5자리 = 50HZ
unsigned char DataFND[5];
unsigned char cntSkipRow=0,cntRowFND=0;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void IntFND4Clock (void )
{
if ( (cntSkipRow & 0x03)!= 0 ) { cntSkipRow--; return; }
cntSkipRow = (FND4CLOCK_SKIPCOUNT-1);
FND4CLOCK_ROW_DATA &= (0xFF-FND4CLOCK_ROW_BIT);
FND4CLOCK_DATA = DataFND[cntRowFND];
if(cntRowFND==0) { FND4CLOCK_ROW_BIT3; }
else if(cntRowFND==1) { FND4CLOCK_ROW_BIT2; }
else if(cntRowFND==2) { FND4CLOCK_ROW_BIT1; }
else if(cntRowFND==3) { FND4CLOCK_ROW_BIT0; }
else if(cntRowFND==4) { FND4CLOCK_ROW_BIT4; }
cntRowFND++;
if ( cntRowFND > 4 ) { cntRowFND = 0; }
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// clear FND Module
// FND Module 화면을 지웁니다.
void FND4_clear(void)
{
DataFND[0] = 0;
DataFND[1] = 0;
DataFND[2] = 0;
DataFND[3] = 0;
DataFND[4] = 0;
}
// convert binary to FND LED pattern
// 16진수를 FND LED 모양으로 변환합니다.
unsigned char Binary2FND(unsigned char number)
{
if(number == '0') { return 0x3F; }
else if(number == '1') { return 0x06; }
else if(number == '2') { return 0x5B; }
else if(number == '3') { return 0x4F; }
else if(number == '4') { return 0x66; }
else if(number == '5') { return 0x6D; }
else if(number == '6') { return 0x7D; }
else if(number == '7') { return 0x27; }
else if(number == '8') { return 0x7F; }
else if(number == '9') { return 0x6F; }
else if(number == 'A') { return 0x77; }
else if(number == 'B') { return 0x7C; }
else if(number == 'C') { return 0x39; }
else if(number == 'D') { return 0x5E; }
else if(number == 'E') { return 0x79; }
else if(number == 'F') { return 0x71; }
else if(number == '-') { return 0x40; }
else if(number == '.') { return 0x80; }
else if(number == ':') { return 0xFF; }
else if(number == ' ') { return 0x00; }
else { return 0x00; }
}
// Display Dot of Clock FND Module
// FND Module 의 클럭 :를 화면에 표시합니다.
void FND4_DotCLOCK(unsigned char flag)
{
if ( flag == 0 ) { DataFND[4] = Binary2FND(' '); }
else { DataFND[4] = Binary2FND(':'); }
}
// Put FND Data
// FND Module 화면을 지웁니다.
void FND4_ASCII(unsigned char number, unsigned char position)
{
if ( number == '.' )
{
number = Binary2FND( number );
if ( position == 3 ){ DataFND[3] |= number; }
else if ( position == 2 ){ DataFND[2] |= number; }
else if ( position == 1 ){ DataFND[1] |= number; }
else if ( position == 0 ){ DataFND[0] |= number; }
}
else
{
number = Binary2FND( number );
if ( position == 3 ){ DataFND[3] = number; }
else if ( position == 2 ){ DataFND[2] = number; }
else if ( position == 1 ){ DataFND[1] = number; }
else if ( position == 0 ){ DataFND[0] = number; }
}
}
// Display floating-point number xxx.x
// 000.0로 소수점을 표시합니다.
void FND4_3Dot1Float(float number)
{
unsigned int i, j,flag;
flag = 0;
//반올림합니다.
j = (int)(number*10. + 0.5);
j = j % 10000; // 10^2
i = j / 1000; // 10^2
if(i == 0) { FND4_ASCII(' ', 3); }
else { FND4_ASCII(i + '0',3); flag = 1; }
j = j % 1000; // 10^1
i = j / 100; // 10^1
if(i == 0 && flag == 0 ) { FND4_ASCII(' ', 2); }
else { FND4_ASCII(i + '0',2); }
j = j % 100; // 10^0
i = j / 10;
FND4_ASCII(i + '0',1);
FND4_ASCII('.', 1);
i = j % 10; // 10^-1
FND4_ASCII(i + '0',0);
}
// Display floating-point number xx.x
// 00.0로 소수점을 표시합니다.
void FND4_2Dot1Float(float number)
{
unsigned int i, j,flag=0;
//반올림합니다.
j = (int)(number*10. + 0.5);
i = j / 100; // 10^1
if(i == 0 && flag == 0 ) { FND4_ASCII(' ', 2); }
else { FND4_ASCII(i + '0',2); }
j = j % 100; // 10^0
i = j / 10;
FND4_ASCII(i + '0',1);
FND4_ASCII('.', 1);
i = j % 10; // 10^-1
FND4_ASCII(i + '0',0);
}
// display 1-digit decimal number
// 1자리의 10진수 값을 표시합니다.
unsigned char FND4_1DigitDecimal(unsigned char number, unsigned char position, unsigned char flag)
{
number %= 10; // 10^0
if ((number == 0) && (flag == 0))
{
FND4_ASCII(' ', position);
return 0;
}
FND4_ASCII(number + '0', position);
return 1;
}
// display 2-digit decimal number
// 2자리의 10진수 값을 표시합니다.
void FND4_2DigitDecimal(unsigned char number)
{
unsigned int i;
unsigned char flag;
flag = 0;
number = number % 100;
i = number/10;
flag = FND4_1DigitDecimal(i,1, flag); // 10^1
i = number % 10;
FND4_ASCII(i + '0',0); // 10^0
}
// display 3-digit decimal number
// 3자리의 10진수 값을 표시합니다.
void FND4_3DigitDecimal(unsigned int number)
{
unsigned int i;
unsigned char flag;
flag = 0;
number = number % 1000;
i = number/100;
flag = FND4_1DigitDecimal(i, 2, flag); // 10^2
number = number % 100;
i = number/10;
flag = FND4_1DigitDecimal(i, 1, flag); // 10^1
i = number % 10;
FND4_ASCII(i + '0',0); // 10^0
}
// display 4-digit decimal number
// 4자리의 10진수 값을 표시합니다.
void FND4_4DigitDecimal(unsigned int number)
{
unsigned int i;
unsigned char flag;
flag = 0;
number = number % 10000;
i = number/1000;
flag = FND4_1DigitDecimal(i, 3, flag); // 10^3
number = number % 1000;
i = number/100;
flag = FND4_1DigitDecimal(i, 2, flag); // 10^2
number = number % 100;
i = number/10;
flag = FND4_1DigitDecimal(i, 1, flag); // 10^1
i = number % 10;
FND4_ASCII(i + '0', 0); // 10^0
}
// display 1-digit hex number
// 1자리의 16진수 값을 표시합니다.
void FND4_1DigitHex(unsigned char i, unsigned char position)
{
i &= 0x0F; // 16^0
if(i <= 9) { FND4_ASCII(i + '0', position); }
else { FND4_ASCII(i - 10 + 'A', position); }
}
// display 2-digit hex number
// 2자리의 16진수 값을 표시합니다.
void FND4_2DigitHex(unsigned char number)
{
FND4_1DigitHex(number >> 4, 1); // 16^1
FND4_1DigitHex(number , 2); // 16^0
}
// display 4-digit hex number
// 4자리의 16진수 값을 표시합니다.
void FND4_4DigitHex(unsigned int number)
{
FND4_1DigitHex(number >> 12,3); // 16^3
FND4_1DigitHex(number >> 8 ,2); // 16^2
FND4_1DigitHex(number >> 4 ,1); // 16^1
FND4_1DigitHex(number ,0); // 16^0
}
// display 8-bit binary number
// 8자리의 2진수 값을 표시합니다.
void FND4_4BitBinary(unsigned char number)
{
FND4_ASCII(((number >> 3) & 0x01) + '0',3); // 2^3
FND4_ASCII(((number >> 2) & 0x01) + '0',2); // 2^2
FND4_ASCII(((number >> 1) & 0x01) + '0',1); // 2^1
FND4_ASCII(((number ) & 0x01) + '0',0); // 2^0
}
///////////////////////////////////////////////////////////////////////////////
#endif
|