仿做了這個萬年歷,遙控一直不能用,有那位大俠指教下看改動那里,才能配上這個遙控
#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; //鬧鐘使能標志位
//bit back_light_flag=0;//背光使能
sbit IRIN = P3^5; //紅外接收器數據線
unsigned char IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
/***************************************************************
外部中斷0響應函數,完成對紅外遙控的解碼
-------------------------協議--------------------------
----開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數據了
----接著是26位前導脈沖,用于識別該型號的搖控。
----然后是發送8位數據的原碼,接著又發送8位數據的反碼.
----最后是一個長脈沖,和開始位一樣,拉低9ms和一個4.5ms脈沖表示結束。
----每個按鍵不同這處只在于那8位數據的原碼和反碼,因些只須要識別
----8位原碼就可以識別按鍵了
****************************************************************/
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;
}
//確認IR信號出現
while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
{delayA(1);}
for (j=0;j<4;j++) //收集四組數據
{
for (k=0;k<8;k++) //每組數據有8位
{
while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
{delayA(1);}//
while (!IRIN) //等 IR 變為高電平
{delayA(1);} //
while (IRIN) //計算IR高電平時長
{
delayA(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms計數過長自動離開。
} //高電平計數完畢
IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數據最高位補“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) //接收時間是否正確
{
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; //關鬧鐘的開與關
*/
//遙控器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; //關鬧鐘的開與關
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)//鬧鐘的開與關的設置標志位
{
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; //開中斷
}
/**************************
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, 下載次數: 185)
下載附件
這是遙控編碼
2015-6-1 20:13 上傳
CAR.jpg (11.3 KB, 下載次數: 150)
下載附件
這個是現在的遙控
2015-6-1 20:13 上傳
PIC_20150601_202624_EE6.jpg (504.44 KB, 下載次數: 155)
下載附件
2015-6-1 20:33 上傳
|