📄 dateandtime.lst
字号:
386 2 T_minute_set:LCD_GoToXY(6,2) ; //定时器分设定
387 2 key=Key_Scan() ; //键盘扫描
388 2 if(key==1) goto T_ON_OFF ; //如果按下的是功能键(1号键),退出校正状态
389 2 if(key==2) Timer_minute++ ; //如果按下的是加1 键(2号键),分加1
390 2 if(Timer_minute==60) //分上限循环
391 2 Timer_minute=0 ;
392 2 if(key==3) Timer_minute-- ; //如果按下的是减1 键(3号键),分减1
393 2 if(Timer_minute==-1) //分下限循环
394 2 Timer_minute=59 ;
395 2 CharToStr(Timer_minute) ; //将校正后的分数据转换成相对应的ASCII码
396 2 Delay1ms(50) ; //延时100ms
397 2 LCD_Print(DATA) ; //分显示刷新
398 2 goto T_minute_set ; //分校正循环
399 2
400 2 T_ON_OFF: LCD_GoToXY(9,2) ; //定时器开/关设定
401 2 key=Key_Scan() ; //键盘扫描
402 2 if(key==1) goto T_song_set ; //如果按下的是功能键(1号键),转定时器分校正
403 2 if(key==2||key==3)
404 2 Timer_ON_OFF=!Timer_ON_OFF ; //按下加1键或减1键,定时器开关标志(Timer_ON_OFF),
405 2 //取反,因为它只有开(1)和关(0)两种状态
406 2 Delay1ms(50) ; //延时100ms
407 2 if(Timer_ON_OFF==1) LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开
408 2 else LCD_Print("0") ; //如果Timer_ON_OFF=0,则显示0,表示定时关
409 2
410 2 goto T_ON_OFF ; //定时器开/关设定循环
411 2
412 2 T_song_set:LCD_GoToXY(11,2) ; //定时器提示铃声设定
413 2 key=Key_Scan() ; //键盘扫描
414 2 if(key==1) goto T_RET ; //如果按下的是功能键(1号键),退出定时器设定状态
415 2 if(key==2) Timer_Ring++ ; //如果按下的是加1 键(2号键),铃声编号加1
416 2 if(Timer_Ring==4)
417 2 Timer_Ring=1 ;
418 2 if(key==3) Timer_Ring-- ; //如果按下的是减1 键(3号键),铃声编号减1
419 2 if(Timer_Ring==0)
420 2 Timer_Ring=3 ;
421 2 CharToStr(Timer_Ring) ; //将铃声编号转换成相对应的ASCII码
422 2 Delay1ms(50) ; //延时100ms
423 2 LCD_Print(DATA) ; //铃声编号显示刷新
424 2 Ring() ;
425 2 goto T_song_set ; //定时器提示铃声设定循环
426 2
427 2 T_RET:Timer_set_sin=0 ; //退出定时器设定状态
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 8
428 2 LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH); //关光标,光标不闪烁
429 2 }
430 1 Timer_Show_sin=0 ; //退出定时器显示状态
431 1 }
432 /***主程序**************************************************************************/
433 void main(void)
434 { float i=0; unsigned char keys ;
435 1 Delay1ms(250) ;
436 1 LCD_Initial() ; //LCD1602初始化
437 1 Delay1ms(100) ;
438 1 LCD_Print(" Welcome") ; //开机画面
439 1 Delay1ms(50) ;
440 1 LCD_GoToXY(0,2) ;
441 1 LCD_Print(" HangKaiKun") ;
442 1 Delay1ms(250) ; //延时250ms
443 1 Delay1ms(250) ; //延时250ms
444 1 Delay1ms(250) ; //延时250ms
445 1 Delay1ms(250) ; //延时250ms
446 1 Delay1ms(250) ; //延时250ms
447 1 LCD_Write(LCD_COM,LCD_CLEAR) ; //清屏
448 1 IT1=1 ; //置INT1为边沿触发模式
449 1 IT0=1 ; //置INT0为边沿触发模式
450 1 PX1=1 ; //置INT1为高优先级
451 1 IE=0x84 ; //INT1开中
452 1 while(1)
453 1 {keys=Key_Scan() ; //键盘扫描
454 2 if(keys==1) //若为功能键,转校时程序
455 2 Set_TimeAndDate() ;
456 2 if(keys==2) //若为加1 键,转定是显示程序
457 2 Timer_Show_Set() ;
458 2 if(keys==4&&!Speak_sin) //若为报时键,转语音报时程序
459 2 SpeakTime() ;
460 2 if(Timer_sin) //判断是否响铃
461 2 Ring() ; //是,则转响铃程序
462 2
463 2 while(Temperature_sin)
464 2 {float i ;
465 3 i=ReadTemperature() ; //读取温度值
466 3 IntToStr(i) ; //将温度值转换成相对应的ASCII码
467 3 LCD_GoToXY(9,2) ; //定位到温度显示区
468 3 LCD_Print(temp) ; //显示温度
469 3 Temperature_sin=0 ; //表示温度处理完毕
470 3 }
471 2 }
472 1 }
473 /***中断1服务程序(用于完成计时和日历转变和刷新,以及判断定时是否已到)***************/
474 void int1(void) interrupt 2 using 1
475 {
476 1 second++ ; //秒加1
477 1 led_on-- ; //LCD背光时间值减1
478 1 if((second%2==0)&&!Timer_sin) //如果不在定时器显示或设计状态,则每隔
479 1 Temperature_sin=1 ; //两秒启动一次温度检测
480 1 if(led_on==-1) //LCD背光灯亮的时间结束,关闭LCD背光灯
481 1 led_on=0 ;
482 1 if(second==60) //若秒满60,则秒置0,分加1
483 1 { second=0 ;
484 2 minute++ ;
485 2 if(minute==60) //若分满60,则分置0,时加1
486 2 { minute=0 ;
487 3 hour++ ;
488 3 if(hour==24) //若时满24,则时置0,日和星期加1
489 3 { hour=0 ;
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 9
490 4 week++ ;
491 4 day++ ;
492 4 if(week==8) //若星期满8,则星期置1,
493 4 week=1 ;
494 4 if(day==days) //若日满28(二月)、29(润年二月、30(月小)
495 4 { day=1 ; // 31(月大),则日置1,月加1
496 5 month++ ;
497 5 Momth_Days(month) ; //确定校正后,月的天数
498 5 if(month==13) //若月满13,则月置1
499 5 { month=1 ;
500 6 year++ ;
501 6 Momth_Days(month) ; //确定校正后,月的天数
502 6 Leap_Year(year) ; //判断润年
503 6 if(year==100) //若年满100,则年置0
504 6 year=0 ;
505 6 Leap_Year(year); //判断润年
506 6 }
507 5 }
508 4 }
509 3 }
510 2 }
511 1
512 1 if(~Timer_Show_sin)
513 1 {
514 2 if((Timer_hour==hour)&&(Timer_minute==minute)&&second==0)//判断定时是否已到
515 2 if(Timer_ON_OFF) Timer_sin=1;
516 2 LCD_GoToXY(0,1) ; //年刷新
517 2 LCD_Print("20") ;
518 2 CharToStr(year) ; //年数据转成ASCII码
519 2 LCD_Print(DATA) ;
520 2 LCD_Print("-") ; //在年显示后面显示“-”
521 2 CharToStr(month) ; //月数据转成ASCII码
522 2 LCD_Print(DATA) ; //月刷新
523 2 LCD_Print("-") ; //在月显示后面显示“-”
524 2 CharToStr(day) ; //日数据转成ASCII码
525 2 LCD_Print(DATA) ; //日刷新
526 2 WeekToStr(week) ; //星期数据转成ASCII码
527 2 LCD_GoToXY(12,1) ; //定位到星期显示区
528 2 LCD_Print(Week_Str); //星期刷新
529 2 CharToStr(hour) ; //时数据转成ASCII码
530 2 LCD_GoToXY(0,2) ; //定位到时显示区
531 2 LCD_Print(DATA) ; //时刷新
532 2 LCD_Print(":") ; //在小时显示后显示“:”
533 2 CharToStr(minute) ; //分数据转成ASCII码
534 2 LCD_Print(DATA) ; //分刷新
535 2 LCD_Print(":") ; //在分显示后显示“:”
536 2 CharToStr(second) ; //秒数据转成ASCII码
537 2 LCD_Print(DATA) ; //秒刷新
538 2 }
539 1 }
540 /***中断0服务程序(完成发音任务)*****************************************************/
541 void int0(void) interrupt 0 using 2
542 {
543 1 if(Timer_sin&&!Speak_sin) //
544 1 { Delay1ms(50) ; //
545 2 Play=0 ; //放音
546 2 Delay1ms(10) ; //延时10ms
547 2 Play=1 ;
548 2 }
549 1 if(Speak_sin)
550 1 { if(Speak[Number]==0xff) //报时时,遇到'\0',报时结束
551 2 { EX0=0 ; //
C51 COMPILER V7.50 DATEANDTIME 11/16/2008 10:58:45 PAGE 10
552 3 Number=0 ; //
553 3 Speak_sin=0 ; //
554 3 }
555 2 else
556 2 { P1=Speak[Number] ; //
557 3 Delay1ms(50) ; //
558 3 Play=0 ; //放音
559 3 Delay1ms(10) ; //延时10ms
560 3 Play=1 ; //
561 3 Number++ ; //下一个音
562 3 }
563 2 }
564 1
565 1 }
566
*** WARNING C316 IN LINE 566 OF DateAndTime.c: unterminated conditionals
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2314 ----
CONSTANT SIZE = 84 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 52 15
IDATA SIZE = ---- ----
BIT SIZE = 6 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -