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

📄 hptv._c

📁 MCU控制程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
		 {
		 		 while(!(UCSRA&(1<<UDRE)));
				 UDR=0x69;
				 if(fac_state==FAC_OPEN)              
				 {
					  fac_state=FAC_CLOSE;                      //非工厂状态 
					  PORTB|=(1<<EDID_RWEN);  //关闭i2c参数读写使能 
					  EEPROMwrite(0x80,fac_state);         //擦除工厂状态
				 }
	   
	    //power_on_close_enable=1;  //按键关机 //借用power_on关机
				Powerdown_signal=1;
		  }
		  else
		  {
		     key|=0x80;
			 while(!(UCSRA&(1<<UDRE)));
			 UDR=0x70;
		  }
		  	  
	   }
	}
	if((s8_state==1)&&(key_open==1))
	{
	  power_num++;
	}
	else
	{
	    power_num=0;
	}	
	
	if((power_num==10)&&(s8_state))//    连续按键5s之后打开工厂状态
	{
	   fac_state=FAC_OPEN;                   //打开工厂状态
	   while(!(UCSRA&(1<<UDRE)));
	   UDR=0xAA;
	   s8_state=0; 					 		 //0为工厂状态,芯片出厂默认为非工场状态
	   EEPROMwrite(0x80,fac_state);         //写入工厂状态
	   power_on_close_enable=1;             //之后关机
	}
	
   
}
/*####################按键处理函数,预留7个按键请在此写入功能
void key_menu(void)       //menu键处理函数
{
}
void key_volh(void)       //volh
{
}
void key_voll(void)       //voll
{
}
void key_chh(void)        //chh
{
}
void key_chl(void)        //chl
{
}
void key_source(void)     //source
{
}
void key_enter(void)      //enter
{
}**/
//###############################################################
//-------------键码范围识别-------------------------
void key_cl(uchar i)
{

  unsigned int key_8;
  if((i>KEYPOWER_MIN)&&(i<KEYPOWER_MAX))
  {
   KeyResult=KEY_POWER;
//      UDR=i;
	//UDR=key;           //测试
	key_powercl();
	goto keycl;
  }
  
  if((i>KEYMENU_MIN)&&(i<KEYMENU_MAX))
  {
    KeyResult=KEY_MENU;
//	   UDR=i;
	//UDR=key;
	//key_menu();
	goto keycl; 
  }
  if((i>KEYVOLH_MIN)&&(i<KEYVOLH_MAX))
  {
   // key_volh();
    KeyResult=KEY_VOLH;
//	UDR=i;
	goto keycl;
  }
  if((i>KEYVOLL_MIN)&&(i<KEYVOLL_MAX))
  {
   // key_volh();
    KeyResult=KEY_VOLL;
//	UDR=i;
	goto keycl;
  }
  if((i>KEYCHH_MIN)&&(i<KEYCHH_MAX))
  {
    //  key_chh();
    KeyResult=KEY_CHH;
//	UDR=i;
	goto keycl;
  }
  if((i>KEYCHL_MIN)&&(i<KEYCHL_MAX))
  {
    //  key_chl();
    KeyResult=KEY_CHL;
//	UDR=i;
	goto keycl;
  }
  if((i>KEYSOURCE_MIN)&&(i<KEYSOURCE_MAX))
  {
    //  key_source();
    KeyResult=KEY_SOURCE;
//	   UDR=i;
	goto keycl;
  }

  KeyResult=0;
  keycl:;
  if(System_State==working)
  {
    if(KeyResult!=0)
  	{
      key_8=(key&(0x80));
	  KeyResult|=key_8;
	  key=KeyResult;
	  i2c_public|=(1<<6);  //准备i2c发送
  	}
  }			  
}

