#include <reg52.h> //52系列单片机头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit Key = P1^7; //按键位声明
uchar Key_count; //全局变量: 按键计次值
uchar i; //全局变量: 定时器中断次数
uint s; //全局变量: 0.1秒计数
uchar Display_code[]={ //共阴数码管显示码
0x3f,0x06,0x5b,0x4f,0x66, //0~4
0x6d,0x7d,0x07,0x7f,0x6f }; //5~9
void Delay_ms(uint t) //t ms延时函数
{
uchar j; //循环变量
while(t--) //循环t次
{
for(j=0;j<120;j++); //嵌套循环120次
}
}
void Key_scan_Handle() //按键扫描处理函数
{
if(Key==0) //如果按键按下
{
Delay_ms(10); //延时10ms,消抖动
if(Key==0) //确认按键
{
++Key_count; //按键计次值加1
if(Key_count==3) //若按键计次值为3,
Key_count=0; //则重置0
}
switch(Key_count) //根据按键计次值选择
{
case 0: //上电或第3次按键,显示归0
i=0; //中断次数归0
s=0; //秒计数归0
break;
case 1: //按第一次,开始计时
TR0=1; //启动T0
break;
case 2: //第二次按键,停止计时,
TR0=0; //关闭T0
break;
}
}
while(Key==0); //等待键松开(此句很关键!)
//无此句时,第二次按键即归0
}
void main() //主函数
{
TMOD = 0x01; //设置T0为工作方式1
TH0 = (65535-50000)/256; //装T0定时50ms初值
TL0 = (65535-50000)%256;
EA=1; //开总中断
ET0=1; //开T0中断
while(1) //无限循环
{
Key_scan_Handle(); //调用按键扫描处理函数
P0=Display_code[s/100]; //十位显示值送P0口
P2=Display_code[s%100/10]; //个位显示值送P2口
P3=Display_code[s%10]; //十分之一位显示值送P3口
}
}
void Timer0() interrupt 1 //T0中断服务子程序
{
TH0 = (65535-50000)/256; //重装50ms定时初值
TL0 = (65535-50000)%256;
if(++i==2) //每中断2次为100ms,即1/10秒
{
i = 0; //中断次数归0,重新计数
++s; //秒计数值加1
if(s==1000)s = 0; //若秒计数值到1000,重置0
}
}
若要用两个按键控制,请增加一个按键,并修改一下键盘扫描子程序即可,不必多说。
显示方面也可采用三位一体或四位一体数码管,也只须对程序稍加修改即得。
太谢谢了