?? 5104的解碼.txt
字號:
紅外解碼程序有朋友要做5104的解碼,剛好前幾天寫了一個,這個程序是已經調試好了的。其實無線跟紅外的解碼原理基本上是一樣的。
void Decoder()
{unsigned char SignalW,CodeTotal; SignalW=0;
do { //9+66=75us delay(20);//delay 66us
SignalW++;
if(SignalW>120) return; // 如果引導碼長度超出范圍則退出程序
}while(IRin);
//判斷引導碼是否正確
if(SignalW<60) return;//若引導碼長度太短同樣退出程序
CodeTotal=12; //一共解碼12次,因為5104有12bit碼
do{ //delay 11+21=32us
SignalW=0;
do{ delay(5);//delay 21us
SignalW++;
if(SignalW>makuan) return; //如果低電平時間超過1bit的長度則認為是干擾
}while(!IRin);
if(SignalW<6) return;//如果寬度低于6*32=192us,則認為是干擾
SignalW=SignalW-fenjie;//寬度大于800US時為1,否則為0
asm("RLF _CodeBuff,F");
asm("RLF _CodeBuff+1,F");//將解得的碼移入存儲器
//CODE_TOTAL++;
asm("CLRWDT"); SignalW=0; //對高電平進行監視
do{ delay(5);
SignalW++;
if(SignalW>makuan) break; //請注意,因為最后一位是高電平。所以此出用break。 //如果該為return的話則解碼錯誤
}while(IRin);
CodeTotal--;
}while(CodeTotal); //12bit全部解完后進行處理
if((IRData[0]==CodeBuff[0])&&(IRData[1]==CodeBuff[1]))
if(bFirstIR) //判斷是否連續2次解得同一碼
{ Timer=0;
bFirstIR=0;
if(bHaveKey) return;
asm("RLF _IRData,f");
asm("RLF _IRData+1,f");
asm("RRF _IRData,f");
IRData[0]&=0x7f;
IRData[1]&=0x1b;
if(IRData[1]==IRAddress)
{ if(IRData[0]==Key1) PortBuff^=Key1;
if(IRData[0]==Key2) PortBuff^=Key2;
if(IRData[0]==Key3) PortBuff^=Key3;
if(IRData[0]==Key4) PortBuff^=Key4;
if(IRData[0]==Key5) PortBuff^=Key5;
if(IRData[0]==Key6) PortBuff=0;
bHaveKey=1; } return; } bFirstIR=1; //否則保存當前的碼值
IRData[0]=CodeBuff[0];
IRData[1]=CodeBuff[1];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -