📄 time.c
字号:
#include <reg52.h>
#define scr1 P1 //个位显示屏(右),P1~P7
#define scr10 P2 //十位显示屏(左),P2~p7
//晶振频率20MHZ,最小计时时间0.6us,此程序选用计时方式2,预置数设为-167,溢出一次为0.100ms
sbit keystart = P3 ^ 5; //开始键(k3)
sbit key1 = P1 ^ 7; //个位调整键(k1)
sbit key10 = P3 ^ 4; //十位调整键(k2)
signed char s1 = 0; //记录个位的值
signed char s10 = 0; //记录十位的值
void main(void)
{
bit k1; //记录key1键的状态,0松开,1按下
bit k10; //记录key10键的状态,0松开,1按下
bit ks; //记录keystart键的状态,0松开,1按下
unsigned int t1; //延时1秒
unsigned char num[10] =
//0 1 2 3 4 5 6 7 8 9
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极
unsigned char zt; //zt =
// 0 起始状态,等待输入,显示器显示00
// 1 等待启动状态,此时十位和个位不同时为0
// 2 倒计时状态
// 3 暂停状态
TMOD = (TMOD&0xf0) | 0x0a; //设置计时方式2
TL0 = -167;
TH0 = -167;
while(1)
{
if(zt == 0)
{
s1 = 0;
s10 = 0;
}
scr1 = num[s1];
scr10 = num[s10];
//key1键检测
if(k1 == 0 && zt != 2 && zt != 3)
{
if(key1 == 0) //检测到个位键按下
{
k1 = 1;
if(++s1 > 9)
{
s1 = 0;
if(++s10 > 9)s10 = 0; //向十位进位
}
if(s1 != 0 || s10 != 0)zt = 1;
else zt = 0;
}
}
if(k1 == 1 && key1 == 1)k1 = 0; //松开个位键
//key10键检测
if(k10 == 0 && zt != 2 && zt != 3)
{
if(key10 == 0) //检测到个位键按下
{
k10 = 1;
if(++s10 > 9)
{
s10 = 0;
}
if(s1 != 0 || s10 != 0)zt = 1;
else zt = 0;
}
}
if(k10 == 1 && key10 == 1)k10 = 0; //松开个位键
//状态辨别
if(s1 == 0 && s10 == 0)zt = 0;
//keystart键检测
if(ks == 0 && zt != 0)
{
if(keystart == 0) //检测到start键按下
{
ks = 1;
if(zt == 1)
{
zt = 2;
TR0 = 1;
}
else if(zt == 2)
{
zt = 3;
TR0 = 0;
}
else if(zt == 3)zt = 0;
}
}
if(ks == 1 && keystart == 1)ks = 0; //松开start键
if(zt == 2)
{
if(TF0 == 1)
{
TF0 = 0;
if(++t1 >= 10000)
{
t1 = 0;
if(--s1 < 0)
{
s1 = 9;
if(--s10 < 0)
{
TR0 = 0;
zt = 0;
}
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -