|
仿做了這個(gè)萬(wàn)年歷,遙控一直不能用,有那位大俠指教下看改動(dòng)那里,才能配上這個(gè)遙控
#ifndef _IR_H_
#define _IR_H_
unsigned char keya,keyb,keyc,keyd,keye,keyf,keyg,keyh,keyi,keyj;
unsigned char key_add,key_minus,key_set,key_ok,key_up,
key_down,key_alarm,key_voioff,key_voion,key_light;
//bit ala_flag=0; //鬧鐘使能標(biāo)志位
//bit back_light_flag=0;//背光使能
sbit IRIN = P3^5; //紅外接收器數(shù)據(jù)線
unsigned char IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
外部中斷0響應(yīng)函數(shù),完成對(duì)紅外遙控的解碼
-------------------------協(xié)議--------------------------
----開(kāi)始拉低9ms,接著是一個(gè)4.5ms的高脈沖,通知器件開(kāi)始傳送數(shù)據(jù)了
----接著是26位前導(dǎo)脈沖,用于識(shí)別該型號(hào)的搖控。
----然后是發(fā)送8位數(shù)據(jù)的原碼,接著又發(fā)送8位數(shù)據(jù)的反碼.
----最后是一個(gè)長(zhǎng)脈沖,和開(kāi)始位一樣,拉低9ms和一個(gè)4.5ms脈沖表示結(jié)束。
----每個(gè)按鍵不同這處只在于那8位數(shù)據(jù)的原碼和反碼,因些只須要識(shí)別
----8位原碼就可以識(shí)別按鍵了
****************************************************************/
void delayA(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//=====================================================
void IR_IN() interrupt 0 //using 0
{
unsigned char j,k,N=0;
EX0 = 0;
delayA(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//確認(rèn)IR信號(hào)出現(xiàn)
while (!IRIN) //等IR變?yōu)楦唠娖剑^(guò)9ms的前導(dǎo)低電平信號(hào)。
{delayA(1);}
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while (IRIN) //等 IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。
{delayA(1);}//
while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
{delayA(1);} //
while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng)
{
delayA(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。
} //高電平計(jì)數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) //接收時(shí)間是否正確
{
EX0=1;
return;
}
/*================紅外編碼處理====================*/
switch(IRCOM[2])
{
case 0x00: keya=1; break; //1
case 0x01: keyb=1; break; //2
case 0x02: keyc=1; break; //3
case 0x03: keyd=1; break; //4
case 0x04: keye=1; break; //5
case 0x05: keyf=1; break; //6
case 0x06: keyg=1; break; //7
// case 0x07: keyh=1; break; //8
case 0x08: keyi=1; break; //9
// case 0x09: keyj=1; break; //0
//遙控器1(電視遙控器)
/*
case 0x13: key_minish=1; break; //-
case 0x12: key_add=1; break; //+
case 0x18: key_manue=1; break; //菜單
case 0x19: key_ok=1; break; //OK
case 0x15: key_alarm=1; break; //關(guān)鬧鐘的開(kāi)與關(guān)
*/
//遙控器2(ALETNK遙控器)
case 0x15: key_add=1; break; //+
case 0x07: key_minus=1; break; //-
case 0x44: key_set=1; break; //菜單
case 0x40: key_ok=1; break; //OK
case 0x47: key_alarm=1; break; //關(guān)鬧鐘的開(kāi)與關(guān)
case 0x45: key_light=1; break; //背光控制
case 0x10: key_up=1; break; //上
case 0x11: key_down=1; break; //下
case 0x14: key_voioff=1; break; //靜音
case 0x17: key_voion=1; break; //聲音
default: break; //別的鍵按下
}
/* if(key_alarm==1)//鬧鐘的開(kāi)與關(guān)的設(shè)置標(biāo)志位
{
key_beep();
key_alarm=0;
ala_flag=~ala_flag;
key_alarm=0;
}
if(key_light==1)
{
key_beep();
key_light=0;
back_light_flag=~back_light_flag;
key_light=0;
}
*/
EX0 = 1; //開(kāi)中斷
}
/**************************
ALIENTEK遙控器鍵碼值
45H | 46H | 47H
---------------
44H | 40H | 43H
---------------
07H | 15H | 09H
---------------
16H | 19H | 0DH
---------------
0CH | 18H | 5EH
---------------
08H | 1CH | 5AH
---------------
42H | 52H | 4AH
***************************/
#endif
1.jpg (49.29 KB, 下載次數(shù): 185)
下載附件
這是遙控編碼
2015-6-1 20:13 上傳
CAR.jpg (11.3 KB, 下載次數(shù): 150)
下載附件
這個(gè)是現(xiàn)在的遙控
2015-6-1 20:13 上傳
PIC_20150601_202624_EE6.jpg (504.44 KB, 下載次數(shù): 155)
下載附件
2015-6-1 20:33 上傳
|
|