dateandtime.c

来自「本源程序是基于AT89C51单片机的」· C语言 代码 · 共 566 行 · 第 1/2 页

C
566
字号
		   if(key==3) day--           ; //如果按下的是减1 键(3号键),日减1
		   if(day==0)				    //日下限循环
		      day=days-1              ;
		   CharToStr(day)             ;	//将校正后的日数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms  
		   LCD_Print(DATA)            ;	//日显示刷新
		   goto Day_set               ; //日校正循环

 Week_set: LCD_GoToXY(12,1)	          ; //星期调整
  		   key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto Hour_set   ;	//如果按下的是功能键(1号键),转时校正
		   if(key==2) week++          ; //如果按下的是加1 键(2号键),星期加1         
		   if(week==8)                  //星期上限循环
		      week=1                  ;         
		   if(key==3) week--          ; //如果按下的是减1 键(3号键),星期减1
		   if(week==0)				    //星期下限循环
		      week=7                  ; 
		   WeekToStr(week)            ; //将校正后的星期数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms 
		   LCD_GoToXY(12,1)           ;	//定位到星期在LCD屏上的显示位置
		   LCD_Print(Week_Str)        ;	//星期显示刷新
		   goto Week_set              ; //日和星期校正循环

 Hour_set: LCD_GoToXY(0,2)            ;	//时校正
           key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto Minute_set ;	//如果按下的是功能键(1号键),转分校正
		   if(key==2) hour++          ;	//如果按下的是加1 键(2号键),时加1
		   if(hour==24)                	//时上限循环
		      hour=0                  ;         
		   if(key==3) hour--          ; //如果按下的是减1 键(3号键),时减1
		   if(hour==-1)				    //时下限循环
		      hour=23                 ;
		   CharToStr(hour)            ; //将校正后的时数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms
		   LCD_Print(DATA)            ; //时显示刷新
		   goto Hour_set              ;	//时校正循环

