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

📄 ifr_ir.c

📁 里面包含了LCD显示
💻 C
字号:

#define ifr_ir_c
#include"io.h"
#include"ifr_ir.h"
#include"key.h"
#include"main.h"
#include "LME2200.h"
#include "stc_eeprom.h"
#include "lcd.h"

void ifr_key_deal(uchar dat1);
void data_com(uchar K_ifr_Dat);

uchar code ADDR_ID0[3] = {0x01,0x01,0x10};

//****************************************************
//function:ir init    
//input   :无	  	  
//output  :i,延时i x 100us
//modify  :2007-06-21
//*****************************************************
void ifr_init()
{
    b_ifr  = 0;
	b_irf  = 0;
	b_send = 0;
	b_zero = 1;
	b_keytwo   = 0;
	b_keythree = 0;
	b_checkok  = 0;
	number_d   = 0;	
	number_ent = 0;
}

//****************************************************
//function:红外的接收函数	  
//input   :无	
//output  :无 	 
//modify  :2007-6-19  	  
//*****************************************************
void ifr_irn()												   
{
  uchar cont;  
  cont=mj=0;
  	
  while(!ifr_ir)mj++;
  if((mj<1000)||(mj>2000))return ; 	
  mj =0;  
  while(ifr_ir)mj++;
  if((mj<500)||(mj>1000))return ;       
  mj =0; 
  delay(2);
  if(ifr_ir)return;
   for(i=0;i<4;i++) //4个字节	  
    for(j=0;j<8;j++){    //每个字节8位	
		cont ++;
       while (!ifr_ir);	//等待Infr为1; //560us完成
	   ifr_buf[i] >>= 1;
	   delay(35);
       if(ifr_ir)		// 小于560us为位0
  	   delay(18);
	   if(ifr_ir)
          ifr_buf[i] |= 0x80;// 大于900us为位1 
       while(ifr_ir);        
  	}
  if(cont == 32)
    {
      cont = 0; 

	  if((ifr_buf[0]+ifr_buf[1]==0xff)&&(ifr_buf[2]+ifr_buf[3]==0xff))
	     {
		    b_ifr=1;
		//if((ifr_buf[0]==0x7f)&&(ifr_buf[1]==0x80)) 
	        //led_ray1(2);
		    //ifr_key_deal(ifr_buf[2]);	    	 
		 }
  }	
 }	


/*************************************************************
//function:无线的接收函数
//input   :无
//output  :ifr_buf[0],ifr_buf[1],ifr_buf[2],ifr_buf[3],b_ifr
//modify  :2007-8-27 by tony
**************************************************************/
void Time0Star()
{
	TR0=0;
	TH0=0;
	TL0=0;//修正值
	TF0=0;
	TR0=1;
}

void RF_bitRx(bit _bitRF)//RF 接收位
{
	uchar delayi,count;
	count=0;
	while((count<4) && (!TF0))
	{
		while(rfintpin==_bitRF);// ifr_buf[0]=0;	
		delayi=4;
		while(delayi>1) delayi--;
		if ((rfintpin!=_bitRF))
			{
			count++;
			delayi=3;
			while(delayi>1) delayi--;
		  }
	}
	TR0=0;
}


