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

📄 clocktask.c

📁 KEILC51的始终程序,显示年月日
💻 C
字号:
#include "ClockTask.H"


//系统时间的时分秒变量
//====================
char Hour[2] = {0,0};//小时
char Minute[2] = {0,0};//分
char Second[2] = {0,0};//秒

//设置时间状态下使用的临时时分秒参数变量
//======================================
char M_Hour[2] = {0,0};//小时
char M_Minute[2] = {0,0};//分
char M_Second[2] = {0,0};//秒


bit SecondFlag = 0;//秒信号标志,每隔1秒被自动置位为1。由定时中断Timer2负责置位。
bit FlushClockDisplay = 0;//请求刷新时钟显示

UNCHAR FlashControl = 0;//设置时钟时,让当前修改的数字闪烁。为1显示闪烁字符,为2消去闪烁字符;为0不刷新显示缓冲。


#define Key_Up		1	//增量
#define Key_Down	2	//减量
#define Key_Left	3	//左移一个修改位
#define Key_Right	4	//右移一个修改位
#define Key_OK		5	//确定
#define Key_NO		6	//取消

//时钟参数加1秒。在main()主循环中被调用。
//======================================
void ClockIncreaseProcess(void)
{
	if(SecondFlag)
	{
		SecondFlag = 0;//清秒信号标志

		Second[0]++;
		if(Second[0]>=10)
		{
			Second[0] = 0;
			Second[1]++;
			if(Second[1]>=6)
			{
				Second[1] = 0;
				Minute[0]++;
				if(Minute[0]>=10)
				{
					Minute[0] = 0;
					Minute[1]++;
					if(Minute[1]>=6)
					{
						Minute[1] = 0;
						Hour[0]++;
						switch(Hour[1])
						{
							case 0:
							case 1:
									if(Hour[0]>=10)
									{
										Hour[0]=0;
										Hour[1]++;
									}
									break;
							case 2:
									if(Hour[0]>=4)
									{
										Hour[0] = 0;
										Hour[1] = 0;
									}
									break;
						}
					}
				}
			}
		}

		FlushClockDisplay = 1;//置刷新时钟显示标志
	}
}

