从单片机基础到程序框架(全集 2019pdf版).pdf - 第704页
Gu8EditD ata_2=Gu32S etData_Cou ntdown/100% 10; //分解 成“百毫秒” 个体 Gu8EditD ata_1=Gu32S etData_Cou ntdown/10%1 0; //分解成“十毫 秒” 个体 Gu8Wd=1; / /返回设置 数据的窗 口 Gu8WdUpd ate=1; //整屏更 新一次显示 } void Delay (unsigned l ong u32Delay Time)…

if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0)
{
vGu16ScanTimerCnt--; //递减式的软件定时器
}
if(1==vGu8BlinkTimerFlag&&vGu16BlinkTimerCnt>0) //数码管闪烁跳动的定时器
{
vGu16BlinkTimerCnt--; //递减式的软件定时器
}
//每 10ms 就定时更新一次显示的软件定时器
if(1==vGu8UpdateTimerFlag&&vGu16UpdateTimerCnt>0)
{
vGu16UpdateTimerCnt--; //递减式的软件定时器
}
//倒计时实际走的时间的软件定时器,注意,这里还附加了启动状态的条件“&&1==Gu8RunStatus”
if(1==vGu8CountdownTimerFlag&&vGu32CountdownTimerCnt>0&&1==Gu8RunStatus)
{
vGu32CountdownTimerCnt--; //递减式的软件定时器
}
TH0=0xfd; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
TL0=0x40; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
}
void SystemInitial(void)
{
P0=0x00;
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
TMOD=0x01;
TH0=0xfd; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
TL0=0x40; //此参数可根据具体的时间来修改,尽量确保每定时中断一次接近 1ms
EA=1;
ET0=1;
TR0=1;
//上电初始化开机显示的窗口
Gu8EditData_4=Gu32SetData_Countdown/10000%10; //分解成“十秒”个体
Gu8EditData_3=Gu32SetData_Countdown/1000%10; //分解成“个秒”个体

Gu8EditData_2=Gu32SetData_Countdown/100%10; //分解成“百毫秒”个体
Gu8EditData_1=Gu32SetData_Countdown/10%10; //分解成“十毫秒”个体
Gu8Wd=1; //返回设置数据的窗口
Gu8WdUpdate=1; //整屏更新一次显示
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}

第一百二十二节: 利用定时中断做的“时分秒”数显时钟。
【122.1 利用定时中断做的“时分秒”数显时钟。】
上图 122.1.1 数码管
上图 122.1.2 独立按键
上图 122.1.3 有源蜂鸣器