Task09 电子钟的API设计与应用

具体任务:

2020年有366天,将2020年1月1日作为计数起点,即计数1,2020年12月31日作为计数终点,即计数366。计数1代表“2020年1月1日-星期三”,计数10代表“2020年1月10日-星期五”。设计一个实验,实现每秒计数递增一次,计数范围为1~366,并通过printf函数每秒打印一次计数对应的年、月、日、星期。例如,初始日期设置为10,即“2020年1月10日-星期五”,则第1秒打印“2020年1月10日-星期五”,第2秒打印“2020年1月11日-星期六”,以此类推。

代码:

DataType.h部分

/*********************************************************************************************************
* 模块名称: DataType.h
* 摘    要: 定义数据类型(简化函数表达)
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月25日  
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容: 
* 修改文件: 
*********************************************************************************************************/
#ifndef _DATA_TYPE_H_
#define _DATA_TYPE_H_

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/
typedef signed char         i8;
typedef signed short        i16;
typedef signed int          i32;
typedef unsigned char       u8;
typedef unsigned short      u16;
typedef unsigned int        u32;

#define TRUE          1             //TRUE-暂停,FALSE-正常运行
#define FALSE         0

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              API函数声明
*********************************************************************************************************/

#endif

RunClock.h部分 

/*********************************************************************************************************
* 模块名称: RunClock.h
* 摘    要: 模拟时钟运行
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月25日 
* 内    容: 
* 注    意:                                                                  
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容:
* 修改文件: 
*********************************************************************************************************/
#ifndef _RUN_CLOCK_H_
#define _RUN_CLOCK_H_

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "DataType.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/
//定义枚举
typedef enum  
{
  TIME_VAL_WEEK = 0,
  TIME_VAL_MONTH,
  TIME_VAL_DATE,
  TIME_VAL_MAX
}EnumTimeVal;

/*********************************************************************************************************
*                                              API函数声明
*********************************************************************************************************/
void  InitRunClock(void);                   //初始化RunClock模块

void  RunClockPer2Ms(void);                 //每2ms调用一次
void  PauseClock(u8 flag);                  //flag,TRUE-暂停,FALSE-正常运行

i16   GetTimeVal(u8 type);                  //获取时间值
void  SetTimeVal(u8 type, i16 timeVal);     //设置时间值

void  DispTime(i16 week, i16 month, i16 date); //显示当前的时间

#endif


 RunClock.c部分

/*********************************************************************************************************
* 模块名称: RunClock.c
* 摘    要: 模拟时钟运行,相比上章(先算出第一秒,然后往后推)四合一,让其第一秒就运行全部,依次显示
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月25日  
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容:
* 修改文件: 
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "RunClock.h"
#include <stdio.h>

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量
*********************************************************************************************************/
static  i16 s_iWEEK;
static  i16 s_iMonth ;
static  i16 s_iDate ;

static  u8  s_iClockPauseFlag = 0;  //TRUE-暂停,FALSE-正常运行
 
/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称: InitRunClock
* 函数功能: 初始化模块 
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/
void  InitRunClock(void)
{
  s_iWEEK = 0;
  s_iMonth  = 0;
  s_iDate  = 0;
}

