Easyflow Inc.
हिन्दी · विदेश · अमेरिकी डॉलर ($) में दिखाया जा रहा है। आप इसे ऊपर दिए ग्लोब आइकन से बदल सकते हैं।

FM8P तकनीकी दस्तावेज़

ATMEGA128 atmega2561 시계용 FND 소스

AVR 소스코드 ATMEGA128 atmega2561 4FND Library v10 2011-10-06
/*
///////////////////////////////////////////////////////////////////////////////

    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

2026 चुसोक अवकाश के दौरान कार्यालय बंद रहने की सूचना