📄 clocktask.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 + -