#include<AT89X51.H> //装入AT89X51头文件 #include<ir.h> //装入红外解码程序 #include<24c02.H> //装入24c02读写程序 sbit key=P1^0; //定义按键IO sbit led=P0^0; //定义指示led sbit rel=P0^1; //定义输出控制脚 unsigned char kaver; //定义kaver为输出口状态缓存 unsigned char iccdate,irdate; //定义24c02数据和解码数据 //延时10ms函数,用于开关消抖等 delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } //学习红外解码并写入24c02的函数 study() { IR_IN(); irdate=IRCOM[3]; iccdate=ReadIIC(W_cmd,0x00,R_cmd); if(irdate!=iccdate) //只在解码结果与读取结果不同时写入24C02 { if(irdate!=0) //防止没有接收到红外信号,IRCOM[3]置零时,误写入0 { WP=0; WriIIC(W_cmd,0x00,irdate); delay10ms(); WP=1; led=0; while(key==0); //学习成功等待按键释放,led停止闪动作为指示 } } } //进入学习状态时的led闪动函数 flash() { unsigned char i; while(key==0) { led=~led; for(i=50;i>0;i--) study(); } } //按键模式识别函数 keymod() { unsigned char m=0; while(key==0) //如果按键按下,开始对按键时间进行计数 { delay10ms(); //计数时间延时 m++; delay10ms(); //计数时间延时 if(m>=90) //如果计数次数大于90次,等于按键按下时间大于约5秒后,进入led闪动学习模式 { m=0; flash(); } } if(m<90) //如果计数次数小于90,则按键作为开关使用 { m=0; kaver=~kaver; } } ////////////////////主函数//////////////////////////////////// main() { WP=1; //24c02写保护 while(1) { IRCOM[3]=0; IR_IN(); // 读4字节32位按键编码 ,前16位用户码为IRCOM[1]+IRCOM[2],8位键值码为IRCOM[3] irdate=IRCOM[3]; //8位键值反码为IRCOM[4] 这里只调用 IRCOM[3]键值码作为数据码 iccdate=ReadIIC(W_cmd,0x00,R_cmd); if(irdate==iccdate) //如果解码结果与24C读取码相同,kaver翻转一次 { irdate=0; kaver=~kaver; } if(key==0) keymod(); rel=~kaver; led=kaver; } }