1 /*2018年7月29日 17点40 于福安公寓
2 对于通过定时器定时来显示时间,就要通过向显示函数中传入要显示的参数,
3 这个参数可以通过在中断函数中或者显示主函数中,通过
4 shi=num/10; ge =num%10;来进行分离参数,然后件分析后的参数在传递到显示函数中
5 既可以显示
6 */
7 #include<reg52.h>
8 #define uchar unsigned char
9 #define uint unsigned int
10 sbit LA =P2^2;
11 sbit LB =P2^3;
12 sbit LC =P2^4;
13 sbit led=P2^0;
14 //sbit k1 =P3^1;
15 sbit key1 =P3^1;
16
17 void delay(uint);
18 uchar tt =0,num ,ge;
19 void display(uchar);
20 void scanf();
21 uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
22 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
23
24
25 /*void keypros()
26 {
27 if(k1==0) //检测按键K1是否按下
28 {
29 delay(1); //消除抖动 一般大约10ms
30 if(k1==0) //再次判断按键是否按下
31 {
32 led=~led; //led状态取反
33 TR0 =0;
34
35 LA =1;
36 LB =0;
37 LC =0;
38 P0 =0x3f;
39 }
40 while(!k1);//只有当按键释放之后,才会执行后面的TR0=1;这样才会使得定时器0继续使用
41 TR0 =1;
42 }
43 }
44 */
45 void scanf()
46 {
47
48 if(key1==0)
49 {
50 delay(1);
51 if(key1 ==0)
52 {
53 TR0 =0;
54 led =1;
55 LA =1;
56 LB =0;
57 LC =0;
58 P0 =0x3f;
59 while(!key1);
60
61 TR0 =1; //切记:这个TR0必须要放在while(!key);这个循环的外面,不然会造成延时
62
63
64 }
65
66 }
67 }
68
69
70 void main()
71 {
72
73 EA =1;
74 TMOD =0x01;
75 TH0 =(65536-50000)/256;
76 TL0 =(65536-50000)%256;
77 ET0 =1;
78 TR0 =1;
79 while(1)
80 {
81
82 if(tt==20) //此处必须==,不然会出错,相当于把2付给了tt,这个循环将退不出去
83 {
84 tt =0;
85 num++;
86 if(num==10)
87 num =0;
88 ge =num%10;
89 led =0;
90 scanf();
91 display(ge);
92
93 // display();
94 }
95 }
96 }
97
98
99 void display(uchar ge )
100 {
101 LA =0;
102 LB =0;
103 LC =0;
104 P0 =table[ge];
105 /*如果没有这个延时程序的,那么数码管就会出现一个8并且永远不会变,
106 也就是现实太快了,肉眼看不清楚,当时间太长的,但是定时器的时间优先,
107 故而每次还没有显示完时,就会有下一次中段到来 */
108 }
109
110 void delay(uint x)
111 {
112 uint i,j;
113 for(i =x;i>0;i--)
114 for(j=110;j>0;j--);
115 }
116
117 void PaoMiaoT() interrupt 1
118 {
119 TH0 =(65536-50000)/256;
120 TL0 =(65536-50000)%256;
121 tt++;
122 }