//****************************************************
//function:红外的接收函数   
//input   :无	
//output  :无 	   
//modify  :2007-6-19  	
//*****************************************************
void ifr_rf()
 {
   	#define Louttime 2//允许最大码宽555us
    #define t11ms 1000
    #define t1100us 100//100us的宽度
	uint rxdataRF[2];
	uint  zerotime,onetime,saveLtime;//存放高低电平时间长短
	Time0Star();
	rxdataRF[0]=0;
	rxdataRF[1]=0;

//*********************防止误入,通调试此方法又能防误入,又不会误退出**************************/
	if(!rfintpin)
		{
		   for(zerotime=5;zerotime>1;zerotime--);
		   if(!rfintpin) return;
		}


//*********************防止误入,通调试此方法又能防误入,又不会误退出**************************/
		zerotime=0;
	while((zerotime<5) && (!TF0))
	{
		while(rfintpin)// ifr_buf[0]=0;
			{
			 if((TH0>=2)) return;//555us则退出
			}
		for(onetime=4;onetime>1;onetime--) ;
		if (!rfintpin)
			{
			zerotime++;
			for(onetime=2;onetime>1;onetime--) ;
		 	}
	}
//
TR0=0;	
if((TH0>2)) return;//69us--555us认为允许
if(TH0<1)
   if(TL0<60)return;

saveLtime=(((uint)TH0)<<8) | ((uint)TL0);//作参考对象
Time0Star();
if(saveLtime<t1100us) saveLtime=t1100us;//最小为100us
if(saveLtime<(t1100us*2)) saveLtime+=150;//150us
else if(saveLtime<(t1100us*4)) saveLtime+=80;//80us
else saveLtime+=50;//50us
//修正参考时间(码宽)
RF_bitRx(0);//无线位接收
if(TF0) return;//如果是时间益出那是错误

onetime=(((uint)TH0)<<8) | ((uint)TL0);
if(onetime<(t11ms*3)) return;
if(onetime>(t11ms*17)) return;
/**********************************RF数据接收开始**************************************/
	  


Time0Star();
ifr_buf[1]=0;//用于记字数
ifr_buf[2]=0;//用于记位个数
while(ifr_buf[1]<2)
 {
///////////////////////////////////////////////////////
	RF_bitRx(1);
	if(TF0) break;//error或结束
	zerotime=(((uint)TH0)<<8) | ((uint)TL0);
/////////////////////////////////////////////////////////接收高电平
////////////////////////////////////////////////////////
	Time0Star();
	RF_bitRx(0);
	if(TF0) break;//error或结束
	onetime=(((uint)TH0)<<8) | ((uint)TL0);
/////////////////////////////////////////////////////////接收低电平
	Time0Star();
//以下部分为处理数据
	if(zerotime>(t11ms*2)) break;
	if(onetime>(t11ms*2)) break;//码宽超过2m则做错误处理
	if(zerotime>(onetime+(onetime/2))) //1
	{
		rxdataRF[ifr_buf[1]] |=0x01;
		ifr_buf[2]++;
		if(ifr_buf[2]>=16)
			{
			ifr_buf[2]=0;
			ifr_buf[1]++;
			}
		else
			rxdataRF[ifr_buf[1]]<<=1;
	}
	else if(onetime>(zerotime+(zerotime/2))) //0
	{
		rxdataRF[ifr_buf[1]] &=0xFFFE;//此行不用也可以
		ifr_buf[2]++;
		if(ifr_buf[2]>=16)
			{
			ifr_buf[2]=0;
			ifr_buf[1]++;
			}
		else
			rxdataRF[ifr_buf[1]]<<=1;
	}
	else //如果没有比例关系,那么按时间与码宽关系定值;
	{
	if(zerotime<saveLtime)
		{
		rxdataRF[ifr_buf[1]] &=0xFFFE;//认为为0
		ifr_buf[2]++;
		if(ifr_buf[2]>=16)
			{
			ifr_buf[2]=0;
			ifr_buf[1]++;
			}
		else
			rxdataRF[ifr_buf[1]]<<=1;
		}
	else
		{
		rxdataRF[ifr_buf[1]] |=0x01;//作1处理
		ifr_buf[2]++;
		if(ifr_buf[2]>=16)
			{
			ifr_buf[2]=0;
			ifr_buf[1]++;
			}
		else
			rxdataRF[ifr_buf[1]]<<=1;
		}
	}


 }//loop接收4个数据收完的话等待处理

	if(ifr_buf[1]==0) return;//一收就错误,则退出
	if(ifr_buf[2]!=0) //收完四个字节
	{
		for(;ifr_buf[2]<15;ifr_buf[2]++)
		{
			rxdataRF[ifr_buf[1]] &=0xFFFE;
			rxdataRF[ifr_buf[1]]<<=1;
		}
			rxdataRF[ifr_buf[1]] &=0xFFFE;
			ifr_buf[1]++;
	}
//数据处理后转换到数据存放区:ifr_buf[0]--ifr_buf[3]
	ifr_buf[0]=(uchar)rxdataRF[0];//低地址
	ifr_buf[1]=(uchar)(rxdataRF[0]>>8);//高地址
	ifr_buf[2]=(uchar)rxdataRF[1];//低数据
	ifr_buf[3]=(uchar)(rxdataRF[1]>>8);//高数据
	b_ifr=1;
	if((ifr_buf[0]==0x55)&&(ifr_buf[1]==0x55)&&(ifr_buf[3]==0x03))
	  led_ray1(3);
 }

//*********************************************************************################################
//*******************************************************##############################################
//****************************************************
//function:  
//input   :无	
//output  :无 	 
//modify  :2007-9-10 	  
//*****************************************************
void checkok(uchar dat_dat)
{
   bit b_check=0,b_check1=0;
   bit b_keychoose1=0;

   if(b_send)
    {
	  b_send=0;
	  if(!b_study)led_ray1(1);else led_ray11(1);
	  switch(cycle1)
	    {
		  case 0:if(dat_dat<=9) 
				   {
					  temp[0]=dat_dat;b_light=0;b_repeat=0;b_light1=0;number_ent=0;			  
				   }
				 else if(b_light)
				   {if(dat_dat==0x0b){b_check=1;}else if(dat_dat==0x0c){b_check1=1;}}
				 else if(b_repeat)
				   {if(dat_dat==0x0b){b_check=1;}else if(dat_dat==0x0c){b_check1=1;}}
				 else {b_keychoose1=1;}
				 break;
		  case 1:
				 if(dat_dat<=9)
				   {
					 temp[1]=temp[0]*10+dat_dat;
				   }
				 else if(dat_dat==0x0b){b_check=1;}
				 else if(dat_dat==0x0c){b_check1=1;}
                 break;
		  case 2:
                 if(dat_dat<=9)
					{
					  temp[2]=temp[1]*10+dat_dat;number_d=dat_dat;
					}
				 else if(dat_dat==0x0b){b_check=1;}
				 else if(dat_dat==0x0c){b_check1=1;}
		         break;
		  case 3:
                 if(dat_dat<=9){b_keychoose1=1;}
				 else if(dat_dat==0x0b){b_check=1;}
				 else if(dat_dat==0x0c){b_check1=1;}

				 if(temp[1]>25){b_keychoose1=1;}
				 else {if(number_d>5){b_keychoose1=1;}}				 		         
				 break;
		  case 4:b_keychoose1=1;break;
		  default:break;
		}
	   cycle1++;
	 }
	  if(b_keychoose1)
	    {
	      cycle1=0;b_check1=0;b_check=0;
		  b_keychoose1=0;
		}

	  if(b_check1||b_check)
	   {
		  if(b_check){b_keytwo=1;}
		  else if(b_check1)	{b_keythree=1;}
		  
		  if(cycle1==1)
		    {
		      cycle1=0;
			  b_checkok=1;
			  if(!b_light1)	
			   {
			     b_zero=0;
			   }
		    }
		  else if(cycle1==2)
		    {
			  temp[3]=temp[0];
			  if(temp[3]==0x00)b_light1=1;
			  cycle1=0;
			  b_checkok=1;
			}
		  else if(cycle1==3)
		    {
			  temp[3]=temp[1]%256;
			  if(temp[3]==0x00){b_zero=0;}
			  cycle1=0;
			  b_checkok=1;		  
			}
		  else if(cycle1==4)
		    {
			  temp[3]=temp[2]%256;
			  if(temp[3]==0x00){b_zero=0;}
			  cycle1=0;
			  b_checkok=1;			  
			}		  	      
	   }	   
     if(b_checkok)
	  {
		  b_checkok=0;
		  b_send1=1;

		  if((!number_ent)&&((!b_repeat)&&(!b_light)))
		    {
			 number_ent=temp[3];
			 data_com(temp[3]);
			}
		  else
		   {
			  data_com(number_ent);
		   }
	  }   
}

//****************************************************
//function:
//input   :无	
//output  :无 	 
//modify  :2007-9-10  	  
//*****************************************************
void fuzhi(void)
 {
   eeprom_eares(0x8400);
   eeprom_write(0x8400,0x7f);
   eeprom_write(0x8401,0x80);
   eeprom_write(0x8402,0x07);
   eeprom_write(0x8403,0x08);
   eeprom_write(0x8404,0x09);
   eeprom_write(0x8405,0x0A);
   eeprom_write(0x8406,0x1B);
   eeprom_write(0x8407,0x1F);
   eeprom_write(0x8408,0x0C);
   eeprom_write(0x8409,0x0D);
   eeprom_write(0x840a,0x0E);
   eeprom_write(0x840b,0x06);
   eeprom_write(0x840c,0x01);
   eeprom_write(0x840d,0x03);
 }