/*********************************************************************************************************
* 函数名称: RunClockPer2Ms
* 函数功能: 计数模块,每2ms调用一次 
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/
void  RunClockPer2Ms(void)
{
  static i16 s_iCnt500 = 0;
  static i16 n = 1;

 
  if (499 <= s_iCnt500 && 0 == s_iClockPauseFlag)
  {
    if (n >= 0 && n <= 31)
    {
      s_iMonth = 1;
      s_iDate++;
      n = n + 1;//n表示每2ms执行的函数任务的执行次数
    }
    else
    {
      if (n > 31 && n <= 60)
      {
        if (n == 32)
        {
          s_iDate = 0;
        }
        s_iMonth = 2;
        s_iDate++;
        n++;
      }
      else
      {
        if (n > 60 && n <= 91)
        {
          if (n == 61)
          {
            s_iDate = 0;
          }
          s_iMonth = 3;
          s_iDate++;
          n++;
        }
        else
        {
          if (n > 91 && n <= 121)
          {
            if (n == 92)
            {
              s_iDate = 0;
            }
            s_iMonth = 4;
            s_iDate++;
            n++;
          }
          else
          {
            if (n > 121 && n <= 152)
            {
              if (n == 122)
              {
                s_iDate = 0;
              }
              s_iMonth = 5;
              s_iDate++;
              n++;
            }
            else
            {
              if (n > 152 && n <= 182)
              {
                if (n == 153)
                {
                  s_iDate = 0;
                }
                s_iMonth = 6;
                s_iDate++;
                n++;
              }
              else
              {
                if (n > 182 && n <= 213)
                {
                  if (n == 183)
                  {
                    s_iDate = 0;
                  }
                  s_iMonth = 7;
                  s_iDate++;
                  n++;
                }
                else
                {
                  if (n > 213 && n <= 244)
                  {
                    if (n == 214)
                    {
                      s_iDate = 0;
                    }
                    s_iMonth = 8;
                    s_iDate++;
                    n++;
                  }
                  else
                  {
                    if (n > 244 && n <= 274)
                    {
                      if (n == 245)
                      {
                        s_iDate = 0;
                      }
                      s_iMonth = 9;
                      s_iDate++;
                      n++;
                    }
                    else
                    {
                      if (n > 274 && n <= 305)
                      {
                        if (n == 275)
                        {
                          s_iDate = 0;
                        }
                        s_iMonth = 10;
                        s_iDate++;
                        n++;
                      }
                      else
                      {
                        if (n > 305 && n <= 335)
                        {
                          if (n == 306)
                          {
                            s_iDate = 0;
                          }
                          s_iMonth = 11;
                          s_iDate++;
                          n++;
                        }
                        else
                        {
                          if (n > 335 && n <= 366)
                          {
                            if (n == 336)
                            {
                              s_iDate = 0;
                            }
                            s_iMonth = 12;
                            s_iDate++;
                            n++;
                          }
                          else
                          {
                            s_iDate = 0;
                            s_iMonth = 0;
                            n = 0;
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    s_iWEEK = (n + 2) % 7;
    if (s_iWEEK == 0)
    {
      s_iWEEK = 7;
    }
    s_iCnt500 = 0;
  }
  else
{
  s_iCnt500++;
}
}

/*********************************************************************************************************
* 函数名称: PauDatelock
* 函数功能: 实现时钟的启动和暂停 
* 输入参数: flag-1-Pause,0-Running
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/      
void  PauDatelock(u8 flag)
{
  s_iClockPauseFlag = flag;  
}

/*********************************************************************************************************
* 函数名称: GetTimeVal
* 函数功能: 获取当前的时间值 
* 输入参数: 时间值的类型
* 输出参数: void
* 返 回 值: 获取的时间值,小时、分钟或秒
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/
i16   GetTimeVal(u8 type)
{
  i16 timeVal;

  switch(type)     //switch语句很多变量函数合在一起调用时就要用即用枚举后面必须跟switch语句
  {
  case TIME_VAL_WEEK:
    timeVal = s_iWEEK;
    break;
  case TIME_VAL_MONTH:
    timeVal = s_iMonth;
    break;
  case TIME_VAL_DATE:
    timeVal = s_iDate;
    break;
  default:
    break;
  } 
  
  return(timeVal);
}

/*********************************************************************************************************
* 函数名称: SetTimeVal
* 函数功能: 设置当前的时间值 
* 输入参数: type-时间值的类型,timeVal-要设置的时间值
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/      
void  SetTimeVal(u8 type, i16 timeVal)
{
  switch(type)
  {
    case TIME_VAL_WEEK:
      s_iWEEK = timeVal;
      break;
    case TIME_VAL_MONTH:
      s_iMonth  = timeVal;
      break;
    case TIME_VAL_DATE:
      s_iDate  = timeVal;
      break;
    default:
      break;
  } 
}   

/*********************************************************************************************************
* 函数名称: DispTime
* 函数功能: 显示当前的时间
* 输入参数: WEEK, Month, Date
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意:
*********************************************************************************************************/
void  DispTime(i16 WEEK, i16 Month, i16 Date)    //显示当前的时间
{
  printf("Now is 2020-%02d-%02d-%02d\n", Month, Date, WEEK);
}

 App.c部分

