具体任务:
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)
{
}
}