|
********************************* 遥控器学习 *********************************//******************************************************************************/void clr_learn_reg(void) { unsigned char n; di(); for(n=1;n==remote_cout*4;n++) { eeprom_write(n,0); } eeprom_write(70,0); eeprom_write(71,0); ei(); }/******************************************************************************/unsigned char compare_data(unsigned char eep_addr) { unsigned char n; union BIT_32 addr_data; for(n=0;n<4;n++) { addr_data.data_temp_byte[n]=eeprom_read(eep_addr+n); } if((data_temp.data_temp_long&0x00fffff0)==(addr_data.data_temp_long&0x00fffff0)) { return 1;//地址匹配返回1 } return 0;//地址不匹配返回0 }/******************************************************************************/unsigned char compare_all_data(void) { unsigned char n; for(n=0;n<remote_cout;n++)//在已经学习好的遥控器地址里比较有没有相同的 { if(compare_data(n*4+1))//如果有相同的遥控器 { return 1; } } return 0;//没有一个地址是相同的 }/******************************************************************************///读遥控器的数量void read_remote_cout(void) { remote_cout=eeprom_read(71);//读出已经学习的遥控器总数量 if(remote_cout>20)remote_cout=0; //如果EEPROM是空的则为0 }/******************************************************************************/void check_learn_pro(void) { unsigned char n; if(learn) { learn=0; remote_numb=eeprom_read(70);//读出现在可以覆盖掉哪个遥控器的编号 read_remote_cout();////读遥控器的数量 if(remote_numb>(remote_geshu-1))remote_numb=0;//如果遥控器的编号已经是最大的了 则从小开始 if((remote_cout==0)||!compare_all_data())//如果还没有遥控器学习或没有相同地址的遥控器学习 { di(); for(n=0;n<4;n++) { eeprom_write(remote_numb*4+n+1,data_temp.data_temp_byte[n]); } remote_numb++; if(remote_cout<remote_geshu+1)remote_cout++;//已经学习好的遥控器数量 eeprom_write(71,remote_cout);//保存已经学习好的遥控器总数量 eeprom_write(70,remote_numb);//保存已学习的遥控起编号 ei(); } } }/******************************************************************************/void check_out_pro(void) { read_remote_cout();//读遥控器的数量 if(compare_all_data()) { data=data_temp.data_temp_byte[0]&0x0f;// TIMER15S3=0; TIMER15S4=0; RC4=1; } }/******************************************************************************/void decode_init(void)//接收初始化 { OPTION=0x87; RBPU=0; TMR0=0; T0IE=1;//使能定时器0中断 INTE=1; TMR1ON=1;// PORTC=0x00;// TRISC=0x00;// ei();//开放全局中断 }/******************************************************************************/void check_remote_recieved(void)//检测有无新的数据 { if(!RB1)// { if(TIMER15S1>30)//是否长按了3秒 { learn=0;// clr_learn_reg(); RC4=0; } else { learn=1;// TIMER15S2=0; TIMER15S4=0; RC4=1; } } else { TIMER15S1=0; if(TIMER15S2>60) { learn=0;// } } if(TIMER15S3>2)//数据保持时间 { data=0; TIMER15S3=0; } if(TIMER15S4>3)//LED显示时间 { RC4=0; } if(recieved) { TIMER15S3=0; recieved=0; TIMER15S4=0; RC4=1; check_learn_pro(); check_out_pro(); } INTE=1; }
|