//时钟任务执行体。在main()主循环中被调用。
//=======================================
void ClockTask(void)
{
	switch(Menu1)
	{
		case 1://初进时钟状态时的设置
				MyKey = 0;//清按键值缓冲区
				Menu1 = 2;//进入时钟显示状态
				break;
		case 2://时钟显示状态
				if(FlushClockDisplay)
				{//如果请求刷新时钟显示,则刷新显示屏的显示数据
					FlushClockDisplay = 0;//清刷新标志

					DisplayBuffer[0] = HexChar[Hour[1]];//最左边数码管
					DisplayBuffer[1] = HexChar[Hour[0]];
					DisplayBuffer[2] = Char_SubSign;
					DisplayBuffer[3] = HexChar[Minute[1]];
					DisplayBuffer[4] = HexChar[Minute[0]];
					DisplayBuffer[5] = Char_SubSign;
					DisplayBuffer[6] = HexChar[Second[1]];
					DisplayBuffer[7] = HexChar[Second[0]];//最右边数码管
				}
				
				if(MyKey)
				{//如果有键按下,进入时钟设置状态
					//使用当前时钟参数设置预置值
					//--------------------------
					M_Hour[1] = Hour[1];
					M_Hour[0] = Hour[0];
					M_Minute[1] = Minute[1];
					M_Minute[0] = Minute[0];
					M_Second[1] = Second[1];
					M_Second[0] = Second[0];

					Menu1 = 3;//进入时钟设置状态
					Menu2 = 1;//设置M_Hour
					MyKey = 0;
				}
				break;
		case 3://时钟设置状态
				if(MyKey)
				{
					switch(Menu2)
					{
						case 1://设置M_Hour
								switch(MyKey)
								{
									case Key_Up://增量
											M_Hour[0]++;
											switch(M_Hour[1])
											{
												case 0:
												case 1:
														if(M_Hour[0] >= 10)
														{
															M_Hour[0] = 0;
															M_Hour[1]++;
														}
														break;
												case 2:
														if(M_Hour[0] >= 4)
														{
															M_Hour[0] = 0;
															M_Hour[1] = 0;
														}
														break;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Down://减量
											M_Hour[0]--;
											switch(M_Hour[1])
											{
												case 1:
												case 2:
														if(M_Hour[0] < 0)
														{
															M_Hour[0] = 9;
															M_Hour[1]--;
														}
														break;
												case 0:
														if(M_Hour[0] < 0)
														{
															M_Hour[0] = 3;
															M_Hour[1] = 2;
														}
														break;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Left:
											Menu2 = 3;//设置M_Second
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Right:
											Menu2 = 2;//设置M_Minute
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_OK://确认本次设置参数,按新的参数显示时钟,并且回到时钟显示状态
											Hour[1] = M_Hour[1];
											Hour[0] = M_Hour[0];
											Minute[1] = M_Minute[1];
											Minute[0] = M_Minute[0];
											Second[1] = M_Second[1];
											Second[0] = M_Second[0];
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
									case Key_NO://取消本次设置,回到时钟显示状态
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
								}//switch(MyKey)
								break;
						case 2://设置M_Minute
								switch(MyKey)
								{
									case Key_Up://增量
											M_Minute[0]++;
											if(M_Minute[0] >= 10)
											{
												M_Minute[0] = 0;
												M_Minute[1]++;
												if(M_Minute[1] >= 6) M_Minute[1] = 0;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Down://减量
											M_Minute[0]--;
											if(M_Minute[0] < 0)
											{
												M_Minute[0] = 9;
												M_Minute[1]--;
												if(M_Minute[1]< 0) M_Minute[1] = 5;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Left:
											Menu2 = 1;//设置M_Hour
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Right:
											Menu2 = 3;//设置M_Second
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_OK://确认本次设置参数,按新的参数显示时钟,并且回到时钟显示状态
											Hour[1] = M_Hour[1];
											Hour[0] = M_Hour[0];
											Minute[1] = M_Minute[1];
											Minute[0] = M_Minute[0];
											Second[1] = M_Second[1];
											Second[0] = M_Second[0];
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
									case Key_NO://取消本次设置,回到时钟显示状态
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
								}//switch(MyKey)
								break;
						case 3://设置M_Second
								switch(MyKey)
								{
									case Key_Up://增量
											M_Second[0]++;
											if(M_Second[0] >= 10)
											{
												M_Second[0] = 0;
												M_Second[1]++;
												if(M_Second[1] >= 6) M_Second[1] = 0;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Down://减量
											M_Second[0]--;
											if(M_Second[0] < 0)
											{
												M_Second[0] = 9;
												M_Second[1]--;
												if(M_Second[1] < 0) M_Second[1] = 5;
											}
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Left:
											Menu2 = 2;//设置M_Minute
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_Right:
											Menu2 = 1;//设置M_Hour
											FlashControl = 1;//更新显示缓冲的显示数据
											break;
									case Key_OK://确认本次设置参数,按新的参数显示时钟,并且回到时钟显示状态
											Hour[1] = M_Hour[1];
											Hour[0] = M_Hour[0];
											Minute[1] = M_Minute[1];
											Minute[0] = M_Minute[0];
											Second[1] = M_Second[1];
											Second[0] = M_Second[0];
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
									case Key_NO://取消本次设置,回到时钟显示状态
											Menu1 = 2;//回到时钟显示状态
											FlushClockDisplay = 1;//刷新显示缓冲的时钟数据
											break;
								}//switch(MyKey)
								break;
					}//switch(Menu2)

					MyKey = 0;//清按键缓冲
				}//if(MyKey)

				//控制时钟设置数据的显示及闪烁
				//============================
				switch(FlashControl)
				{
					case 1://显示所有字符
							DisplayBuffer[0] = HexChar[M_Hour[1]];//最左边数码管
							DisplayBuffer[1] = HexChar[M_Hour[0]];
							DisplayBuffer[2] = Char_SubSign;
							DisplayBuffer[3] = HexChar[M_Minute[1]];
							DisplayBuffer[4] = HexChar[M_Minute[0]];
							DisplayBuffer[5] = Char_SubSign;
							DisplayBuffer[6] = HexChar[M_Second[1]];
							DisplayBuffer[7] = HexChar[M_Second[0]];//最右边数码管

							FlashControl = 0;//清除控制标志
							break;
					case 2://消隐需要闪烁的字符
							if(Menu2==1)
							{//设置M_Hour状态
								DisplayBuffer[0] = 0;//最左边数码管
								DisplayBuffer[1] = 0;
							}

							if(Menu2==2)
							{//设置M_Minute状态
								DisplayBuffer[3] = 0;
								DisplayBuffer[4] = 0;
							}

							if(Menu2==3)
							{//设置M_Second状态
								DisplayBuffer[6] = 0;
								DisplayBuffer[7] = 0;//最右边数码管
							}

							FlashControl = 0;//清除控制标志
							break;
				}
				break;
	}//switch(Menu1)
}

⌨️ 快捷键说明

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