void adc_cl(void)
{
  uchar i,j,adc_maxmin;
  uint adc_sun;
  j=adc_jg[0];
 //----------------键值稳定性处理---------------- 
  for(i=1;i<5;i++)   //去掉最大值
  {
     if(j<adc_jg[i])
     {
       adc_maxmin=adc_jg[i];
	   adc_jg[i]=j;
	   j=adc_maxmin;
     }
  } 	 
     j=adc_jg[1];
  for(i=2;i<5;i++)   //去掉最小值
  {
     if(j>adc_jg[i])
     {
      adc_maxmin=adc_jg[i];
	  adc_jg[i]=j;
	  j=adc_maxmin;
     }
  }
  adc_sun=(adc_jg[2]+adc_jg[3]+adc_jg[4])/3;
  i=adc_sun;     //得到键码
 
 
  //############消抖处理
  key_jg[key_num]=adc_sun;
  key_num++;
 
  if(key_num<=2) //计满3次开始键码分析
  {
    goto tt;
  }
  if(key_jg[1]!=adc_sun)//消抖处理,键值不对则退出
  {
    key_num=0;
	key_open=0;
	s8_state=0;
	power_num=0;
	goto tt;
  }
  if(key_open==0)       //识别键码后进行键码处理,第一次按键处理
  {
     //UDR=key_jg[1];
	 if(System_State==standby||System_State==working)
	 {
	 	 key_cl(key_jg[1]);
		 keycl_num=0;
	 }	 

  }
  key_open=1;     //进入连续按键状态
  if(keycl_num>=KEY_TIME)  //连续按键时间达500ms时调用下一次按键处理
  {
    
	key_cl(key_jg[1]);//按键处理
	keycl_num=0;
    goto tt;
		
  }
  key_num=0;
  //##############键码分析
  if(adc_sun>0xfc)//一次按键已结束,一些计数值,状态初始化
  {
    key_open=0;    //按键状态结束
	power_key_open_enable=0;  //电源按键结束
	power_num=0;   //电源计时清零
  }
  tt:;
  
}
//ADC initialize
// Conversion time: 3uS
void adc_init(void)
{
 ADCSRA = 0x00; //disable adc  bit 7启动  停止adc
 ADMUX = (1<<REFS0)|(1<<ADLAR)|(ADC_2 & 0x0f);//0x42 //选择AVCC,结果左对齐,select adc input 2
 ACSR  = (1<<ACD); //模拟比较器关闭
 ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2);//|(1<<ADPS1); //中断使能,分频为16
 adc_num=0;
}

#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
 //conversion complete, read value (int) using...
 // value=ADCL;            //Read 8 low bits first (important)
 // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
    adc_rel=ADCH;
	if((key_open==0)&&(adc_rel>0xfc))//有键按下后则处理ff值,将ff值视为退出标志    
	{
	    goto keynull; //无键按下时如果adc值为ff则快速退出
	}  
    adc_num++;
	adc_jg[adc_num]=adc_rel;
	if(adc_num>=5)
	{
	    adc_num=0;
  	    key_b=1;
		//UDR=adc_rel;  //发送ad值
	}
	else
	{
	  ADCSRA|=(1<<ADSC);//启动ad
	}
	keynull:;      //标号不能加下划线
}

//call this routine to initialize all peripherals
/*
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();


 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}*/
/*########################################################*/
/****************************************
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
*****************************************/
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = (1<<URSEL) |0x06;
 UBRRL = 0x2F; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0xD8;
}
void uart0_cl(void)
{uchar i;
  // UDR=uart_command[0];
   for(i=0;i<4;i++)
   {
     if(uart0_buffer[i]!=uart_command[i])
	 {return;
	 }
   }
//   UDR=uart0_buffer[4];
   if(uart0_buffer[4]=='1') //开机
   {
     power_key_open_enable=1; 
   }
   if(uart0_buffer[4]=='0')
   {
    // UDR=0x11;
     power_on_close_enable=1; //关机  
   }
   uart0_num=0;
   u0check_num=0;
   uart0_b=0;
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 //uart has received a character in UDR
 uart0_b=1;        //启动超时检测
 uart0_buffer[uart0_num]=UDR;
 //UDR=uart0_buffer[uart0_num]; //
 //UDR=uart_command[uart0_num];
 uart0_num++;
}

#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
 //character has been transmitted
// UDR=0x00;
//  UDR=I2cReceiveData[];
  
}


/**************************************************
//call this routine to initialize all peripherals

**************************************************/
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 watchdog_init();
 timer0_init();
 timer1_init();
 timer2_init();
 
  adc_init();
  i2cInit(); 
  uart0_init();
  //下面语句可以同时使用
//设置从接收函数句柄(此函数在被选中为从接收时执行)   
//   i2cSetSlaveReceiveHandler( i2cSlaveReceiveService ); 
   //设置从发送函数句柄(此函数在被选中为从发送时执行) 
//   i2cSetSlaveTransmitHandler( i2cSlaveTransmitService ); 
 MCUCR = 0x02;
 GICR  = 0x00;
 TIMSK = 0x45; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}



/**************************************************
//call this routine to initialize all variable

**************************************************/
void init_var(void)
{
 unsigned char i;
   close_to_open_count=0;
   open_to_close_count=0;
   pwrbt_count=0;
   reset_open_count=0;
   reset_close_count=0;
   rly_on_count=0;
   vs_on_open_count=0;
   vs_on_close_count=0;
   power_key_down_count=0;
   power_key_on_count=0;
   power_on_on_count=0;
   power_on_down_count=0;
   close_to_open_station=0;
   open_to_close_station=0;
   machine_open_start=0;
   machine_close_start=0;
   close_machine_enable=1;
   open_machine_enable=1;           //上电时保证开关机都可以容许
   power_key_open_enable=0;
   power_on_close_enable=0;
   
   closetime_min=0;
   opentime_min=0;
   set_time=0xff;
   closetime_min=0;
   CloseTime_b=0;
   CloseTimeMin_b=0;
   Powerdown_time=0;
   Panel_Open_delay_Signal=0;
   Panel_Open_delay_Time=0;
   System_State=standby;
   KeyResult=0;
   Open_Panel_time=0;
   Open_Panel_flag=0;
  
   
//   rc5_data_init();
/*
   for(i=0;i<28;i++)
	   {
	     rc5_data[i]=0;
	   }
*/	   	   
}
void ys(void)
{
   uchar j;
   uint i;
   for(j=0;j<5;j++)
   {
      for(i=0;i<60000;i++)
      {
      }
   }  
}

void IR_ys(void)
{
   unsigned char b;
   unsigned int a;
   for(b=0;b<6;b++)
   {
      for(a=0;a<60000;a++)
      {
      }
   }  
}
//###################I2C接收命令处理函数###############################
void i2c_command1(void)
{
  
  if(Panel_Open_delay_Signal==0)
  {
    if(i2c_command&0x01)  //Mute处理
  	{
         PORTA|=(1<<A_MUTE);       //置1 静音
  	}
  	else
  	{
         PORTA&=~(1<<A_MUTE);      //置0 解除静音
    }
  }
  if(i2c_command&0x02)  //Hotplug处理
  {
   PORTA|=(1<<HPD123);       //1
  }
  else
  {
   PORTA&=~(1<<HPD123);      //置0
  }
  if(i2c_command&0x04)  //SPDIF_SW处理
  {
    PORTA|=(1<<SPDIF_SW);       //置1
  }
  else
  {
    PORTA&=~(1<<SPDIF_SW);      //置0
  }
  if(i2c_command&0x10)  //RS232_SW1处理
  {
    PORTC|=(1<<RS232_SW1);   //置1
  }
  else
  {
    PORTC&=~(1<<RS232_SW1);   //置0
  }
  
  if(i2c_command&0x08)  //RS232_SW2处理
  {
    PORTC|=(1<<RS232_SW2);   //置1
  }
  else
  {
    PORTC&=~(1<<RS232_SW2);   //置0
  }
  if(i2c_command&0x20)  //WATCHDOG处理--空函数
  {
  }
  else
  {
  }
  if(i2c_command&0x40)  //关机处理
  {
     power_on_close_enable=1;  //关机
  }
  if(i2c_command&0x80)  //读取实时时间命令
  {
    i2creadtime_b=1;
    I2cSendData[0]=0xfe;
	AddTime(timer_s);             //加上余数
	ReadTime(&Time.CBit[0],6);    //读取数据
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[0];
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[1];
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[2];
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[3];
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[4];
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[5];	
	while(!(UCSRA&(1<<UDRE)));
	UDR=I2cSendData[6];					
//	UDR=I2cReceiveData[1];
/*	I2cSendData[0]=0xFE;
    I2cSendData[1]=0x45;
    I2cSendData[2]=0x67;
	I2cSendData[3]=0x89;
    I2cSendData[4]=0xAB;
    I2cSendData[5]=0xCD;
    I2cSendData[6]=0xEF;
*/
    DDRA|=(1<<7);   //  改变为输出状态 
    PORTA&=0x7F;    //  PA7置0  申请发送数据
//	UDR=0xa5;
  }

⌨️ 快捷键说明

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