Minute_set:LCD_GoToXY(3,2)            ;	//分校正
           key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto RET        ;	//如果按下的是功能键(1号键),退出校正状态
		   if(key==2) minute++        ;	//如果按下的是加1 键(2号键),分加1
		   if(minute==60)               //分上限循环 
		      minute=0                ;         
		   if(key==3) minute--        ; //如果按下的是减1 键(3号键),分减1
		   if(minute==-1)			    //分下限循环
		      minute=59               ;
		   CharToStr(minute)          ; //将校正后的分数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms 
		   LCD_Print(DATA)            ; //分显示刷新
		   goto Minute_set            ;	//分校正循环

 	  RET: EX1=1                      ; //开INT1中断,开始计时
           LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH); //关光标,光标不闪烁                 
}          
/***定时器显示或设定****************************************************************/
void Timer_Show_Set(void)
{
     unsigned char key                ;
	 unsigned char w=10               ;
     bit Timer_set_sin=0              ; //定时器设定标志,为1表示正处于定时器设定状态
	 Timer_Show_sin=1                 ; //表示现在已处于定时器显示状态
	 LCD_Write(LCD_COM,LCD_CLEAR)     ; //清屏
	 Delay1ms(50);
	 LCD_Print("     Timer")          ; //在显示屏的第一行中间显示“Timer"
	 CharToStr(Timer_hour)			  ;
	 LCD_GoToXY(3,2)                  ; //定位到显示屏的第二行第四个字符
	 LCD_Print(DATA)                  ; //显示定时器的时钟 
	 LCD_Print(":")                   ; //在定时器的时钟后显示“:”
	 CharToStr(Timer_minute)          ;
	 LCD_Print(DATA)                  ; //显示定时器的分钟
	 LCD_Print(" ")                   ; //在定时器的分钟后空一格
	 if(Timer_ON_OFF==1) LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开
	 else
	    LCD_Print("0")                ; //如果Timer_ON_OFF!=1,则显示0,表示定时关
	 LCD_Print(" ")                   ; //空一格
	 CharToStr(Timer_Ring)            ; //将歌曲编号转换成相对应的ASCII码
	 LCD_Print(DATA)                  ; //显示歌曲编号
	 while(--w)                         //在定时器显示状态下,大约在2s内没有按下
	    {                               //功能键,就返回正常显示状态
		  Delay1ms(100)               ; 
		  key=Key_Scan()              ;
		  if(key==1) 
		  {Timer_set_sin=1;break;}
		 }

     if(Timer_set_sin)                  //如果Timer_set_sim为1,则进入定时器设定状态 
	   {  LCD_ShowMode(LCD_SHOW|LCD_CORSOR|LCD_FLASH);	//开光标,光标闪烁
T_hour_set:LCD_GoToXY(3,2)            ; //定时器时设定
		   key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto T_minute_set ;//如果按下的是功能键(1号键),转定时器分设定
		   if(key==2) Timer_hour++    ;	//如果按下的是加1 键(2号键),定时器时加1
		   if(Timer_hour==24)           //时上限循环     
		      Timer_hour=0            ;         
		   if(key==3) Timer_hour--    ; //如果按下的是减1 键(3号键),定时器时减1
		   if(Timer_hour==-1)			//时下限循环
		      Timer_hour=23           ;
		   LCD_GoToXY(3,2)            ;
		   CharToStr(Timer_hour)      ; //将校正后的定时器时数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms
		   LCD_Print(DATA)            ; //定时器时显示刷新
		   goto T_hour_set            ;	//定时器时设定循环
		            
T_minute_set:LCD_GoToXY(6,2)          ; //定时器分设定
		   key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto T_ON_OFF   ;	//如果按下的是功能键(1号键),退出校正状态
		   if(key==2) Timer_minute++  ;	//如果按下的是加1 键(2号键),分加1
		   if(Timer_minute==60)         //分上限循环       
		      Timer_minute=0          ;         
		   if(key==3) Timer_minute--  ; //如果按下的是减1 键(3号键),分减1
		   if(Timer_minute==-1)			//分下限循环
		      Timer_minute=59         ;
		   CharToStr(Timer_minute)    ; //将校正后的分数据转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms 
		   LCD_Print(DATA)            ; //分显示刷新
		   goto T_minute_set          ;	//分校正循环
 
 T_ON_OFF: LCD_GoToXY(9,2)            ; //定时器开/关设定
           key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto T_song_set ; //如果按下的是功能键(1号键),转定时器分校正
		   if(key==2||key==3) 		    
		   Timer_ON_OFF=!Timer_ON_OFF ;	//按下加1键或减1键,定时器开关标志(Timer_ON_OFF),
									    //取反,因为它只有开(1)和关(0)两种状态
		   Delay1ms(50)               ; //延时100ms 
		   if(Timer_ON_OFF==1) LCD_Print("1");//如果Timer_ON_OFF=1,则显示1,表示定时开
	       else  LCD_Print("0")       ; //如果Timer_ON_OFF=0,则显示0,表示定时关
		   
		   goto T_ON_OFF              ;	//定时器开/关设定循环

T_song_set:LCD_GoToXY(11,2)           ; //定时器提示铃声设定
           key=Key_Scan()             ; //键盘扫描  
 	       if(key==1) goto T_RET      ;	//如果按下的是功能键(1号键),退出定时器设定状态
		   if(key==2) Timer_Ring++    ;	//如果按下的是加1 键(2号键),铃声编号加1
		   if(Timer_Ring==4)                
		      Timer_Ring=1            ;         
		   if(key==3) Timer_Ring--    ; //如果按下的是减1 键(3号键),铃声编号减1
		   if(Timer_Ring==0)
		      Timer_Ring=3            ;
		   CharToStr(Timer_Ring)      ; //将铃声编号转换成相对应的ASCII码
		   Delay1ms(50)               ; //延时100ms 
		   LCD_Print(DATA)      	  ; //铃声编号显示刷新
		   Ring()                     ;
		   goto T_song_set            ; //定时器提示铃声设定循环

    T_RET:Timer_set_sin=0             ; //退出定时器设定状态
		  LCD_ShowMode(LCD_SHOW|LCD_NO_CORSOR|LCD_NO_FLASH); //关光标,光标不闪烁
	  }
   	Timer_Show_sin=0                  ; //退出定时器显示状态							      
 }  