/*********************************************************************************************************
* 模块名称: App.c
* 摘    要: 测试时钟
* 当前版本: 1.0.0
* 作    者: 努摆的皮卡皮
* 完成日期: 2022年07月25日 
* 内    容:
* 注    意:                                                                   
**********************************************************************************************************
* 取代版本: 
* 作    者:
* 完成日期: 
* 修改内容:
* 修改文件: 
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "winmm.lib")    //导入winmm.lib多媒体库

#include "RunClock.h"
#include "DataType.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static  void  InitSoftware(void);     //初始化Software
static void __stdcall TimeProc(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, 
  unsigned long dw1, unsigned long dw2);   //定时器回调函数

static  void  Proc2msTask(void);      //声明一个2ms执行一次的函数
static  void  Proc1SecTask(void);     //声明一个1s执行一次的函数

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称: InitSoftware
* 函数功能: 所有的软件初始化函数都放在此函数中
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意: 
*********************************************************************************************************/
static  void  InitSoftware(void)
{
  InitRunClock();//所写的所有函数的初始化
  
  //设定初始化时间                       
  SetTimeVal(TIME_VAL_WEEK, 04);
  SetTimeVal(TIME_VAL_MONTH,  01);
  SetTimeVal(TIME_VAL_DATE,  00);
}

/*********************************************************************************************************
* 函数名称: TimeProc
* 函数功能: 定时器回调函数
* 输入参数: uTimerID,uMsg,dwUser,dw1,dw2,详见MSDN
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意: 
*********************************************************************************************************/
static void __stdcall TimeProc(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, 
  unsigned long dw1, unsigned long dw2)
{
  Proc2msTask();
}

/*********************************************************************************************************
* 函数名称: Proc2msTask
* 函数功能: 处理2ms任务 
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意: 
*********************************************************************************************************/
static  void  Proc2msTask(void)
{
  static  short s_iCnt500 = 0;
  
  RunClockPer2Ms();
  
  if(s_iCnt500 >=499)
  {
    Proc1SecTask();
    s_iCnt500 = 0;
  }
  else
  {
    s_iCnt500++;
  }
}

/*********************************************************************************************************
* 函数名称: Proc1SecTask
* 函数功能: 处理1s任务 (相当于原来功能函数里的主函数最后管着显示)
* 输入参数: void
* 输出参数: 无
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意: 
*********************************************************************************************************/
static  void  Proc1SecTask(void)
{
  DispTime(GetTimeVal(TIME_VAL_WEEK), GetTimeVal(TIME_VAL_MONTH), GetTimeVal(TIME_VAL_DATE));
}

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称: main
* 函数功能: 主函数(时钟用的函数)
* 输入参数: void 
* 输出参数: void
* 返 回 值: void
* 创建日期: 2022年07月25日
* 注    意: 
*********************************************************************************************************/
void  main(void)
{
  InitSoftware();  //初始化软件
  
  //timeSetEvent函数说明   
  //MMRESULT timeSetEvent(
  //  UINT           uDelay,        //以毫秒指定事件的周期
  //  UINT           uResolution,   //以毫秒指定延时的精度,数值越小定时器事件分辨率越高,省值为1ms
  //  LPTIMECALLBACK lpTimeProc,    //指向一个回调函数,即单次事件触发时,或者周期性事件触发时调用的函数
  //  DWORD_PTR      dwUser,        //存放用户提供的回调数据
  //  UINT           fuEvent        //指定定时器事件类型,TIME_ONESHOT-单次触发,TIME_PERIODIC-周期性触发
  //);
  
  //用户定时器设定,定时器精度为1ms,每隔2ms触发一次定时器,并执行回调函数TimeProc
  timeSetEvent(2, 1, TimeProc, 0, TIME_PERIODIC);

  while(1)
  {
    
  }  
}

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值