📄 clock.lst
字号:
374 6 alarm_wk^=0x1<<cur_alarm_set; //周末标志位切换
375 6 break;
376 6 case 0xfe: if(show_status==0)
377 6 alarm_en^=0x1<<cur_alarm_set; //启用标志位切换
378 6 }
379 5 return;
380 5 }
381 4 if(keytmp==4) //第三个按钮
382 4 {
383 5 switch(attr)
384 5 {
385 6 case 0xff: if(show_status==1 || show_status==2)
386 6 led_on=~led_on; //打开或关闭数码管显示
387 6 break;
388 6 case 0x3f: if(show_status==0) //如果正在设置闹钟
389 6 {
390 7 if(cur_alarm_set==0) cur_alarm_set=7;
391 7 else cur_alarm_set--;
392 7 }
393 6 else if(show_status==3) //当前日期的"年"减1
394 6 {
395 7 if(year==0)
396 7 year=49;
397 7 else year--;
398 7 }
399 6 else if(show_status==4) //当前时间的"时"减1
400 6 {
401 7 tmp=hour-1;
402 7 if(tmp<0) hour=23;
403 7 else hour=tmp;
404 7 }
405 6 break;
406 6 case 0xcf: if(show_status==0) //闹钟设置的"时"减1
407 6 {
408 7 tmp=alarm[cur_alarm_set].h-1;
409 7 if(tmp<0)
410 7 alarm[cur_alarm_set].h=23;
411 7 else alarm[cur_alarm_set].h=tmp;
412 7 }
413 6 else if(show_status==3)
414 6 {
415 7 month--; //当前日期的"月"减1
416 7 if(month==0)
417 7 month=12;
418 7 }
419 6 else if(show_status==4)
420 6 {
421 7 tmp=min-1; //当前时间的"分"减1
422 7 if(tmp<0)
423 7 min=59;
424 7 else min=tmp; }
425 6 break;
426 6 case 0xf3: if(show_status==0) //闹钟设置的"分钟"减1
427 6 {
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 8
428 7 tmp=alarm[cur_alarm_set].m-1;
429 7 if(tmp<0) alarm[cur_alarm_set].m=59;
430 7 else alarm[cur_alarm_set].m=tmp;
431 7 }
432 6 else if(show_status==3)
433 6 {
434 7 day--; //当前日期的"日"减1
435 7 if(day==0)
436 7 day=31;
437 7 }
438 6 else if(show_status==4)
439 6 {
440 7 tmp=sec-1; //当前时间的"秒"减1
441 7 count_down=4000;
442 7 if(tmp<0)
443 7 sec=59;
444 7 else sec=tmp;
445 7 }
446 6 break;
447 6 case 0xfd: if(show_status==0) //切换周末标志
448 6 alarm_wk^=0x1<<cur_alarm_set;
449 6 break;
450 6 case 0xfe: if(show_status==0) //切换启用标志
451 6 alarm_en^=0x1<<cur_alarm_set;
452 6 }
453 5 return;
454 5 }
455 4 if(keytmp==8 & led_on) //第四个按钮,仅当数码管打开时有效
456 4 {
457 5 switch(attr)
458 5 {
459 6 case 0xff: if(show_status==1) //如果当前显示日期
460 6 show_status=3; //切换到调准日期状态
461 6 else if(show_status==2) //如果当前显示时间
462 6 show_status=4; //切换到调准时间状态
463 6 attr=0x3f; break; //第一?二个数码管闪烁
464 6 case 0x3f: attr=0xcf; break; //第三?四个数码管闪烁
465 6 case 0xcf: attr=0xf3; break; //第五?六个数码管闪烁case 0xf3: if(show_status==0)
466 6 case 0xf3: if(show_status==0) attr=0xfd; //第七个数码管闪烁
467 6 else if(show_status==3)
468 6 {
469 7 show_status=1;
470 7 attr=0xff;
471 7 } //恢复正常显示日期
472 6 else if(show_status==4)
473 6 {
474 7 show_status=2;
475 7 attr=0xff;
476 7 } //恢复正常显示时间
477 6 break;
478 6 case 0xfd: if(show_status==0) attr=0xfe; //第八个数码管闪烁
479 6 break;
480 6 case 0xfe: if(show_status==0) attr=0x3f; //第一?二个数码管闪烁
481 6 }
482 5 } // end of if(keytmp==4)
483 4 } // end of if(kp==0)
484 3 } // end of if(km==0)
485 2 } // end of if(keytmp!=0)
486 1 }
487
488
489 //以下是主函数
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 9
490 main()
491 {
492 1 unsigned char i;hour=23; min=59; sec=30; year=8; month=4; day=2;
493 1 count_down=4000;
494 1 flash=0; attr=0xff; led_on=1;
495 1 km=0; kp=0; show_status=2; //加电后显示当前时间
496 1 new_alarm_info=0; sound=0; alarm_stop=0;
497 1 for(i=0;i<8;i++) //从EEPROM中读入8个闹钟设置
498 1 {
499 2
500 2 alarm[2].h=0;//zm
501 2 alarm[2].m=0;//zm
502 2
503 2
504 2 alarm[i].h=myread(i*2);
505 2 alarm[i].m=myread(i*2+1);
506 2 }
507 1 alarm_en=myread(i*2);
508 1 alarm_wk=myread(i*2+1);
509 1 IE=0;
510 1 IP=0; //禁止所有中断
511 1 TMOD=0x12; //定时器0为模式2,定时器1为模式1
512 1 TH0=6;
513 1 TL0=6; //定时器0为0.125ms
514 1 TH1=0x15;
515 1 TL1=0xa0; //定时器1为30ms
516 1 TR0=1; TR1=1; //启动定时器0和定时器1
517 1 ET0=1;
518 1 ET1=1;
519 1 EA=1; //开定时器0中断?定时器1中断和总中断
520 1 while(1)
521 1 {
522 2 if(led_on)
523 2 for(i=0;i<8;i++)
524 2 {
525 3 //P2=0;
526 3 P2=0xff;//zm
527 3 if(flash || attr&(0x80>>i))
528 3
529 3 {
530 4 P0=display[i]; //zm原无[i] ,显示不正常,均为0 //
531 4 P2=~(0x80>>i); DelayX1ms(1);
532 4
533 4 }
534 3 }
535 2 else P2=0xff;//zmP2=0;
536 2 if(new_alarm_info)
537 2 {
538 3 P2=0; //暂时关闭数码管
539 3 new_alarm_info=0; //写入EEPROM
540 3 for(i=0;i<8;i++)
541 3 {
542 4 mywrite(i*2,alarm[i].h);
543 4 mywrite(i*2+1,alarm[i].m);
544 4 }
545 3 mywrite(i*2,alarm_en);
546 3 mywrite(i*2+1,alarm_wk);
547 3 }
548 2 }
549 1 }
C51 COMPILER V8.06 CLOCK 04/02/2008 17:44:13 PAGE 10
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2217 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 39 3
IDATA SIZE = ---- ----
BIT SIZE = 7 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -