⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_lsd.c

📁 用单片机的C语言实现的开机时间显示上次关机时间(存在看门狗里)
💻 C
📖 第 1 页 / 共 4 页
字号:
			if ( hour1 == 0 )
			{
				if ( hour0 == 0 )
				{
					hour1 = 2;
					hour0 = 3;
				}
				else
				    hour0--;
			}
			else if ( hour0 == 0 )
			{
				hour1--;
				hour0 = 9;
			}
			else
			    hour0--;
		}

	 	display( hour1,8,0xBA,0x40,1 );
 		display( hour0,8,0xBA,0x48,1 );
 		hour = ( hour1 << 4 ) | hour0; //pass new hour
 		
 		if ( Key == 4 )
 		    break;
 		else if ( Key == 3 )
 		    goto MINUTE;
 		goto HOUR;
		
	//set minute
    MINUTE:
        display( 0x19,16,0xBA,0x60,0 ); //分
        Key = KeyboradScan();
        while ( ( Key ==0 ) | ( Key > 4 ) )
        {
        	Key = KeyboradScan();
    	} 
    	delay( 10 );
 		if ( Key == 1 ) // add
 		{
 			if ( minute1 == 5 )
 			{
 				if ( minute0 == 9 )
 				{
 					minute1 = 0;
 					minute0 = 0;
				}
				else
				    minute0++;
			}
			else if ( minute0 == 9 )
			{
				minute1++;
				minute0 = 0;
			}
			else
			    minute0++;
		}
		
		if ( Key == 2 ) //substract
		{
			if ( minute1 == 0 )
			{
				if ( minute0 == 0 )
				{
			    	minute1 = 5;
	    			minute0 = 9;					
				}
				else
				    minute0--;
			}
			else if ( minute0 == 0 )
			{
				minute1--;
				minute0 = 9;
			}
			else
			    minute0--;
		}

	 	display( minute1,8,0xBA,0x58,1 );
 		display( minute0,8,0xBA,0x60,1 );
 		minute = ( minute1 << 4 ) | minute0; //pass new day
 		
 		if ( Key == 4 )
 		    break;
 		else if ( Key == 3 )
 		    goto SECOND;
 		goto MINUTE;
 		
 	//set second
    SECOND:
        display( 0x20,16,0xBA,0x60,0 ); //秒
        Key = KeyboradScan();
        while ( ( Key ==0 ) | ( Key > 4 ) )
        {
        	Key = KeyboradScan();
    	} 
    	delay( 10 );
 		if ( Key == 1 ) // add
 		{
 			if ( second1 == 5 )
 			{
 				if ( second0 == 9 )
 				{
 					second1 = 0;
 					second0 = 0;
				}
				else
				    second0++;
			}
			else if ( second0 == 9 )
			{
				second1++;
				second0 = 0;
			}
			else
			    second0++;
		}
		
		if ( Key == 2 ) //substract
		{
			if ( second1 == 0 )
			{
				if ( second0 == 0 )
				{
			    	second1 = 5;
	    			second0 = 9;					
				}
				else
				    second0--;
			}
			else if ( second0 == 0 )
			{
				second1--;
				second0 = 9;
			}
			else
			    second0--;
		}

		display( second1,8,0xBA,0x70,1 );
 		display( second0,8,0xBA,0x78,1 );
 		second = ( second1 << 4 ) | second0; //pass new day
 		if ( Key == 4 )
 		    break;
 		else if ( Key == 3 )
 		    goto YEAR;
 		goto SECOND;
	}
	
    WriteInto8653=WrStr(wr_addr,0x00,0x00);  //write time into the PCF8563
    WriteInto8653=WrStr(wr_addr,0x01,0x00);
    WriteInto8653=WrStr(wr_addr,0x08,year); //year
    WriteInto8653=WrStr(wr_addr,0x07,month);//month
    WriteInto8653=WrStr(wr_addr,0x06,date); //weekday
    WriteInto8653=WrStr(wr_addr,0x05,day); //date
    WriteInto8653=WrStr(wr_addr,0x04,hour);//hour
    WriteInto8653=WrStr(wr_addr,0x03,minute);//minitute
    WriteInto8653=WrStr(wr_addr,0x02,second);//second
}
/****************************************************************/

