📄 main.lst
字号:
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <stdio.h>
3 #include "absacc.h"
4 #include "math.h"
5
6 #define port_a 0x0000
7 #define port_b 0x0100
8 #define port_c 0x0210
9 #define port_con 0x0300
10
11 #define key_null 0x00
12 #define key_set 0x06
13 #define key_add 0x05
14 #define key_sub 0x03
15
16
17
18
19 char key_num=0;
20 int scantimer=0; //扫描计数单位
21 int counter=0; //毫秒计数单位
22
23 char hour=5;
24 char mini=12;
25 char sec=4;
26
27 char state=0;//表示当前的状态,0表示工作,其他态表示设置
28
29 char key=key_null; //输入的键盘至
30 char last_pressed_key=key_null;
31
32 char scan=1;
33 char show_loop=0;
34
35 char show_buffer[]={ 0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
36 char code char_dot[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
37
38
39 void moditimer(void);
40 void showchar(void);
41
42 void int0(void);
43 void main ()
44 {
45 1 int i=9;
46 1
47 1 EA=1;
48 1 ET0=1;//
49 1 TMOD=1;//计数器的工作模式
50 1 TH0=0xFC;
51 1 TL0=0x17;
52 1
53 1
54 1 TR0=1;//定时器的运行控制位
55 1 EX0=1;
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 2
56 1 IT0=1;//外部中断的触发方式选择位
57 1
58 1 P1=0xff;
59 1 XBYTE[port_con]=0x81;
60 1
61 1 XBYTE[port_a]=0x81;
62 1 XBYTE[port_b]=scan;
63 1 XBYTE[port_c]=0x8f;
64 1
65 1 //设置8255
66 1
67 1 while (i==9){
68 2 }
69 1
70 1 }
71
72
73 void int0( )interrupt 0
74 {
75 1 key=XBYTE[port_c]&0x07;
76 1
77 1 if (key==key_set){
78 2 state++;
79 2 if (state>=4){state=0;}}
80 1
81 1 if (state!=0)
82 1 {
83 2
84 2 /////////////////////////////
85 2 if (state==1)
86 2 {
87 3 if (key==key_add)
88 3 {
89 4 if (hour<100) hour++;else hour=0;
90 4 //hour++;
91 4 }
92 3 if (key==key_sub)
93 3 {
94 4 // if (hour==0) hour=23;else
95 4 hour--;
96 4 }
97 3 }
98 2
99 2 /////////////////////////////
100 2 if (state==2)
101 2 {
102 3 if (key==key_add)
103 3 {
104 4 if (mini<12) mini++;else mini=1;
105 4
106 4 }
107 3 if (key==key_sub)
108 3 {
109 4 if (mini==0) mini=12;else mini--;
110 4 }
111 3 }
112 2
113 2 /////////////////////////////
114 2 if (state==3)
115 2 {
116 3 if (key==key_add)
117 3 {
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 3
118 4 if(mini==2)
119 4 if(hour%400==0)
120 4 {if (sec<29) sec++;else sec=1; }
121 4 else
122 4 if(hour%100==0)
123 4 {if (sec<28) sec++;else sec=1; }
124 4 else
125 4 if(hour%4==0)
126 4 {if (sec<29) sec++;else sec=1; }
127 4 else
128 4 {if (sec<28) sec++;else sec=1; }
129 4 else
130 4 if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
131 4 {if (sec<31) sec++;else sec=1;}
132 4 else
133 4 {if (sec<30) sec++;else sec=1;}
134 4
135 4
136 4 }
137 3 if (key==key_sub)
138 3 { if(mini==2)
139 4 if(hour%400==0)
140 4 {if (sec==1) sec=29;else sec--;}
141 4 else
142 4 if(hour%100==0)
143 4 {if (sec==1) sec=28;else sec--;}
144 4 else
145 4 if(hour%4==0)
146 4 {if (sec==1) sec=29;else sec--;}
147 4 else
148 4 {if (sec==1) sec=28;else sec--;}
149 4 else
150 4 if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
151 4 {if (sec==1) sec=31;else sec--;}
152 4 else
153 4 {if (sec==1) sec=30;else sec--;}
154 4
155 4 }
156 3 }
157 2
158 2 }//非零状态结束标志
159 1
160 1 showchar();
161 1
162 1 }
163
164
165 void timeron( )interrupt 1
166 {
167 1
168 1 TH0=0xFC;
169 1 TL0=0x17;
170 1
171 1
172 1 //判断是否需要增加一秒
173 1
174 1 if (state==0)
175 1 {
176 2 if(counter<1000){ counter=counter+1;}
177 2 else
178 2 {
179 3 counter=0;
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 4
180 3 moditimer();
181 3 show_buffer[2]=0x40;
182 3 show_buffer[5]=0x40;
183 3
184 3 showchar();
185 3 }
186 2
187 2 if (counter==500)
188 2 {
189 3 show_buffer[2]=0x00;
190 3 show_buffer[5]=0x00;
191 3 }
192 2
193 2
194 2 }
195 1
196 1 if( state!=0)
197 1 {
198 2 show_buffer[2]=0x00;
199 2 show_buffer[5]=0x00;
200 2
201 2 if(counter<800 )counter=counter+1;else counter=0;
202 2
203 2 if (counter==0) showchar();
204 2 if (counter==500)
205 2 {
206 3 if (state==1){show_buffer[0]=0;show_buffer[1]=0; };
207 3 if (state==2){show_buffer[3]=0;show_buffer[4]=0; };
208 3 if (state==3){show_buffer[6]=0;show_buffer[7]=0; };
209 3
210 3 }
211 2
212 2 }
213 1
214 1
215 1
216 1
217 1 // 循环显示并且扫描键盘
218 1
219 1 if (scantimer<2)
220 1 {
221 2 scantimer++;
222 2 }
223 1 else
224 1 {
225 2 //循环的次数并执行显示
226 2
227 2 if (show_loop<8){show_loop++;} else{show_loop=0 ;}
228 2
229 2 XBYTE[port_a]=show_buffer[show_loop];
230 2
231 2 XBYTE[port_b]=~(scan<<show_loop);
232 2
233 2 scantimer=0;
234 2 }
235 1
236 1
237 1 }
238
239 void moditimer(void)
240 {
241 1 //先加上秒
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 5
242 1 sec++;
243 1 if(mini==2)
244 1 if(hour%400==0)
245 1 { if (sec==30)
246 2 { sec=1;
247 3 mini++;
248 3 if (mini==13)
249 3 {mini=1;
250 4 hour++;
251 4 if (hour==100){ hour=0; }
252 4 }
253 3 }}
254 1 else
255 1 if(hour%100==0)
256 1 { if (sec==29)
257 2 { sec=1;
258 3 mini++;
259 3 if (mini==13)
260 3 {mini=1;
261 4 hour++;
262 4 if (hour==100){ hour=0; }
263 4 }
264 3 } }
265 1 else
266 1 if(hour%4==0)
267 1 { if (sec==30)
268 2 { sec=1;
269 3 mini++;
270 3 if (mini==13)
271 3 {mini=1;
272 4 hour++;
273 4 if (hour==100){ hour=0; }
274 4 }
275 3 } }
276 1 else
277 1 {if (sec==29||sec>30)
278 2 { sec=1;
279 3 mini++;
280 3 if (mini==13)
281 3 {mini=1;
282 4 hour++;
283 4 if (hour==100){ hour=0; }
284 4 }
285 3 } }
286 1 else
287 1 if(mini<8&&mini%2==1||mini>=8&&mini%2==0)
288 1 { if (sec==32)
289 2 { sec=1;
290 3 mini++;
291 3 if (mini==13)
292 3 { mini=1;
293 4 hour++;
294 4 if (hour==100){ hour=0; }
295 4 }
296 3 }}
297 1 else
298 1 if (sec==31)
299 1 { sec=1;
300 2 mini++;
301 2 if (mini==13)
302 2 { mini=1;
303 3 hour++;
C51 COMPILER V6.12 MAIN 12/05/2005 09:31:23 PAGE 6
304 3 if (hour==100){ hour=0; }
305 3 }
306 2 }
307 1
308 1
309 1
310 1 }//---
311
312
313
314
315
316 void showchar(void)
317 {
318 1 char index=0;
319 1 index=sec / 10;
320 1 show_buffer[6]=char_dot[index];
321 1 index=sec % 10;
322 1 show_buffer[7]=char_dot[index];
323 1
324 1 index=mini / 10;
325 1 show_buffer[3]=char_dot[index];
326 1 index=mini % 10;
327 1 show_buffer[4]=char_dot[index];
328 1
329 1 index=hour / 10;
330 1 show_buffer[0]=char_dot[index];
331 1 index=hour % 10;
332 1 show_buffer[1]=char_dot[index];
333 1
334 1
335 1 }
336
337
338
339
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1420 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 21 ----
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 + -