#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為輸出口狀態(tài)緩存 unsigned char iccdate,irdate; //定義24c02數(shù)據(jù)和解碼數(shù)據(jù) //延時10ms函數(shù),用于開關(guān)消抖等 delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } //學(xué)習(xí)紅外解碼并寫入24c02的函數(shù) study() { IR_IN(); irdate=IRCOM[3]; iccdate=ReadIIC(W_cmd,0x00,R_cmd); if(irdate!=iccdate) //只在解碼結(jié)果與讀取結(jié)果不同時寫入24C02 { if(irdate!=0) //防止沒有接收到紅外信號,IRCOM[3]置零時,誤寫入0 { WP=0; WriIIC(W_cmd,0x00,irdate); delay10ms(); WP=1; led=0; while(key==0); //學(xué)習(xí)成功等待按鍵釋放,led停止閃動作為指示 } } } //進入學(xué)習(xí)狀態(tài)時的led閃動函數(shù) flash() { unsigned char i; while(key==0) { led=~led; for(i=50;i>0;i--) study(); } } //按鍵模式識別函數(shù) keymod() { unsigned char m=0; while(key==0) //如果按鍵按下,開始對按鍵時間進行計數(shù) { delay10ms(); //計數(shù)時間延時 m++; delay10ms(); //計數(shù)時間延時 if(m>=90) //如果計數(shù)次數(shù)大于90次,等于按鍵按下時間大于約5秒后,進入led閃動學(xué)習(xí)模式 { m=0; flash(); } } if(m<90) //如果計數(shù)次數(shù)小于90,則按鍵作為開關(guān)使用 { m=0; kaver=~kaver; } } ////////////////////主函數(shù)//////////////////////////////////// main() { WP=1; //24c02寫保護 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; } }