//****************************************************
//function:
//input   :无	
//output  :无 	 
//modify  :2007-9-10  	  
//*****************************************************
void ifr_key_deal(uchar dat1)
  {
	   b_send=1;

	  if(keyvalue==1)
	    {
	            if(dat1==eeprom_read(0x8002)) {checkok(0x01);}
	       else if(dat1==eeprom_read(0x8003)) {checkok(0x02);}
	       else if(dat1==eeprom_read(0x8004)) {checkok(0x03);}
	       else if(dat1==eeprom_read(0x8005)) {checkok(0x04);}
	       else if(dat1==eeprom_read(0x8006)) {checkok(0x05);}
	       else if(dat1==eeprom_read(0x8007)) {checkok(0x06);}
	       else if(dat1==eeprom_read(0x8008)) {checkok(0x07);}
	       else if(dat1==eeprom_read(0x8009)) {checkok(0x08);}
	       else if(dat1==eeprom_read(0x800a)) {checkok(0x09);}
	       else if(dat1==eeprom_read(0x800b)) {checkok(0x00);}
	       else if(dat1==eeprom_read(0x800c)) {checkok(0x0b);}
	       else if(dat1==eeprom_read(0x800d)) {checkok(0x0c);}
	    }
	   else if(keyvalue==2)
	     {
	            if(dat1==eeprom_read(0x8402)) {checkok(0x01);}
	       else if(dat1==eeprom_read(0x8403)) {checkok(0x02);}
	       else if(dat1==eeprom_read(0x8404)) {checkok(0x03);}
	       else if(dat1==eeprom_read(0x8405)) {checkok(0x04);}
	       else if(dat1==eeprom_read(0x8406)) {checkok(0x05);}
	       else if(dat1==eeprom_read(0x8407)) {checkok(0x06);}
	       else if(dat1==eeprom_read(0x8408)) {checkok(0x07);}
	       else if(dat1==eeprom_read(0x8409)) {checkok(0x08);}
	       else if(dat1==eeprom_read(0x840a)) {checkok(0x09);}
	       else if(dat1==eeprom_read(0x840b)) {checkok(0x00);}
	       else if(dat1==eeprom_read(0x840c)) {checkok(0x0b);}
	       else if(dat1==eeprom_read(0x840d)) {checkok(0x0c);}		   
		 }

  }
 
//****************************************************
//function:LEM2200数据的重组	   
//input   :无
//output  :无	  
//modify  :2007-7-05  	 
//*****************************************************
void data_com(uchar K_ifr_Dat)
 {
	 uchar I_tx_buf[18]=0;

	 if((K_ifr_Dat==0)&&(b_zero))
	   {
		  temp[0]=K_ifr_Dat;b_light=1;b_repeat=0;
	   }
	 else
	  {
		 temp[0]=K_ifr_Dat+ADDR_ID0[2];b_repeat=1;b_light=0;
      }
		   
	if(!b_study)  //只有进入学习时此标志才为 1
	  {

		  I_tx_buf[0]=ADDR_ID0[0];	//基地址
	      I_tx_buf[1]=ADDR_ID0[1];
		  I_tx_buf[2]=temp[0];

		  I_tx_buf[5]=b_zero;
		  b_zero=1;

		  if(b_keytwo){I_tx_buf[3]=3;}
		  else if(b_keythree){I_tx_buf[3]=5;}
		  b_keytwo=0; b_keythree=0;

		 I_tx_buf[4] = temp[0];
	     Lme_Data_Write(I_tx_buf,18);//写数据带发送命令
		 delay(100);
	  } 
	else if(b_study==1)	  //只有进入学习时此标志才为 1 	 
	  {				
		if(b_send1) //发射时为1,返回来一个值时为0  
		 {
			b_send1=0;
			led_ray11(2);
			I_tx_buf[0]=ADDR_ID0[0];
	        I_tx_buf[1]=ADDR_ID0[1];
			I_tx_buf[2]=temp[0];
			I_tx_buf[3]=0x55;
			I_tx_buf[5]=0x99;
	        I_tx_buf[6]=0x99;
			Lme_Data_Write(I_tx_buf,18);	
		}
	 }   
 }
	
//****************************************************
//function:	   
//input   :无	   
//output  :无	  
//modify  :2007-9-11  
//*****************************************************
bit Find_ifrcode2(void)
 {
   uchar i;

   if((eeprom_read(0x8401)==ifr_buf[0])&&(eeprom_read(0x8400)==ifr_buf[1]))
     { 
	  for(i=2;i<14;i++)
        {
	   	   if(eeprom_read(0x8400+i)==ifr_buf[2])
		     {
			   keyvalue=2;return 1;
			 }
	    }
	  }

   if((eeprom_read(0x8000)==ifr_buf[0])&&(eeprom_read(0x8001)==ifr_buf[1]))
     {
	  for(i=2;i<14;i++)
        {
	   	   if(eeprom_read(0x8000+i)==ifr_buf[2])
		     {
			   keyvalue=1;return 1;
			 }
	    }
	  }
 }

//****************************************************
//function:	   
//input   :无
//output  :无	   
//modify  :2007-9-11  	 
//*****************************************************
void ifr_administer(void)
  {
     if(!b_ifr)return;
	 b_ifr=0;
	 if(Find_ifrcode2())	  //find code 	
	  {	 
		 ifr_key_deal(ifr_buf[2]);
	  }	
  }


//****************************************************
//function:	   
//input   :无
//output  :无	  
//modify  :2007-9-11  
//*****************************************************
void rx_led_on_off(uchar r_led_buf[])
 {
   add_show(r_led_buf[0],r_led_buf[1],r_led_buf[2],r_led_buf[3]);
 }

⌨️ 快捷键说明

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