/*****************************************************************
          The module of display Current Time function
*****************************************************************/
void DisplayCurrentTime( )	
 {
  year=RdStr(wr_addr,0x08); //read infomation about time
  month=RdStr(wr_addr,0x07);
  day=RdStr(wr_addr,0x05);
  hour=RdStr(wr_addr,0x04);
  minute=RdStr(wr_addr,0x03);
  second=RdStr(wr_addr,0x02);
  date=RdStr(wr_addr,0x06);
  
  WriteByte(year,0x00);       //save off time 
  WriteByte(month,0x01);
  WriteByte(day,0x02);
  WriteByte(hour,0x03);
  WriteByte(minute,0x04);
  WriteByte(second,0x05);
  WriteByte(date,0x06);
 
  year1=(year>>4)&0x0f;	
  year0=year&0x0f;
  month1=(month>>4)&0x01;
  month0=month&0x0f;
  day1=(day>>4)&0x03;
  day0=day&0x0f;
  hour1=(hour>>4)&0x03;
  hour0=hour&0x0f;
  minute1=(minute>>4)&0x07;
  minute0=minute&0x0f;
  second1=(second>>4)&0x07;
  second0=second&0x0f;
  date0=date&0x07;
  
  display(year1,8,0xb8,0x40,0);    //display the current time
  display(year0,8,0xb8,0x48,0);
  display(0x07,16,0xb8,0x50,0);
  display(month1,8,0xb8,0x60,0);
  display(month0,8,0xb8,0x68,0);
 	
  display(0x08,16,0xb8,0x70,0);
  display(day1,8,0xb8,0x40,1);
  display(day0,8,0xb8,0x48,1);
  display(0x00,16,0xb8,0x50,1);
  display(0x09,16,0xb8,0x60,1);
  display(date0,16,0xb8,0x70,1);
 	
  display(0x10,16,0xba,0x40,0); 
  display(0x11,16,0xba,0x50,0);
  display(0x12,16,0xba,0x60,0);
  display(0x13,16,0xba,0x70,0);
 	
  display(hour1,8,0xba,0x40,1);
  display(hour0,8,0xba,0x48,1);
  display(0x10,8,0xba,0x50,1);
  display(minute1,8,0xba,0x58,1);
  display(minute0,8,0xba,0x60,1); 
  display(0x10,8,0xba,0x68,1);
  display(second1,8,0xba,0x70,1);
  display(second0,8,0xba,0x78,1); 
  return; 
  }
/*************************************************/

/*****************************************************************
          The module of check for handing on data function
*****************************************************************/
void CheckSend( )
 {
	if ( ( year4 == year ) & ( month4 == ( month & 0x3F ) ) ) 
	{
		if ( ( date4 == ( day & 0x3F ) ) & ( hour4 == ( hour & 0x3F ) ) )
		{
			if( ( minute4 == ( minute & 0x7F )) & ( second4 == ( second & 0x7F ) ) )
			{
				flag = 1;
				TI = 1;
			}
		}
	}	
 }
/************************************************************/


/************  初始化定时和串口中断 ************************/
void TnitialTimeAndSerialCom( )
 {
      n=0; // 给n赋初值
      IndexForCom = 0;
      address_ram=0;// 初始化address_ram,即初始化62256
      address_scom = 0; //ready for serial port communication;
      
      IE=0x92;     // T/C0开中断,CPU开中断
      IP=0x10;
      TMOD=0x21;  // T/C0工作在定时器方式1,T/C1工作在定时器方式2
      
      PCON = 0x00;//1200bps
	  SCON = 0x50;//serial port mode 1
      
      TH0=(65536-46080)/256;// 设置定时器,每50ms响应一次中断(若晶振为12MHz)
      TL0=(65536-46080)%256;//(因为实验箱提供的是11.0592MHz的晶振)
      TH1 = 0xE8;
	  TL1 = 0xE8;
	        
      TR1=1;//start the serial com1
      TR0=1;    // 启动T/C0开始定时	   
 }

