从单片机基础到程序框架(全集 2019pdf版).pdf - 第722页

P3_4=0; } void BeepC lose(void ) { P3_4=1; } void T0_ti me() inte rrupt 1 { VoiceSca n(); //蜂鸣 器的驱动函数 KeyScan( ); //按键底层的驱动扫 描函数 DisplayS can(); //数码管 底层的驱动 扫描函数 if(1==vG u8ScanTimer Flag&&vGu1 6ScanTimerC nt>…

100%1 / 836
}
Su8ScanStep++;
if(Su8ScanStep>4)
{
Su8ScanStep=1;
}
vGu8ScanTimerFlag=0;
vGu16ScanTimerCnt=SCAN_TIME;
vGu8ScanTimerFlag=1;
}
}
void VoiceScan(void) //蜂鸣器的驱动函数
{
static unsigned char Su8Lock=0;
if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0)
{
if(0==Su8Lock)
{
Su8Lock=1;
BeepOpen();
}
else
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}
void T0_time() interrupt 1
{
VoiceScan(); //蜂鸣器的驱动函数
KeyScan(); //按键底层的驱动扫描函数
DisplayScan(); //数码管底层的驱动扫描函数
if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0)
{
vGu16ScanTimerCnt--; //递减式的软件定时器
}
if(1==vGu8BlinkTimerFlag&&vGu16BlinkTimerCnt>0) //数码管闪烁跳动的定时器
{
vGu16BlinkTimerCnt--; //递减式的软件定时器
}
//在正常工作的窗口下,每 500ms 就定时更新一次显示的软件定时
if(1==vGu8UpdateTimerFlag&&vGu16UpdateTimerCnt>0)
{
vGu16UpdateTimerCnt--; //递减式的软件定时器
}
//时钟实际走的时间的软件定时器,注意,这里是递增式的软件定时
if(1==vGu8ClockTimerFlag)
{
vGu32ClockTimerCnt++; //递增式的软件定时
if(vGu32ClockTimerCnt>=86400000) //86400000 毫秒代表 24
{
vGu32ClockTimerCnt=0;
}
}
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;
//上电初始化一些关键的数
Gu8Wd=1; //窗口 1。开机默认处于正常工作的窗口
Gu8WdUpdate=1; //整屏更新变量
vGu8ClockTimerFlag=0;
vGu32ClockTimerCnt=43200000; //43200000 毫秒开机默认 12:00 点。12 时就 43200000 毫秒
vGu8ClockTimerFlag=1; //启动时钟的定时器
//时钟正常工作的时候,每 500ms 更新显示一次
vGu16UpdateTimerCnt=500;
vGu8UpdateTimerFlag=1; //启动小数点闪烁的定时器
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}