- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //端口定义
- sbit key=P2^7; //按键
- //全局变量定义
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0~f段码
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar data dis_buf[6]; //显示缓存
- uchar Cnt250us=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//计时变量
- bit stop=0; //停止标志
- /***********按键扫描程序****************/
- void keyscan()
- {
- static uint count1=0; //计数变量
- static bit key_sign=0; //按键自锁标志
- if(!key) //检测按键为0
- {
- count1++; //计数延时消抖
- if(count1>40 && key_sign==0)//消抖
- key_sign=1; //按键自锁标志置1,防止重复响应
- if(count1==2000) //长按0.5秒
- {
- count1=2001;
- Cnt250us=0;
- Cnt10ms=0;
- Cnt1s=0;
- Cnt1min=0;
- stop=0;
- }
- }
- else
- {
- if(count1<2000&&key_sign==1)//短按
- {
- stop=~stop;
- }
- count1=0; //计数变量清0
- key_sign=0; //按键自锁标志清0
- }
- }
- /***********定时器初始化程序****************/
- void Timer0Init() //250微秒@12.000MHz
- {
- TMOD |= 0x02; //设置定时器模式
- TL0 = 0x06; //设置定时初值
- TH0 = 0x06; //设置定时重载值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- }
- /***********共阴数码管显示程序****************/
- void display()
- {
- static uchar i=0; //计数变量
- P0=0x00;//消隐
- P2&=0xc0;//清低6位
- P2|=~(0x01<<i);//送位码
- P0=dis_buf[i];//送段码
- i++;
- i%=6;
- }
- /***************主程序****************/
- void main()
- {
- Timer0Init(); //定时器初始化
- while(1)
- {
- if(TF0)
- {
- TF0=0; //清除TF0标志
- Cnt250us++; //中断变量Cntus自+1
- if(Cnt250us>=40) //10ms
- {
- Cnt250us=0; //清0
- if(stop==1) //启动
- Cnt10ms++; //10毫秒计数
- if(Cnt10ms>=100)
- {
- Cnt10ms=0;
- Cnt1s++; //秒计数
- }
- if(Cnt1s>=60)
- {
- Cnt1s=0;
- Cnt1min++; //分计数
- if(Cnt1min>=100)
- Cnt1min=0;
- }
- }
- keyscan(); //按键扫描
- //数据分解放入显示缓存
- dis_buf[0]=table[Cnt1min/10];
- dis_buf[1]=table[Cnt1min%10]|0x80;//加点
- dis_buf[2]=table[Cnt1s/10];
- dis_buf[3]=table[Cnt1s%10]|0x80;//加点
- dis_buf[4]=table[Cnt10ms/10];
- dis_buf[5]=table[Cnt10ms%10];
- display(); //显示程序
- }
- }
- }
复制代码
|