用的是ATMEGA8a,單次按鍵沒有問題,但自己搞了幾天處理連發(fā)碼都沒搞出來,誠信請教如何判斷是連發(fā)碼?
- uchar IR_buf[4]={0x00,0x00,0x00,0x00}; //IR_buf[0]、IR_buf[1]為用戶碼低位、用戶碼高位接收緩沖區(qū)
- // IR_buf[2]、IR_buf[3]為鍵數(shù)據(jù)碼和鍵數(shù)據(jù)碼反碼接收緩沖區(qū)
- /********us延時程序,延時時間0.14ms(140us*)*******/
- void Delayus(uint x)
- {
- char i, j;
- for(i=0;i<x;i++)
- {for(j=0;j<210;j++);}
- }
- interrupt [EXT_INT0] void ext_int0_isr(void)
- {
- uchar i,j,sum=0;
- GICR |=(0<<INT0);
- Delayus(20); //延時20*0.14MS ,2.8MS
- for(i = 0;i < 14;i++)
- {
- Delayus(1);
- if(IRIN) //9MS內(nèi)有高電平,則判斷為干擾,退出處理程序
- {
- GICR |=(1<<INT0);
- return; //返回
- }
- }
- while(!(IRIN)); //等待9ms低電平過去
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- while(IRIN); //等待4.5ms高電平過去
- while(!(IRIN)); //等待變高電平
- while(IRIN) //計算高電平時間
- {
- Delayus(1); //延時0.14ms
- sum++; //對0.14ms延時時間進行計數(shù)
- if(sum >= 30) //高電平時間過長,則退出處理程序
- {
- GICR |=(1<<INT0);
- return;
- }
- }
- IR_buf[i] = IR_buf[i] >> 1; //接受一位數(shù)據(jù)
- if(sum >= 6)
- {IR_buf[i] = IR_buf[i] | 0x80;} //若計數(shù)值大于6(高電平時間大于0.56),則為數(shù)據(jù)1
- sum = 0; //若計數(shù)小于6,數(shù)據(jù)最高位補"0",說明收到的是"0",同時計時清零
- }
- }
- if(IR_buf[2]!=~IR_buf[3]) //將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯誤,放棄
- { GICR |=(1<<INT0); return;}
-
- HW_Status=1;
- }
- void RR() //遙控器鍵控
- {
- if(HW_Status==1)
- { static uchar m;
- if((IR_buf[2]==0xfb)||(IR_buf[2]==e)) //音量加
- {
- if( VOLUME_1<98)
- {++ VOLUME_1;}
- else if( VOLUME_1>=98)
- { VOLUME_1=98;}
- }
- if((IR_buf[2]==0xfa)||(IR_buf[2]==b)) //音量減
- {
- if( VOLUME_1>0)
- {-- VOLUME_1;}
-
- }
- void RR() //遙控器鍵控處理
- {
- if(HW_Status==1)
- { static uchar m;
- if((IR_buf[2]==0xfb)||(IR_buf[2]==e)) //音量加
- {
- if( VOLUME_1<98)
- {++ VOLUME_1;}
- else if( VOLUME_1>=98)
- { VOLUME_1=98;}
- }
- if((IR_buf[2]==0xfa)||(IR_buf[2]==b)) //音量減
- {
- if( VOLUME_1>0)
- {-- VOLUME_1;}
-
- }
- }
復制代碼
|