📄 ifr_ir.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 + -