⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calender.c

📁 51单片机实验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
              strcpy(s, "HH:MM:SS");                  /* Create the template for the selected format   */
              s[0] = ClkHr  / 10 + '0';               /* Convert TIME to ASCII                         */
              s[1] = ClkHr  % 10 + '0';
              s[3] = ClkMin / 10 + '0';
              s[4] = ClkMin % 10 + '0';
              s[6] = ClkSec / 10 + '0';
              s[7] = ClkSec % 10 + '0';
              break;

        case  2:
              strcpy(s, "HH:MM:SS AM");               /* Create the template for the selected format   */
              s[9] = (ClkHr >= 12) ? 'P' : 'A';       /* Set AM or PM indicator                        */
              if (ClkHr > 12) 
                {                                     /* Adjust time to be displayed                   */
                  hr   = ClkHr - 12;
                } 
              else
                {
                  hr = ClkHr;
                }
              s[0] = hr     / 10 + '0';               /* Convert TIME to ASCII                         */
              s[1] = hr     % 10 + '0';
              s[3] = ClkMin / 10 + '0';
              s[4] = ClkMin % 10 + '0';
              s[6] = ClkSec / 10 + '0';
              s[7] = ClkSec % 10 + '0';
              break;

        default:
              strcpy(s, "?");
              break;
    }
}
/*
*********************************************************************************************************
*                                            UPDATE THE TIME
*
* Description : This function is called to update the time (i.e. hours, minutes and seconds)
* Arguments   : None.
* Returns     : TRUE     if we have completed one day.
*               FALSE    otherwise
* Notes       : This function updates ClkSec, ClkMin and ClkHr.
*********************************************************************************************************
*/
static  BOOL  ClkUpdateTime (void)
{
    BOOL newday;
    
    newday = FALSE;                           /* Assume that we haven't completed one whole day yet      */
    if (ClkSec >= 59)
     {                                        /* See if we have completed one minute yet                 */
          ClkSec = 0;                         /* Yes, clear seconds                                      */
          if (ClkMin >= 59)
            {                                 /*    See if we have completed one hour yet                */
              ClkMin = 0;                     /*    Yes, clear minutes                                   */
              if (ClkHr >= 23) 
               {                              /*        See if we have completed one day yet             */
                 ClkHr = 0;                   /*        Yes, clear hours ...                             */
                 newday    = TRUE;            /*        ... change flag to indicate we have a new day    */
               } 
              else
               {
                ClkHr++;                      /*        No,  increment hours                             */
               }
            }
          else
           {
            ClkMin++;                         /*    No,  increment minutes                               */
           }
     } 
    else
     {
        ClkSec++;                             /* No,  increment seconds                                  */
     }
    return (newday);
}
/*
*********************************************************************************************************
*                                          SET TIME ONLY
*
* Description : Set the time-of-day clock
* Arguments   : hr        is the desired hour    (0..23)
*               min       is the desired minutes (0..59)
*               sec       is the desired seconds (0..59)
* Returns     : None.
* Notes       : It is assumed that you are specifying a correct time (i.e. there is no range checking
*               done by this function).
*********************************************************************************************************
*/
void  Clk_set_time (UCHAR hr, UCHAR min, UCHAR sec)
{
    ENTER_CRITICAL();                         /* Gain exclusive access to time-of-day clock         */
    ClkHr  = hr;
    ClkMin = min;
    ClkSec = sec;
    EXIT_CRITICAL();                          /* Release access to time-of-day clock                */
}
/*
*********************************************************************************************************
*                                     DETERMINE IF WE HAVE A LEAP YEAR
*
* Description : This function determines whether the 'year' passed as an argument is a leap year.
* Arguments   : year    is the year to check for leap year.
* Returns     : TRUE    if 'year' is a leap year.
*               FALSE   if 'year' is NOT a leap year.
*********************************************************************************************************
*/
#if CLK_DATE_EN
static  BOOL  ClkIsLeapYear(UINT year)
{
    if (!(year % 4) && (year % 100) || !(year % 400)) 
     {
        return TRUE;
     } 
    else 
     {
        return (FALSE);
     }
}
#endif
/*
*********************************************************************************************************
*                                            SET DATE ONLY
*
* Description : Set the date of the time-of-day clock
* Arguments   : month     is the desired month (1..12)
*               day       is the desired day   (1..31)
*               year      is the desired year  (CLK_TS_BASE_YEAR .. CLK_TS_BASE_YEAR+63)
* Returns     : None.
* Notes       : It is assumed that you are specifying a correct date (i.e. there is no range checking
*               done by this function).
*********************************************************************************************************
*/
#if  CLK_DATE_EN
void  Clk_set_date (UCHAR month, UCHAR day, UINT year)
{
    ENTER_CRITICAL();                         
    ClkMonth = month;
    ClkDay   = day;
    ClkYear  = year;
    ClkUpdateDOW();                             
    EXIT_CRITICAL();                         
}
#endif
/*
*********************************************************************************************************
*                                          SET DATE AND TIME
*
* Description : Set the date and time of the time-of-day clock
* Arguments   : month     is the desired month   (1..12)
*               day       is the desired day     (1..31)
*               year      is the desired year    (2xxx)
*               hr        is the desired hour    (0..23)
*               min       is the desired minutes (0..59)
*               sec       is the desired seconds (0..59)
* Returns     : None.
* Notes       : It is assumed that you are specifying a correct date and time (i.e. there is no range
*               checking done by this function).
*********************************************************************************************************
*/