/*************  中断采用定时器0的方式(中断定时采集在时间上要比延时采集精确)  *******************/ 
void AD( ) interrupt 1 // T/C0中断服务程序入口
{
  uchar b,b1,b0;
  uchar i;
  TH0=(65536-46080)/256;
  TL0=(65536-46080)%256;
  n=n+1;
  if ( address_ram < 32760 ) 
   { 
   	if(n==40) //每40*50ms=2s采集一次数据
    { 
     n=0;   
     IN0=0;
     i=i; //延时等待ADEOC变低
     i=i;
     while(ADEOC==0);
     
     b=IN0;
  	 XBYTE[address_ram]=b;
  	 XBYTE[address_ram+1]=month & 0x1F;
  	 XBYTE[address_ram+2]=day & 0x3F;
  	 XBYTE[address_ram+3]=hour & 0x3F;
  	 XBYTE[address_ram+4]=minute & 0x7F;
  	 XBYTE[address_ram+5]=second & 0x7F; 
     b1=(b>>4)&0x0f;
     b0=b&0x0f;
     
     display(0x09,16,0xbc,0x40,0);
     display(0x25,16,0xbc,0x50,0);//数
     display(0x26,16,0xbc,0x60,0);//据
     display(0x23,16,0xbc,0x70,0);//采
     display(0x24,16,0xbc,0x40,1);//集
     display(0x27,16,0xbc,0x50,1);//中
     display(0x18, 8,0xbc,0x60,1);//.
     display(0x18, 8,0xbc,0x68,1);//.
     display(0x18, 8,0xbc,0x70,1);//.
     XBYTE[ 0xE000 ] = 0xEF;   //点亮一绿灯        
     
     display(b1,8,0xbe,0x78,0);//显示采集数据
     display(b0,8,0xbe,0x40,1);
        	
     display( 0x09,16,0xBE,0x40,0 ); 
     display( 0x09,16,0xBE,0x50,0 );  
     display( 0x09,16,0xBE,0x60,0 ); 
     display( 0x11, 8,0xBE,0x70,0 );         	 	
     display( 0x11, 8,0xBE,0x48,1 ); 
     display( 0x09,16,0xBE,0x50,1 );  
     display( 0x09,16,0xBE,0x60,1 ); 
     display( 0x09,16,0xBE,0x70,1 ); 
     address_ram = address_ram + 6;
     }
     else 
     {
       DisplayCurrentTime();
       CheckSend(); //check whether hand on time matches
       XBYTE[ 0xE000 ] = 0xFF;  
     }
     }         
  else 
    address_ram = 0;      	
}
/*****************************************************/

