/* 名称:10s的秒表
说明:首次按键计时开始,再次按键暂停,第三次按键清零。
*/
#includereg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitK1=P3^7;
uchar
i,Second_Counts,Key_Flag_Idx;
bitKey_State;
uchar
DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
voidDelayMS(uintms)
{
uchart;
while(ms--)for(t=0;t120;t++);
}
//处理按键事件
voidKey_Event_Handle()
{
if(Key_State==0)
{
Key_Flag_Idx=(Key_Flag_Idx+1)%3;
switch(Key_Flag_Idx)
{
case1:EA=1;ET0=1;TR0=1;break;
case2:EA=0;ET0=0;TR0=0;break;
case0:P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
}
}
}
//主程序
voidmain()
{
P0=0x3f;//显示00
P2=0x3f;
i=0;
Second_Counts=0;
Key_Flag_Idx=0; //按键次数(取值0,1,2,3)
Key_State=1; //按键状态
TMOD=0x01; //定时器0方式1
TH0=(65536-50000)/256; //定时器0:15ms
TL0=(65536-50000)%256;
while(1)
{
if(Key_State!=K1)
{
DelayMS(10);
Key_State=K1;
Key_Event_Handle();
}
}
}
/T0中断函数
voidDSY_Refresh()interrupt1
{
TH0=(65536-50000)/256; //恢复定时器0初值
TL0=(65536-50000)%256;
if(++i==2)
{
i=0;
Second_Counts++; //50ms*2=0.1s转换状态
P0=DSY_CODE[Second_Counts/10];
P2=DSY_CODE[Second_Counts%10];
if(Second_Counts==100)Second_Counts=0;//满100(10s)后显示00
}
}
扩展阅读:TIMER0与TIMER1控制条形LED