/***主程序**************************************************************************/
void main(void)
{ float i=0; unsigned char keys ;
Delay1ms(250)                   ; 
LCD_Initial()                   ;       //LCD1602初始化
Delay1ms(100)                   ;
LCD_Print("    Welcome")        ;       //开机画面
Delay1ms(50)                    ;
LCD_GoToXY(0,2)                 ;
LCD_Print("   HangKaiKun")      ;
Delay1ms(250)                   ;	    //延时250ms
Delay1ms(250)                   ;       //延时250ms
Delay1ms(250)                   ;	    //延时250ms
Delay1ms(250)                   ;	    //延时250ms
Delay1ms(250)                   ;	    //延时250ms
LCD_Write(LCD_COM,LCD_CLEAR)    ;       //清屏
IT1=1                           ;       //置INT1为边沿触发模式
IT0=1                           ;       //置INT0为边沿触发模式
PX1=1                           ;       //置INT1为高优先级
IE=0x84                         ;	    //INT1开中
while(1)
{keys=Key_Scan()                ;       //键盘扫描 
     if(keys==1)				        //若为功能键,转校时程序
        Set_TimeAndDate()       ;     
 	 if(keys==2)						//若为加1 键,转定是显示程序
	    Timer_Show_Set()        ;
	 if(keys==4&&!Speak_sin)			//若为报时键,转语音报时程序
	    SpeakTime()             ;
	 if(Timer_sin)				        //判断是否响铃
	    Ring()                  ;		//是,则转响铃程序
 
 while(Temperature_sin)
      {float i                  ;
       i=ReadTemperature()      ;       //读取温度值
       IntToStr(i)              ;       //将温度值转换成相对应的ASCII码
       LCD_GoToXY(9,2)          ;		//定位到温度显示区
       LCD_Print(temp)          ;		//显示温度
       Temperature_sin=0        ;		//表示温度处理完毕
      }	
  }
}
/***中断1服务程序(用于完成计时和日历转变和刷新,以及判断定时是否已到)***************/
void int1(void) interrupt 2 using 1
{	
     second++                               ; //秒加1
	 led_on--                               ; //LCD背光时间值减1
	 if((second%2==0)&&!Timer_sin)			  //如果不在定时器显示或设计状态,则每隔
		  Temperature_sin=1                 ; //两秒启动一次温度检测
	 if(led_on==-1)							  //LCD背光灯亮的时间结束,关闭LCD背光灯
	       led_on=0                         ; 
	 if(second==60)							  //若秒满60,则秒置0,分加1
	   { second=0                           ;
	     minute++                           ;
		 if(minute==60)		     			  //若分满60,则分置0,时加1
		   { minute=0                       ;
		     hour++                         ; 
			 if(hour==24)					  //若时满24,则时置0,日和星期加1
			   { hour=0                     ;
			     week++                     ;
				 day++                      ;
				 if(week==8)      			  //若星期满8,则星期置1,
				    week=1                  ;		 
			     if(day==days)				  //若日满28(二月)、29(润年二月、30(月小)
			       { day=1                  ; //	  31(月大),则日置1,月加1
			         month++                ;
					 Momth_Days(month)      ; //确定校正后,月的天数
			         if(month==13)			  //若月满13,则月置1
				       { month=1            ;
				         year++             ;
						 Momth_Days(month)  ; //确定校正后,月的天数
						 Leap_Year(year)    ; //判断润年
				    	 if(year==100)		  //若年满100,则年置0
					         year=0         ;  
							 Leap_Year(year); //判断润年
						}
					}
				}
			}
		}
	 
     if(~Timer_Show_sin)
	 {
	   if((Timer_hour==hour)&&(Timer_minute==minute)&&second==0)//判断定时是否已到
	    if(Timer_ON_OFF) Timer_sin=1;
	   LCD_GoToXY(0,1)    ;	            //年刷新
	   LCD_Print("20")    ;
	   CharToStr(year)    ;	            //年数据转成ASCII码
	   LCD_Print(DATA)    ;
	   LCD_Print("-")     ;             //在年显示后面显示“-”
	   CharToStr(month)   ;             //月数据转成ASCII码
	   LCD_Print(DATA)    ;				//月刷新
	   LCD_Print("-")     ;             //在月显示后面显示“-” 
	   CharToStr(day)     ;             //日数据转成ASCII码
       LCD_Print(DATA)    ;				//日刷新
	   WeekToStr(week)    ;             //星期数据转成ASCII码
	   LCD_GoToXY(12,1)   ;				//定位到星期显示区
       LCD_Print(Week_Str);				//星期刷新
	   CharToStr(hour)    ;             //时数据转成ASCII码
	   LCD_GoToXY(0,2)    ;				//定位到时显示区
 	   LCD_Print(DATA)    ;				//时刷新
	   LCD_Print(":")     ;             //在小时显示后显示“:”
	   CharToStr(minute)  ;	            //分数据转成ASCII码
	   LCD_Print(DATA)    ;				//分刷新
	   LCD_Print(":")     ;	            //在分显示后显示“:” 
	   CharToStr(second)  ;	            //秒数据转成ASCII码
	   LCD_Print(DATA)    ;				//秒刷新
	 }
}
/***中断0服务程序(完成发音任务)*****************************************************/
void int0(void) interrupt 0 using 2
{	 
	 if(Timer_sin&&!Speak_sin)	        //
		{ Delay1ms(50)          ;       //
		  Play=0                ;       //放音
		  Delay1ms(10)          ;       //延时10ms
		  Play=1 			    ;
		 }  		   		  
	 if(Speak_sin)	  
	   { if(Speak[Number]==0xff)		//报时时,遇到'\0',报时结束
	      { EX0=0			    ;		//
		    Number=0            ;		//
		   	Speak_sin=0         ; 		//
		   }     
	     else 
		   { P1=Speak[Number]   ;		//
		     Delay1ms(50)       ;		//
		     Play=0             ;		//放音
		     Delay1ms(10)       ;       //延时10ms
		     Play=1             ;		//
		     Number++           ;		//下一个音
			}
		} 
		           
}    
		  

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?