/*****************************************************************
          The module of serial communication function
*****************************************************************/
void SerialCom(  ) interrupt 4
{
	uchar Command[5]; 
	
	if ( RI == 1 )
	{
		RI = 0;		
	    Command[IndexForCom] = SBUF;
	    if ( Command[0]!= 0 )
	       return;
	    else
	       IndexForCom++;
		    if ( IndexForCom != 5 )		    
		        return;
		    else
	        {	
	        	IndexForCom = 0;	              	      	
               
                display(0x09,16,0xbc,0x40,0);
                display(0x21,16,0xbc,0x50,0);//正
                display(0x22,16,0xbc,0x60,0);//在
                display(0x31,16,0xbc,0x70,0);//搜
                display(0x32,16,0xbc,0x40,1);//索
                display(0x27,16,0xbc,0x50,1);//中
                display(0x18, 8,0xbc,0x60,1);//.
                display(0x18, 8,0xbc,0x68,1);//.
                display(0x18, 8,0xbc,0x70,1);//.
                XBYTE[0xE000] = 0xDB; //点亮红灯         
       	
               	display( 0x09,16,0xBE,0x40,0 ); 
            	display( 0x09,16,0xBE,0x50,0 );  
             	display( 0x09,16,0xBE,0x60,0 ); 
       	        display( 0x09,16,0xBE,0x70,0 );         	 	
       	        display( 0x09,16,0xBE,0x40,1 ); 
              	display( 0x09,16,0xBE,0x50,1 );  
       	        display( 0x09,16,0xBE,0x60,1 ); 
       	        display( 0x09,16,0xBE,0x70,1 );        	        
       	                               
                
	    	   
	    	    for ( address_scom = 0; address_scom <= 32760; address_scom  = address_scom + 6 )
	    	    {
	    	    	 DisplayCurrentTime();	    		     
	    		     if ( ( XBYTE[ address_scom+3 ] >= Command[1] ) & ( XBYTE[ address_scom+3 ] <= Command[3] ) ) //hour matched
	    		     {	    			    
 	    			     if ( (XBYTE[ address_scom+4 ] >= Command[2]) & ( XBYTE[ address_scom+4 ] < Command[4] ) ) //minute matched
 	    			     {
          	                 TI = 1; 
          	                 flag=0;		
	    			         break;
    			         }
    			         else if ( address_scom == 32760 )
    			             break;
    			     }	    		    	
    	       	}//for
	       	}//else        
	    return;	    
	}//if
	
	/////////////////////////////////////
	else if ( ( TI == 1 ) & ( flag == 0 ) )
	{
		TI = 0;
		
		DisplayCurrentTime();
		
        display(0x09,16,0xbc,0x40,0);
        display(0x21,16,0xbc,0x50,0);//正
        display(0x22,16,0xbc,0x60,0);//在
        display(0x29,16,0xbc,0x70,0);//上
        display(0x30,16,0xbc,0x40,1);//传
        display(0x27,16,0xbc,0x50,1);//中
        display(0x18, 8,0xbc,0x60,1);//.
        display(0x18, 8,0xbc,0x68,1);//.
        display(0x18, 8,0xbc,0x70,1);//.
        XBYTE[0xE000] = 0xB6; //点亮黄灯         
       	
       	display( 0x09,16,0xBE,0x40,0 ); 
       	display( 0x09,16,0xBE,0x50,0 );  
       	display( 0x09,16,0xBE,0x60,0 ); 
       	display( 0x09,16,0xBE,0x70,0 );         	 	
       	display( 0x09,16,0xBE,0x40,1 ); 
       	display( 0x09,16,0xBE,0x50,1 );  
       	display( 0x09,16,0xBE,0x60,1 ); 
       	display( 0x09,16,0xBE,0x70,1 );           	 
	  
	   if ( Command[1] == Command[3] )
	    {   
	    	if ( XBYTE[ address_scom+3 ] == Command[1] )
	    	{
	    		if ( XBYTE[ address_scom+4 ] < Command[4] )
		        {
	    		    SBUF = XBYTE[ address_scom ]; 
			        if ( address_scom == 32760 )
			            address_scom = 0;
			        else
			            address_scom = address_scom + 6;
		        }
		        else
		            return;
	        }
	        else
	            return;
	    }
	    else 
	    {   
 		    if ( XBYTE[ address_scom+3 ] < Command[3] )
		    {
	    		SBUF = XBYTE[ address_scom ]; 
			    if ( address_scom == 32760 )
			        address_scom = 0;
			    else
			        address_scom = address_scom + 6;
		    }	    
	    	else 
	    	{
 	    	   	if (  XBYTE[ address_scom+4 ] <= Command[4] )
	    		{
	    			SBUF = XBYTE[ address_scom ]; 
	    		    if ( address_scom == 32760 )
	    		        address_scom = 0;
		    	    else
	    		        address_scom = address_scom + 6;
	    		}
	    		else 
	    		return; 
    		}
    	}//for else    
   	}//for else if
   	
   	/////////////////////////////////////////
   	else if ( ( TI == 1 ) & ( flag == 1 ) )
   	{
   		TI = 0;
		
		DisplayCurrentTime();
				
        display(0x09,16,0xbc,0x40,0);
        display(0x28,16,0xbc,0x50,0);//定
        display(0x12,16,0xbc,0x60,0);//时
        display(0x29,16,0xbc,0x70,0);//上
        display(0x30,16,0xbc,0x40,1);//传
        display(0x27,16,0xbc,0x50,1);//中
        display(0x18, 8,0xbc,0x60,1);//.
        display(0x18, 8,0xbc,0x68,1);//.
        display(0x18, 8,0xbc,0x70,1);//. 
        XBYTE[0xE000] = 0x6D; //点亮绿灯       
       	
       	display( 0x09,16,0xBE,0x40,0 ); 
       	display( 0x09,16,0xBE,0x50,0 );  
       	display( 0x09,16,0xBE,0x60,0 ); 
       	display( 0x09,16,0xBE,0x70,0 );         	 	
       	display( 0x09,16,0xBE,0x40,1 ); 
       	display( 0x09,16,0xBE,0x50,1 );  
       	display( 0x09,16,0xBE,0x60,1 ); 
       	display( 0x09,16,0xBE,0x70,1 );       	
     	
       	 if( address_scom < 180 ) 
       	 { 
       	  SBUF = XBYTE[ address_scom ];
       	  address_scom = address_scom + 6; 
   	     }                
          else
          return;          	  
	}//for else if   	
}
/************************************************************/


/*****************  The top program  **************/
void main( )
{   
   DisplayOffTime(); //显示上次关机时间   
  
   while ( KeyboradScan() != 4 );
   SettingHandonTime();//设置上传时间
 
   SettingCurrentTime();//设置当前时间 
   
   TnitialTimeAndSerialCom( );//调用定时中断采集数据(2秒采集一次),调用串口中断发送指令和上传数据                  
   
   
}

/******************  The End  *********************/





⌨️ 快捷键说明

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