/*
///////////////////////////////////////////////////////////////////////////////
    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
																
                                                         |