#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; } }