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

📄 hptv._c

📁 MCU控制程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
}
void i2c_command5(void)    //i2c5字节接收处理----实际数据未处理,可测试通讯协议
{uchar i;
   i=I2cReceiveData[0];     
   switch(i)
   {                       //测试时可串口输出数据
     case 0xff:            //定时关机时间数据,数组I2cReceiveData[1-4]
//	 UDR=0xff;
	 CloseTime_b=1;
	 WriteTime(&CloseTime.CBit[0],4);//写入时间数据
/*	         UDR=CloseTime.CBit[0];
		     while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[1];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[2];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[3];
*/			 
	 CloseTime.Cstime=CloseTime.Cstime+timer_s;
	 //WriteCloseTime();
/*	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[1];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[2];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[3];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[4];*/
	 break;
	 case 0xfe:            //定时开机时间数据,数组I2cReceiveData[1-4]
//	 UDR=0xfe;
	 OpenTime_b=1;
	 WriteTime(&OpenTime.OBit[0],4);//写入时间数据
//	         UDR=OpenTime.OBit[0];
//		     while(!(UCSRA&(1<<UDRE)));
//	         UDR=OpenTime.OBit[1];
//	         while(!(UCSRA&(1<<UDRE)));
//	         UDR=OpenTime.OBit[2];
//	         while(!(UCSRA&(1<<UDRE)));
//	         UDR=OpenTime.OBit[3];
     OpenTime.Ontime=OpenTime.Ontime+timer_s;
	 //WriteTime();
/*	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[1];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[2];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[3];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[4];
	 break;*/
	 
   }
   
}
void i2c_command7(void)    //i2c7字节接收处理
{uchar i;
   i=I2cReceiveData[0];
   if(i==0xfd)
   {
    set_time=EEPROMread(0xf0); //调点后重新启动时读取用户是否已设定时间标志
    if(set_time!=0)
    {
	  set_time=0x00;             //写入时间
      EEPROMwrite(0xf0,set_time);// 记录用户已设置过时间状态
	 // set_time=0xff;
	}
/*	 while(!(UCSRA&(1<<UDRE)));
	 UDR=0x60;
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[1];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[2];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[3];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[4];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[5];
	 while(!(UCSRA&(1<<UDRE)));
	 UDR=I2cReceiveData[6];
*/	 	
    WriteTime(&Time.CBit[0],6);//写入时间数据
	DecTime(timer_s);          //减去当前定时器的9s内的s数
	//WriteTime();
   }
//    TCCR1B = 0x00; //停止计时	
//    TCNT1H = 0x02; //reload counter high value
//    TCNT1L = 0xE1; //reload counter low value
//    TCCR1B = 0x05; //start Timer
//	UDR= I2cReceiveData[0];
//  UDR=i;
	 

 
}
//#############################################################
void main(void)
{
   init_var();
   init_devices();
//Add for IR  
   IR_var_init();
   init_time();
   IR_ys();
   GICR=0x40;

//Add end   
   WDR();
  // EEPROMwrite(0x80,FAC_CLOSE);// 给初值,非工厂状态
   
  // fac_state=FAC_CLOSE;
  // UDR=fac_state;
    set_time =EEPROMread(0xf0);  //读取是否需要申请掉电后时间重设置
    fac_state=EEPROMread(0x80);
	UDR=0xEE;
	while(!(UCSRA&(1<<UDRE)));
	UDR=fac_state;
   if(fac_state==FAC_OPEN)    //是否为工厂状态,如是则开机
   {
       ys();
       open_machine();
	   PORTB&=~(1<<EDID_RWEN);  //打开i2c参数使能
   }
   ///###################测试i2c

  // start_iocheck();           //第一次启动io检测
   while(1)
     {
	    WDR();
//		PORTC|=1<<6;
//		PORTC&=~(1<<7);
		if(time1_b)
		   {
		     time1_b=0;
			 time1_cl();   //定时器1代码移植到此
		      
			 if(tv_state)           //io口检测
			 {
			      iocheck_num++;
		          if(iocheck_num>10)//调用io状态检测  500ms检测一次
			      {
			         io_check();
			         
			         iocheck_num=0;
//			         PORTA|=(1<<7); //置1,恢复数据
                    
					if(Open_Panel_flag==1)
					{
					   Open_Panel_time++;
					   if(Open_Panel_time>=20)
					   {
					   		PORTD&=0xbf;
							Open_Panel_flag=0;
							Open_Panel_time=0;				  
					   }
					}
                    
					
					if(Panel_Open_delay_Signal==1)
					{
					  Panel_Open_delay_Time++;
					  if(Panel_Open_delay_Time==3)
					  {
					     Panel_Open_delay_Signal=0;
						 Panel_Open_delay_Time=0;
						 System_State=working;
						 PORTD&=0xbf;
						 PORTA|=(1<<1);
						 PORTA|=(1<<A_MUTE);
						 
					  }
					}					

					if(Powerdown_signal==1)
					{
					  if(System_State==working)
					  {
					     while(!(UCSRA&(1<<UDRE)));
					  	 UDR=0x92;
					  	 Powerdown_time++;
					  	 if(Powerdown_time==2)
					  	 {
					        Powerdown_time=0;
						 	Powerdown_signal=0;
						 	power_on_close_enable=1;
					  	 }
					   }
					   else
					   {	
					     Powerdown_time=0;
						 Powerdown_signal=0;
					   }   
					}
					 
                    if(command_2d==0)  //时间范围设定
					{
                     if((PIND&(1<<5))==0)
					 {
					   PORTD&=~(1<<4);
					   PORTD|=(1<<5);
					   //UDR=0X66;
					  }
					 else
					 {
					   PORTD|=(1<<4);
					   PORTD&=~(1<<5);
					  // UDR=0X77;
					 }
					} 
		          }
			 }
			 else
			 {
			      iocheck_num=0;
			 }
             time1s_num++;
			 if(time1s_num>=20)  //1s
			 {
			  // time1s_b=1;
			   time1s_num=0;
			   timer_s++;
			  // UDR=timer_s;
			   if(opentime_min)
			   {
			      opentime_min--;
				  OpenTime.Ontime=OpenTime.Ontime-1;
//				  UDR=OpenTime.OBit[0];
		     /*     while(!(UCSRA&(1<<UDRE)));
	              UDR=OpenTime.OBit[1];
	              while(!(UCSRA&(1<<UDRE)));
	              UDR=OpenTime.OBit[2];
	              while(!(UCSRA&(1<<UDRE)));
	              UDR=OpenTime.OBit[3];*/
				  if((opentime_min==0)||(closetime_min>8))
				  {
				       OpenTime_b=0;              //开机时间计数到停止更新
					   closetime_min=0;
				       if(tv_state==0)             //如果为关机状态则
			           {
			             power_key_open_enable=1;  //开机
			           }
				  }
			   }
			   if(CloseTimeMin_b)
			   {
			      closetime_min--;
				  CloseTime.Cstime=CloseTime.Cstime-1;
//				  UDR=CloseTime.CBit[0];
		    /*    while(!(UCSRA&(1<<UDRE)));
	              UDR=CloseTime.CBit[1];
	              while(!(UCSRA&(1<<UDRE)));
	              UDR=CloseTime.CBit[2];
	              while(!(UCSRA&(1<<UDRE)));
	              UDR=CloseTime.CBit[3];*/
				  if((closetime_min==0)||(closetime_min>8))
				  {
				     CloseTime_b=0;              //关机时间计数到停止更新 
					 CloseTimeMin_b=0;
					 if(tv_state)                //申请关机,请求发送i2c命令
					 {
					   STATE|=(1<<7);         //最高位置1 
					   I2cSendData[0]=irda_data;
		               I2cSendData[1]=key;
                       I2cSendData[2]=STATE;
					   PORTA&=0x7F;    //  PA7置0  申请发送数据
					   STATE&=0x7f;
					   Clear_Timer_Close_Machine();
					 }
				  }
			   }
			 }
			 
		   }
		if(time0_b)        //time0处理代码移动到此
		   {
		       time0_b=0;
			   time0_cl();
			   if(time0_num>8)//启动按键采样  9ms一次
			   {
			      time0_num=0;
				  ADCSRA|=(1<<ADSC);//启动ad
			   }
			   if(uart0_b)    // 串口数据分析
		       {
		            u0check_num++;                //超时计数
					if((u0check_num>100)&&(uart0_num!=5))//超时溢出,通讯错误
					{
				  	 uart0_num=0;                //恢复初状态
				  	 uart0_b=0;
				  	 u0check_num=0;
					}
					if(uart0_num>=5)              //通讯正常
					{
				  
				  	 uart0_cl();                 //调用通讯处理函数
				  	 //UDR=0x55;
					 }
		     	}  
			   
		   }
		if(key_b)          //按键处理
		   {
		     key_b=0;
		     adc_cl();     //
		   }    
		if(power_key_open_enable==1&&open_machine_enable==1)//power_key open machine
		   {
		     
             UDR=0x86;  
			 open_machine();
			 power_key_open_enable=0;
		   }
		if(power_on_close_enable==1&&close_machine_enable==1)//power_on close machine
		   {
             UDR=0x88;
			 Clear_Timer_Close_Machine();
		     close_machine();
			 power_on_close_enable=0;
		   }
   
      /*----如果i2c被申请,则调用i2c处理函数-----------
		                    其字符位结构如下
						    7    6   5     4    3    2    1    0
						    irda key io56  io4  io3  io2  io1  io0----*/
							
		if((i2c_public!=0)&&(PINA&0x80))	//记录变化量, 看i2c是否被占用
//        if((i2c_public!=0))  
		{
		
		     
		     DDRA|=(1<<7);   //  改变为输出状态 
//		     PORTA&=0x7F;    //  PA7置0  申请发送数据
		                        
		     I2cSendData[0]=irda_data;
			 irda_data=0;
             I2cSendData[1]=key;
 			 key=0;
/*             while(!(UCSRA&(1<<UDRE)));
			 UDR=I2cSendData[0];
             while(!(UCSRA&(1<<UDRE)));			 
			 UDR=I2cSendData[1];
			 while(!(UCSRA&(1<<UDRE)));
			 UDR=STATE;
*/			 
	 
             I2cSendData[2]=STATE;
             PORTA&=0x7F;
			 
		     i2c_public=0;

			// i2c_b=1;
		   } 
		
		if(i2creceive_b) //接收到i2c命令后处理
		{    
//		   UDR=I2cReceiveData[0];
		   i2creceive_b=0;
//		   UDR=I2cReceiveData[0];
		   if(I2cReceiveDataIndex==1)      //处理i2c命令
		   {
		     i2c_command=I2cReceiveData[0];
//			 while(!(UCSRA&(1<<UDRE)));
//			 UDR=0x90;
//			 while(!(UCSRA&(1<<UDRE)));
//			 UDR=i2c_command;
		     if((command_2d==0)&&(i2c_command==0x2d))             //开机后第一次收到2d命令
			 {
		       command_2d=1;
			   PORTD|=(1<<4);
			   PORTD&=~(1<<5);     //开机后灯的状态恢复
			   Panel_Open_delay_Signal=1;
			   System_State=delaying;
			   
//			   PORTD&=0xbf;        //打开VS_ON
//			   PORTA|=(1<<1);      //打开显示
			   if((set_time==0)&&(Time.VS.TL==0)&&(Time.VS.TH==0))    //掉电后需要更新时间设置
			   {
//			     set_time=0xff;  //通过set_time来判断是否需要更新
				 init_time();
				 key|=(1<<7);    //申请time reset
			   }
		       I2cSendData[0]=irda_data;
               I2cSendData[1]=key;
               I2cSendData[2]=STATE;   //数据进入发送缓冲区
		       DDRA|=(1<<7);   //  改变为输出状态 
		       PORTA&=0x7F;    //  PA7置0  申请发送数据
			 }
//			 UDR=i2c_command;
	         i2c_command1();               
		   } 
		   else if(I2cReceiveDataIndex==5) //处理5字节接收
		   {
		     i2c_command5();               
		   }
		   else if(I2cReceiveDataIndex==7)
		   {
		     i2c_command7();
		   }
		   else
		   {
		     I2cReceiveDataIndex=0;
		   }
		    
		} 
		if(timer1_b)
		{
		   //UDR=9;
//		   closetime_min=0;
//		   opentime_min=0;
		   timer1_b=0;
		   if(set_time==0)//已设置时间
		   {
		    AddTime(9);                     //时间更新9s累加
		   }
	
		   timer_s=0;                      //清除9s内计数
		   time1s_num=0;
		  // time1s_b=0;
		   if(OpenTime_b)                  //开机时间更新
		   {
		     OpenTime.Ontime=OpenTime.Ontime-9;
//			 UDR=OpenTime.OBit[0];
		 /*    while(!(UCSRA&(1<<UDRE)));
	         UDR=OpenTime.OBit[1];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=OpenTime.OBit[2];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=OpenTime.OBit[3];*/
	      if(OpenTime.Ontime==0)        //开机
			 {
			   OpenTime_b=0;               //开机时间计数到停止更新
			   if(tv_state==0)
			   {
			    power_key_open_enable=1;  //开机
			   }
			 }
			 else if(OpenTime.Ontime<9)
			 {
			   opentime_min=OpenTime.Ontime;//启动9秒内检测  
			 }
			 else
			 {
			   opentime_min=0;
			 }
			 
		   }
/*
		   if(CloseTime_b)                 //关机时间更新
		   {
		     CloseTime.Cstime=CloseTime.Cstime-9;
			 UDR=CloseTime.CBit[0];
		     while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[1];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[2];
	         while(!(UCSRA&(1<<UDRE)));
	         UDR=CloseTime.CBit[3];
			    if(CloseTime.Cstime==0)        //关机
			 	{
			  	    CloseTime_b=0;              //关机时间计数到停止更新 
					if(tv_state)                //申请关机,请求发送i2c命令
					{
					   pb_state|=(1<<7);         //最高位置1 
					   PORTA&=0x7F;    //  PA7置0  申请发送数据
					}
				}
				else if(CloseTime.Cstime<9)
			 	{
			  	 	closetime_min=CloseTime.Cstime;
			 	}
				else
			 	{
			  	 	closetime_min=0;
			 	}
		   }
*/		   
		   if(CloseTime_b)
		   {
		   	  if(CloseTime.Cstime>9)
			  {
			     CloseTime.Cstime=CloseTime.Cstime-9;
				 if(CloseTime.Cstime<9)
				 {
				  	closetime_min=CloseTime.Cstime;
					CloseTime_b=0;
					CloseTimeMin_b=1;
				 }			 
			  }
			  else
			  {
			     if(CloseTime.Cstime==9)
				 {
					CloseTime_b=0;
					if(tv_state)                //申请关机,请求发送i2c命令
					{
					   pb_state|=(1<<7);        //最高位置1 
					   if(tv_state)                //申请关机,请求发送i2c命令
					   {
					   	  STATE|=(1<<7);         //最高位置1 
					   	  I2cSendData[0]=irda_data;
		               	  I2cSendData[1]=key;
                       	  I2cSendData[2]=STATE;
					   	  PORTA&=0x7F;    //  PA7置0  申请发送数据
					   	  STATE&=0x7f;
						  Clear_Timer_Close_Machine();
	    			   }
     				}				 
				 }
     		  }  
	   
		   }
		   
		   
		   		   
		}  
		
	 }

}

⌨️ 快捷键说明

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