📄 clock.lst
字号:
183 3 if(year%4==0) tmp_days=tmp_days+29;
184 3 else tmp_days=tmp_days+28;
185 3 }
186 2 tmp_days=tmp_days+day-1;
187 2 weekday=(weekday+tmp_days%7)%7+1;
188 2 return;
189 2 }
190 1
191 1 /*** 查询是否有闹钟时间项符合触发条件 ***/
192 1 if(count_down==2500)
193 1 {
194 2 if((alarm_stop || sound) && alarm[cur_alarm_active].m!=min) //触发后1分钟
195 2 {
196 3 alarm_stop=0;
197 3 sound=0;
198 3 } //自动关蜂鸣器
199 2 if(sound==0 && alarm_stop==0) //没有已触发的闹钟项
200 2 for(tmp=0;tmp<8;tmp++) //则查询8个闹钟项内是否有符合条件的
201 2 {
202 3 if(((alarm_en>>tmp)&1)==0) continue; //该闹钟项不启用
203 3 if(((alarm_wk>>tmp)&1)==1) //该闹钟项周末有效
204 3 {
205 4 if(weekday!=6 && weekday!=7) continue;
206 4 }//不是星期六或星期天
207 3 else
208 3 {
209 4 if(weekday==6 || weekday==7) continue;
210 4 }
211 3 if(alarm[tmp].h==hour && alarm[tmp].m==min) //比较当前时间
212 3 {
213 4 sound=1; cur_alarm_active=tmp; break;
214 4 } //与该闹钟项的时间
215 3 }
216 2 return;
217 2 }
218 1 if(count_down==0) //过了一秒钟
219 1 {
220 2 count_down=4000;
221 2 sec++;
222 2 if(sec==60)
223 2 {
224 3 sec=0;
225 3 min++;
226 3 if(min==60)
227 3 {
228 4 min=0; hour++;
229 4 if(hour==24)
230 4 {
231 5 hour=0;
232 5 day++;
233 5 switch(day)
234 5 {
235 6 case 29: if(month==2 && year%4)
236 6 {
237 7 day=1;
238 7 month=3;
239 7 } break;
240 6 case 30: if(month==2 && year%4==0)
241 6 {
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 5
242 7 day=1;
243 7 month=3;
244 7 } break;
245 6 case 31:if(month==4 || month==6 || month==9 || month==11)
246 6 {
247 7 day=1;
248 7 month++;
249 7 } break;
250 6 case 32: day=1; month++;
251 6 if(month==13)
252 6 {
253 7 month=1;
254 7 year++;
255 7 }
256 6 }
257 5 }
258 4 }
259 3 }
260 2 }
261 1 }
262
263
264 //以下是定时器2中断,用于按键扫描
265 void Timer1ISR(void) interrupt 3 using 2
266 {
267 1 unsigned char keytmp;
268 1 char tmp;
269 1 TH1=0x15; TL1=0xa0; // 每30ms中断一次
270 1 /*** 当前显示的内容 ***/
271 1 if(show_status==0) //当前正在设置闹钟项
272 1 {
273 2 display[0]=cur_alarm_set;
274 2 display[1]=0xf;
275 2 display[2]=alarm[cur_alarm_set].h/10;
276 2 display[3]=alarm[cur_alarm_set].h%10;
277 2 display[4]=alarm[cur_alarm_set].m/10;
278 2 display[5]=alarm[cur_alarm_set].m%10;
279 2 display[6]=(alarm_wk>>cur_alarm_set)&1;
280 2 display[7]=(alarm_en>>cur_alarm_set)&1;
281 2 }
282 1 if(show_status==1 || show_status==3) //当前显示或设置日期
283 1 {
284 2 display[0]=year/10;
285 2 display[1]=year%10;
286 2 display[2]=month/10;
287 2 display[3]=month%10;
288 2 display[4]=day/10;
289 2 display[5]=day%10;
290 2 display[6]=0xf;
291 2 display[7]=weekday;
292 2 }
293 1 if(show_status==2 || show_status==4) //当前显示或设置时间
294 1 {
295 2 display[0]=hour/10;
296 2 display[1]=hour%10;
297 2 display[2]=min/10;
298 2 display[3]=min%10;
299 2 display[4]=sec/10;
300 2 display[5]=sec%10;
301 2 display[6]=0xf;
302 2 display[7]=0xf;
303 2 } //最后两后无显示
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 6
304 1
305 1 /*** 按键扫描及处理 ***/
306 1
307 1 keytmp=~(P1) & 0x0f;
308 1 if(keytmp==0) //zm无按键
309 1 {
310 2 km=0;
311 2 kp=0;
312 2 }
313 1 else {
314 2 if(km==0)
315 2 km=1;
316 2 else{
317 3 if(kp==0)
318 3 {
319 4 kp=1;
320 4 if(keytmp==1) //第一个按钮
321 4 {
322 5 if(sound)
323 5 {
324 6 alarm_stop=1; sound=0;
325 6 } //如果闹钟正响,按此键停止
326 5 else if((show_status==1 || show_status==2) && led_on) //正显示日期或时间
327 5 {
328 6 show_status=0; cur_alarm_set=0; attr=0x3f;
329 6 } //进入闹钟设置
330 5 else if(show_status==0) //如正在设置闹钟时间项
331 5 {
332 6 show_status=2; new_alarm_info=1; attr=0xff;
333 6 } //返回当前时间显示
334 5 return;
335 5 }
336 4 if(keytmp==2 && led_on) //第二个按钮,仅当数码管打开时有效
337 4 {
338 5 switch(attr)
339 5 {
340 6 case 0xff: if(show_status==1) show_status=2; //在显示时间与日期间切换
341 6 else if(show_status==2) show_status=1; break;
342 6 case 0x3f: if(show_status==0) cur_alarm_set=(cur_alarm_set+1)%8;
343 6 else if(show_status==3)
344 6 year=(year+1)%50; //当前日期的"年"加1,到50时归零。
345 6 else if(show_status==4)
346 6 hour=(hour+1)%24; //当前时间的"时"加1,到24时归零。
347 6 break;
348 6 case 0xcf: if(show_status==0) //闹钟设置的"时"加1
349 6 alarm[cur_alarm_set].h=(alarm[cur_alarm_set].h+1)%24;
350 6 else if(show_status==3)
351 6 {
352 7 month++; //当前日期的"月"加1
353 7 if(month==13)
354 7 month=1;
355 7 }
356 6 else if(show_status==4)
357 6 min=(min+1)%60; //当前时间的"分"加1
358 6 break;
359 6 case 0xf3: if(show_status==0)
360 6 alarm[cur_alarm_set].m=(alarm[cur_alarm_set].m+1)%60;
361 6 else if(show_status==3)
362 6 {
363 7 day++; //当前日期的"日"加1
364 7 if(day==32)
365 7 day=1;
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 7
366 7 }
367 6 else if(show_status==4)
368 6 {
369 7 count_down=8000;
370 7 sec=(sec+1)%60;
371 7 } //当前时间的"秒"加1
372 6 break;
373 6 case 0xfd: if(show_status==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -