📄 timer07.lst
字号:
C51 COMPILER V8.05a TIMER07 02/26/2009 16:57:39 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TIMER07
OBJECT MODULE PLACED IN timer07.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE timer07.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 *本程序能使数码管显示时钟 flag
3 *不能用键盘进行调节
4 *程序的写法是根据硬件电路的连接方式,数码管接在P0口上,前四位是位选,由74LS138驱动;后四位是段选,由74LS47
-驱动;
5 *程序的精华:74LS138一次只能选择一个数码管,故应ScanSeg7()循环扫描数码管使六个数码管全部亮起来;
6 **************通过定时中断和write_sfm()将sec、min、hour写入DisplayArray[6]中,再通过ScanSeg7()是数码管显示
-出时钟
7 */
8 #include <reg52.h>
9 #define uchar unsigned char
10 #define uint unsigned int
11 uchar hour=23;min=58;sec=12;
12 uchar DisplayArray[6]={2,1,8,5,3,2};
13 uchar count,s1num;
14 sbit speaker=P3^3;
15 sbit s1=P1^4;
16 sbit s2=P1^5;
17 sbit s3=P1^6;
18 sbit c3=P1^3;
19 void delay(uint z)
20 {
21 1 uint x,y;
22 1 for(x=z;x>0;x--)
23 1 for(y=110;y>0;y--);
24 1 }
25 void ScanSeg7() /*数码管扫描显示*/
26 {
27 1 static uchar s_scanCounter;
28 1 s_scanCounter++;
29 1 if(s_scanCounter>5) s_scanCounter=0; /*ptr1>5表示6个数码管都已经扫描过*/
30 1 P0=s_scanCounter|(DisplayArray[s_scanCounter]<<4);
31 1 }
32
33 void write_sfm(uchar add,uchar date)
34 {
35 1 uchar hour,ge;
36 1 hour=date/10;
37 1 ge=date%10;
38 1 DisplayArray[add]=ge;
39 1 DisplayArray[add+1]=hour;
40 1 }
41 void keyscan()
42 {
43 1 P1=0xff;
44 1 c3=0;
45 1 if(s1==0)
46 1 {
47 2 delay(5);
48 2 if(s1==0)
49 2 {
50 3 sec++;
51 3 while(!s1);
52 3 switch(s1num)
53 3 {
C51 COMPILER V8.05a TIMER07 02/26/2009 16:57:39 PAGE 2
54 4 case 1:
55 4 {
56 5 write_sfm(0,sec);
57 5 TR0=0;
58 5
59 5 } break;
60 4 case 2:
61 4 {
62 5
63 5 TR0=0;
64 5 } break;
65 4 case 3:
66 4 {
67 5
68 5 TR0=0;
69 5 } break;
70 4 default:
71 4 {
72 5
73 5 TR0=1;
74 5 }
75 4 }
76 3 }//s1键被按下
77 2 }
78 1 if(s1num!=0)
79 1 {
80 2 if(s2==0)//第二个键被按下,让时或分或秒加一
81 2 {
82 3 while(!s2);//等待松手
83 3 if(s1num==1)//秒针按下
84 3 {
85 4 sec++;
86 4 if(sec==60) min=0;
87 4 write_sfm(0,sec);
88 4 }
89 3 if(s1num==2)
90 3 {
91 4 min++;
92 4 if(min==60) min=0;
93 4 write_sfm(2,min);
94 4
95 4 }
96 3 if(s1num==3)//小时
97 3 {
98 4 hour++;
99 4 if(hour==24) hour=0;
100 4 write_sfm(4,hour);
101 4
102 4 }
103 3 }
104 2 /*时分秒减*/
105 2 if(s3==0)
106 2 {
107 3 delay(5);
108 3 if(s3==0)
109 3 {
110 4 while(!s3);
111 4 if(s1num==1)
112 4 {
113 5 sec--;
114 5 if(sec==-1) sec=59;
115 5 write_sfm(0,sec);
C51 COMPILER V8.05a TIMER07 02/26/2009 16:57:39 PAGE 3
116 5
117 5 }
118 4 if(s1num==2)
119 4 {
120 5 min--;
121 5 if(min==-1) min=59;
122 5 write_sfm(2,min);
123 5
124 5 }
125 4 if(s1num==3)
126 4 {
127 5 hour--;
128 5 if(hour==-1) hour=59;
129 5 write_sfm(4,min);
130 5
131 5 }
132 4
133 4 }
134 3 }
135 2 }
136 1
137 1 }
138
139
140 void main()
141 {
142 1 TMOD=0x01;
143 1 TR0=1;
144 1 EA=1;
145 1 ET0=1;
146 1
147 1 while(1)
148 1 {
149 2
150 2 ScanSeg7() ;
151 2 if(sec&min&hour==0)
152 2 {
153 3 speaker=0;
154 3 }
155 2
156 2 }
157 1 }
158 void Timer0Int() interrupt 1
159 {
160 1 TH0=(65536-50000)/256; /*设定Timer0每隔SCAN_CYCLEu中断一次*/
161 1 TL0=(65536-50000)%256;
162 1 count++;
163 1 keyscan();
164 1 if(count==20)
165 1 {
166 2 count=0;
167 2 sec++;
168 2 if(sec==60)
169 2 {
170 3 sec=0;
171 3 min++;
172 3 if(min==60)
173 3 {
174 4 min=0;
175 4 hour++;
176 4 if(hour==24)
177 4 {
C51 COMPILER V8.05a TIMER07 02/26/2009 16:57:39 PAGE 4
178 5 hour=0;
179 5 }
180 4 write_sfm(4,hour);
181 4 }
182 3 write_sfm(2,min);
183 3 }
184 2 write_sfm(0,sec);
185 2 }
186 1
187 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 502 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -