从单片机基础到程序框架(全集 2019pdf版).pdf - 第708页
unsigned c har Gu8Ed itData_1=0; //是中 间变量,用于 编辑窗口“ 1-HH” 下的 HH 数据。 unsigned c har Gu8Ed itData_2=0; //是中 间变量,用于 编辑窗口“ 2-MM” 下的 MM 数据。 unsigned c har Gu8Ed itData_3=0; //是中 间变量,用于 编辑窗口“ 3-SS” 下的 SS 数据。 unsigned c har Gu8W…

sbit KEY_INPUT1=P2^2;
sbit KEY_INPUT2=P2^1;
sbit KEY_INPUT3=P2^0;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_4=P3^4;
//数码管转换表
code unsigned char Cu8DigTable[]=
{
0x3f, //0 序号 0
0x06, //1 序号 1
0x5b, //2 序号 2
0x4f, //3 序号 3
0x66, //4 序号 4
0x6d, //5 序号 5
0x7d, //6 序号 6
0x07, //7 序号 7
0x7f, //8 序号 8
0x6f, //9 序号 9
0x00, //不显示 序号 10
0x40, //横杠- 序号 11
};
volatile unsigned char vGu8ScanTimerFlag=0;
volatile unsigned int vGu16ScanTimerCnt=0;
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
volatile unsigned char vGu8BlinkTimerFlag=0;
volatile unsigned int vGu16BlinkTimerCnt=0;
//时钟的软件定时器,注意,这里是 unsigned long 类型,范围是 0 到 4294967295 毫秒
volatile unsigned char vGu8ClockTimerFlag=0;
volatile unsigned long vGu32ClockTimerCnt=0;
//时钟正常工作的时候,每 500ms 更新显示一次
volatile unsigned char vGu8UpdateTimerFlag=0;
volatile unsigned int vGu16UpdateTimerCnt=0;

unsigned char Gu8EditData_1=0; //是中间变量,用于编辑窗口“1-HH”下的 HH 数据。
unsigned char Gu8EditData_2=0; //是中间变量,用于编辑窗口“2-MM”下的 MM 数据。
unsigned char Gu8EditData_3=0; //是中间变量,用于编辑窗口“3-SS”下的 SS 数据。
unsigned char Gu8Wd=0; //窗口选择变量。人机交互程序框架的支点。
unsigned char Gu8WdUpdate=0; //整屏更新变量。
unsigned char Gu8PartUpdate_1=0; //局部 1 的更新变量,
unsigned char Gu8PartUpdate_2=0; //局部 2 的更新变量
unsigned char Gu8PartUpdate_3=0; //局部 3 的更新变量,
volatile unsigned char vGu8Display_Righ_4=0;
volatile unsigned char vGu8Display_Righ_3=0;
volatile unsigned char vGu8Display_Righ_2=0;
volatile unsigned char vGu8Display_Righ_1=0;
volatile unsigned char vGu8Display_Righ_Dot_4=0;
volatile unsigned char vGu8Display_Righ_Dot_3=1; //开机默认保留显示 2 个小数点
volatile unsigned char vGu8Display_Righ_Dot_2=0;
volatile unsigned char vGu8Display_Righ_Dot_1=0;
volatile unsigned char vGu8KeySec=0;
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
KeyTask(); //按键的任务函数
DisplayTask(); //数码管显示的上层任务函数
}
}
void KeyTask(void) //按键的任务函数
{
if(0==vGu8KeySec)
{
return;
}
switch(vGu8KeySec)

{
case 1: //按键 K1 的“短按”。在“闪烁模式”下切换数码管的窗口。
switch(Gu8Wd) //在某个窗口下
{
case 2: //窗口 2。修改“时”的“1-HH”窗口。
Gu8Wd=3; //切换到窗口 3 的“2-MM”窗口
Gu8WdUpdate=1; //整屏更新
break;
case 3: //窗口 3。修改“分”的“2-MM”窗口。
Gu8Wd=4; //切换到窗口 4 的“3-SS”窗口
Gu8WdUpdate=1; //整屏更新
break;
case 4: //窗口 4。修改“秒”的“3-SS”窗口。
Gu8Wd=2; //切换到窗口 2 的“1-HH”窗口
Gu8WdUpdate=1; //整屏更新
break;
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=VOICE_TIME; //蜂鸣器发出“滴”一声
vGu8BeepTimerFlag=1;
vGu8KeySec=0;
break;
case 2: //按键 K2[加键]
switch(Gu8Wd) //在某个窗口下
{
case 2: //窗口 2。修改“时”的“1-HH”窗口。
if(Gu8EditData_1<23) //“时”的范围是 0 到 23
{
Gu8EditData_1++;
}
Gu8PartUpdate_1=1; //局部 1 更新显示
break;
case 3: //窗口 3。修改“分”的“2-MM”窗口。
if(Gu8EditData_2<59) //“分”的范围是 0 到 59
{
Gu8EditData_2++;
}