#include<AT89X51.H> //裝入AT89X51頭文件 #include<ir.h> //裝入紅外解碼程序 #include<24c02.H> //裝入24c02讀寫(xiě)程序 sbit key=P1^0; //定義按鍵IO sbit led=P0^0; //定義指示led sbit rel=P0^1; //定義輸出控制腳 unsigned char kaver; //定義kaver為輸出口狀態(tài)緩存 unsigned char iccdate,irdate; //定義24c02數(shù)據(jù)和解碼數(shù)據(jù) //延時(shí)10ms函數(shù),用于開(kāi)關(guān)消抖等 delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } //學(xué)習(xí)紅外解碼并寫(xiě)入24c02的函數(shù) study() { IR_IN(); irdate=IRCOM[3]; iccdate=ReadIIC(W_cmd,0x00,R_cmd); if(irdate!=iccdate) //只在解碼結(jié)果與讀取結(jié)果不同時(shí)寫(xiě)入24C02 { if(irdate!=0) //防止沒(méi)有接收到紅外信號(hào),IRCOM[3]置零時(shí),誤寫(xiě)入0 { WP=0; WriIIC(W_cmd,0x00,irdate); delay10ms(); WP=1; led=0; while(key==0); //學(xué)習(xí)成功等待按鍵釋放,led停止閃動(dòng)作為指示 } } } //進(jìn)入學(xué)習(xí)狀態(tài)時(shí)的led閃動(dòng)函數(shù) flash() { unsigned char i; while(key==0) { led=~led; for(i=50;i>0;i--) study(); } } //按鍵模式識(shí)別函數(shù) keymod() { unsigned char m=0; while(key==0) //如果按鍵按下,開(kāi)始對(duì)按鍵時(shí)間進(jìn)行計(jì)數(shù) { delay10ms(); //計(jì)數(shù)時(shí)間延時(shí) m++; delay10ms(); //計(jì)數(shù)時(shí)間延時(shí) if(m>=90) //如果計(jì)數(shù)次數(shù)大于90次,等于按鍵按下時(shí)間大于約5秒后,進(jìn)入led閃動(dòng)學(xué)習(xí)模式 { m=0; flash(); } } if(m<90) //如果計(jì)數(shù)次數(shù)小于90,則按鍵作為開(kāi)關(guān)使用 { m=0; kaver=~kaver; } } ////////////////////主函數(shù)//////////////////////////////////// main() { WP=1; //24c02寫(xiě)保護(hù) while(1) { IRCOM[3]=0; IR_IN(); // 讀4字節(jié)32位按鍵編碼 ,前16位用戶碼為IRCOM[1]+IRCOM[2],8位鍵值碼為IRCOM[3] irdate=IRCOM[3]; //8位鍵值反碼為IRCOM[4] 這里只調(diào)用 IRCOM[3]鍵值碼作為數(shù)據(jù)碼 iccdate=ReadIIC(W_cmd,0x00,R_cmd); if(irdate==iccdate) //如果解碼結(jié)果與24C讀取碼相同,kaver翻轉(zhuǎn)一次 { irdate=0; kaver=~kaver; } if(key==0) keymod(); rel=~kaver; led=kaver; } }