#if  CLK_DATE_EN
void  Clk_set_date_time (UCHAR month, UCHAR day, UINT year, UCHAR hr, UCHAR min, UCHAR sec)
{
    ENTER_CRITICAL();                         /* Gain exclusive access to time-of-day clock         */
    ClkMonth = month;
    ClkDay   = day;
    ClkYear  = year;
    ClkHr    = hr;
    ClkMin   = min;
    ClkSec   = sec;
    ClkUpdateDOW();                              /* Compute the day of the week (i.e. Sunday ...)      */
    EXIT_CRITICAL();                          /* Release access to time-of-day clock                */
}
#endif
/*
*********************************************************************************************************
*                                            UPDATE THE DATE
*
* Description : This function is called to update the date (i.e. month, day and year)
* Arguments   : None.
* Returns     : None.
* Notes       : This function updates ClkDay, ClkMonth, ClkYear and ClkDOW.
*********************************************************************************************************
*/
#if CLK_DATE_EN
static  void  ClkUpdateDate (void)
{
    BOOL newmonth;
    
    newmonth = TRUE;
    if (ClkDay >= ClkMonthTbl[ClkMonth].MonthDays) {  /* Last day of the month?                        */
        if (ClkMonth == 2) {                          /* Is this February?                             */
            if (ClkIsLeapYear(ClkYear) == TRUE) {     /* Yes, Is this a leap year?                     */
                if (ClkDay >= 29) {                   /* Yes, Last day in february?                    */
                    ClkDay = 1;                       /* Yes, Set to 1st day in March                  */
                } else {
                    ClkDay++;
                    newmonth = FALSE;
                }
            } else {
                ClkDay = 1;
            }
        } else {
            ClkDay = 1;
        }
    } else {
        ClkDay++;
        newmonth = FALSE;
    }
    if (newmonth == TRUE) {                      /* See if we have completed a month                   */
        if (ClkMonth >= 12) {                    /* Yes, Is this december ?                            */
            ClkMonth = 1;                        /* Yes, set month to january...                       */
            ClkYear++;                           /*      ...we have a new year!                        */
        } else {
            ClkMonth++;                          /* No,  increment the month                           */
        }
    }
    ClkUpdateDOW();                              /* Compute the day of the week (i.e. Sunday ...)      */
}
#endif
/*
*********************************************************************************************************
*                                         COMPUTE DAY-OF-WEEK
*
* Description : This function computes the day of the week (0 == Sunday) based on the current month,
*               day and year.
* Arguments   : None.
* Returns     : None.
* Notes       : - This function updates ClkDOW.
*               - This function is called by ClkUpdateDate().
*********************************************************************************************************
*/
#if CLK_DATE_EN
static  void  ClkUpdateDOW (void)
{
    UINT dow;
    
    dow = ClkDay + ClkMonthTbl[ClkMonth].MonthVal;
    if (ClkMonth < 3)
    {
        if (ClkIsLeapYear(ClkYear)) 
        {
            dow--;
        }
    }
    dow    += ClkYear + (ClkYear / 4);
    dow    += (ClkYear / 400) - (ClkYear / 100);
    dow    %= 7;
    ClkDOW  = dow;
}
#endif

//@@***********************************************************
//
//   功能:  给定的时间与当前时间比较
//   函数:  int Cmp_now_time(UCHAR hr, UCHAR min, UCHAR sec)
//   语言:  C
//   输入:         
//   输出:  0   相等
//          >0  给定时间大于当前时间
//          <0  给定时间小于当前时间 
//   作者:  李艳平
//   日期:  2002-05-17
//@@***********************************************************
//------------------------------------------------------------- 
int Cmp_now_time(UCHAR hr, UCHAR min, UCHAR sec)
{
   if(ClkHr!=hr)
     return(hr-ClkHr);
   else if(ClkMin!= min) 
     return(min-ClkMin);   
   else
     return(sec-ClkSec);    
}

//@@***********************************************************
//
//   功能:  给定的时间与当前时间比较
//   函数:  int Cmp_now_date_time(UCHAR month, UCHAR day, UINT year, UCHAR hr, UCHAR min, UCHAR sec)
//   语言:  C
//   输入:         
//   输出:  0   相等
//          >0  给定时间大于当前时间
//          <0  给定时间小于当前时间 
//   作者:  李艳平
//   日期:  2002-05-17
//@@***********************************************************
//------------------------------------------------------------- 
#if CLK_DATE_EN
int Cmp_now_date_time(UCHAR month, UCHAR day, UINT year, UCHAR hr, UCHAR min, UCHAR sec)
{
   if(ClkYear!=year)
       return(year-ClkYear);
   else if(ClkMonth!=month)
	   return(month-ClkMonth);
   else if(ClkDay!=day)
	   return(day-ClkDay);
   else if(ClkHr!=hr)
       return(hr-ClkHr);
   else if(ClkMin!= min) 
       return(min-ClkMin);   
   else
       return(sec-ClkSec);    
}
#endif


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -