1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;//定義位選IO口
sbitwela=P2^7;//定義段選IO口
sbits2=P3^4;//按鍵IO口
sbits3=P3^5;
sbits4=P3^6;
sbits5=P3^7;
ucharnum,num1,num2,num3,a,b,flag;
uintaa;
ucharcodetable[]=
{
//0123
0x3f,0x06,0x5b,0x4f,
//4567
0x66,0x6d,0x7d,0x07,
//89AB
0x7f,0x6f,0x77,0x7c,
//CDEF
0x39,0x5e,0x79,0x71,
};//數碼管編碼
voiddisplay(ucharnumber);
voiddelay(ucharz);
voidchushihua();
voidmain()
{
while(1)//程序一直運行
{
display(aa);//數碼管先運行
if(s2==0)//判斷是否S2是否按下
delay(10);//延時10ms消抖
if(s2==0)//再判斷
{
TR0=0;
aa++;
if(aa==60)//到了設定時間就重置
aa=0;
while(!s2);//抬手檢測
}
if(s3==0)//判斷是否S3是否按下
delay(10);//延時10ms消抖
if(s3==0)//再判斷
{
while(!s3);//抬手檢測
TR0=0;
if(aa==0)//到了設定時間就重置
aa=60;
aa--;
}
if(s4==0)//判斷是否S4是否按下
delay(10);//延時10ms消抖
if(s4==0)//再判斷
{
while(!s4);//抬手檢測
aa=0;
TR0=0;
}
if(s5==0)//判斷是否S4是否按下
delay(10);//延時10ms消抖
if(s5==0)//再判斷
{
while(!s5);//抬手檢測
chushihua();//初始化函數
TR0=~TR0;//啟動或者暫停
}
}
}
voidt0t()interrupt1//中斷函數
{
TH0=(65536-50000)/256;//重新裝初值的高八位
TL0=(65536-50000)%256;//重新裝初值的低八位
num++;//計數器加一
if(num==20)//二十個中斷
{
num=0;//將中斷周期清零
aa++;//數碼管數字加一
if(aa==60)//數碼管數字溢出判定
aa=0;//數碼管數字清零
}
}
voiddisplay(ucharnumber)//顯示函數
{
uchara,b;
a=number/10;//十位
b=number%10;//個位
dula=1;
P0=table[a];
dula=0;
P0=0Xff;
wela=1;
P0=0xfe;
wela=0;
P0=0XFF;
delay(5);//十位的顯示
dula=1;
P0=table[b];
dula=0;
P0=0XFF;
wela=1;
P0=0xfd;
wela=0;
P0=0XFF;
delay(5);//個位的顯示
}
voiddelay(ucharz)//延時函數
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidchushihua()//初始化函數
{
TMOD=0x01;//設定定時器工作模式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//定時器賦初值
EA=1;//打開總中斷
ET0=1;//打開定時器中斷0
//TR0=1;//打開定時器0
}