题目
1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。
在上题的基础上,用另外三个独立键盘实现按n下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始
分析
其实这道题目不难但是却却让我想了很长时间,感触颇深,自己明明感觉写对了,就是不是我想要的,后来才知道,也是一个群,群友告诉我们,我才知道 把keyscan()放到while(1)下面不要把keycan()放到if里面, 此时,才知道,对于定时器,能尽量写在定时器里面,因为方便函数的调用,但是定时器的调用不能超过定时器的时间,否则,会导致下一个还没有出来,另一个就开始中断了,不合情理,第二点就是你最好也把display这个函数也拉到if外面,当i=0的时候display是不执行的,我觉得你看到的效果应该是数码管亮暗跳一下跳一下的,如果没有,大概是时间太短,你把i的值扩大应该就会看到数码管数字跳一下跳一下而有一个特别亮的状态, 问题也是一直困扰我的问题,之前一直困扰我,现在终于解决了,第三是函数的调用,一定是按着顺序的,记者,这次好像就是在这个东西上翻跟头了,因此,因此自己一定要仔细分析,其他的就简单了,上程序
释放按键写一次就行了
1 # include <reg52.h>
2 # define uint unsigned int
3 # define uchar unsigned char
4 uchar ge,shi,bai;
5 uint temp;
6 uchar code tabledu []=
7 {
8 0x3f, 0x06, 0x5b, 0x4f,
9 0x66, 0x6d, 0x7d, 0x07,
10 0x7f, 0x6f, 0x77, 0x7c,
11 0x39, 0x5e, 0x79, 0x71
12 };
13 sbit wela = P2^ 7;
14 sbit dula = P2^ 6;
15 sbit key1 = P3^ 4;
16 sbit key2 = P3^ 5;
17 sbit key3 = P3^ 6;
18 sbit key4 = P3^ 7;
19 void init();
20 void display(uchar bai,uchar shi,uchar ge);
21 void keyscan();
22 void delay( uint z)
23 {
24 uint x,y;
25 for(x = z;x> 0;x--)
26 {
27 for(y = 110 ;y > 0;y--);
28 }
29 }
30 void main()
31 {
32 key1 = 1;
33 key2 = 1;
34 key3 = 1;
35 key4 = 1;
36 temp = 0;
37 init();
38 while( 1)
39 {
40 display(bai,shi,ge);
41 keyscan(); // keyscan不要放到if语句中,放到while();
42
43 }
44 }
45 void keyscan()
46 {
47 if(key1 == 0) // 按下
48 {
49 delay( 5);
50 if(key1 == 0)
51 {
52 TR0 = 0;
53 while(!key1) // 释放键盘
54 display(bai,shi,ge); // 已释放就继续读取
55 TR0 = 1;
56 }
57
58 }
59
60 if(key2 == 0) // 每隔键放入功能不同,因此做法就不同
61 {
62 delay( 5); //
63 if(key2 == 0)
64 {
65 while(!key2)
66 display(bai,shi,ge);
67 TR0 = 0;
68 }
69 }
70
71
72 if(key3 == 0)
73 {
74 delay( 5);
75 if(key3 == 0)
76 {
77 while(!key3)
78 display(bai,shi,ge);
79 TR0 = 1;
80 }
81 }
82
83
84 if(key4 == 0)
85 {
86 delay( 5);
87 if(key4 == 0)
88 {
89 temp = 0;
90 while(!key4)
91 display(bai,shi,ge);
92 }
93 }
94
95 }
96 void init()
97 {
98 TMOD = 0x01;
99 TH0 = ( 65536- 10000)/ 256;
100 TL0 = ( 65536- 10000)% 256;
101 EA = 1;
102 ET0 = 1;
103 TR0 = 1;
104 }
105 void display(uchar bai, uchar shi,uchar ge)
106 {
107 wela = 1;
108 P0 = 0xfe;
109 wela = 0;
110 dula = 1;
111 P0 = tabledu[bai];
112 dula = 0;
113 delay( 3);
114
115 wela = 1;
116 P0 = 0xfd;
117 wela = 0;
118 dula = 1;
119 P0 = tabledu[shi];
120 dula = 0;
121 delay( 3);
122
123 wela = 1;
124 P0 = 0xfb;
125 wela = 0;
126 dula = 1;
127 P0 = tabledu[ge];
128 dula = 0;
129 delay( 3);
130
131 }
132 void timer0 () interrupt 1
133 {
134 TH0 = ( 65536- 10000)/ 256;
135 TL0 = ( 65536- 10000)% 256;
136 temp++;
137 if(temp == 999)
138 temp = 0;
139 bai = temp/ 100;
140 shi = temp% 100/ 10;
141 ge = temp% 10;
2 # define uint unsigned int
3 # define uchar unsigned char
4 uchar ge,shi,bai;
5 uint temp;
6 uchar code tabledu []=
7 {
8 0x3f, 0x06, 0x5b, 0x4f,
9 0x66, 0x6d, 0x7d, 0x07,
10 0x7f, 0x6f, 0x77, 0x7c,
11 0x39, 0x5e, 0x79, 0x71
12 };
13 sbit wela = P2^ 7;
14 sbit dula = P2^ 6;
15 sbit key1 = P3^ 4;
16 sbit key2 = P3^ 5;
17 sbit key3 = P3^ 6;
18 sbit key4 = P3^ 7;
19 void init();
20 void display(uchar bai,uchar shi,uchar ge);
21 void keyscan();
22 void delay( uint z)
23 {
24 uint x,y;
25 for(x = z;x> 0;x--)
26 {
27 for(y = 110 ;y > 0;y--);
28 }
29 }
30 void main()
31 {
32 key1 = 1;
33 key2 = 1;
34 key3 = 1;
35 key4 = 1;
36 temp = 0;
37 init();
38 while( 1)
39 {
40 display(bai,shi,ge);
41 keyscan(); // keyscan不要放到if语句中,放到while();
42
43 }
44 }
45 void keyscan()
46 {
47 if(key1 == 0) // 按下
48 {
49 delay( 5);
50 if(key1 == 0)
51 {
52 TR0 = 0;
53 while(!key1) // 释放键盘
54 display(bai,shi,ge); // 已释放就继续读取
55 TR0 = 1;
56 }
57
58 }
59
60 if(key2 == 0) // 每隔键放入功能不同,因此做法就不同
61 {
62 delay( 5); //
63 if(key2 == 0)
64 {
65 while(!key2)
66 display(bai,shi,ge);
67 TR0 = 0;
68 }
69 }
70
71
72 if(key3 == 0)
73 {
74 delay( 5);
75 if(key3 == 0)
76 {
77 while(!key3)
78 display(bai,shi,ge);
79 TR0 = 1;
80 }
81 }
82
83
84 if(key4 == 0)
85 {
86 delay( 5);
87 if(key4 == 0)
88 {
89 temp = 0;
90 while(!key4)
91 display(bai,shi,ge);
92 }
93 }
94
95 }
96 void init()
97 {
98 TMOD = 0x01;
99 TH0 = ( 65536- 10000)/ 256;
100 TL0 = ( 65536- 10000)% 256;
101 EA = 1;
102 ET0 = 1;
103 TR0 = 1;
104 }
105 void display(uchar bai, uchar shi,uchar ge)
106 {
107 wela = 1;
108 P0 = 0xfe;
109 wela = 0;
110 dula = 1;
111 P0 = tabledu[bai];
112 dula = 0;
113 delay( 3);
114
115 wela = 1;
116 P0 = 0xfd;
117 wela = 0;
118 dula = 1;
119 P0 = tabledu[shi];
120 dula = 0;
121 delay( 3);
122
123 wela = 1;
124 P0 = 0xfb;
125 wela = 0;
126 dula = 1;
127 P0 = tabledu[ge];
128 dula = 0;
129 delay( 3);
130
131 }
132 void timer0 () interrupt 1
133 {
134 TH0 = ( 65536- 10000)/ 256;
135 TL0 = ( 65536- 10000)% 256;
136 temp++;
137 if(temp == 999)
138 temp = 0;
139 bai = temp/ 100;
140 shi = temp% 100/ 10;
141 ge = temp% 10;
142 }