用的是ATMEGA8a,单次按键没有问题,但自己搞了几天处理连发码都没搞出来,诚信请教如何判断是连发码?
- uchar IR_buf[4]={0x00,0x00,0x00,0x00}; //IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
- // IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
- /********us延时程序,延时时间0.14ms(140us*)*******/
- void Delayus(uint x)
- {
- char i, j;
- for(i=0;i<x;i++) {for(j=0;j<210;j++);}</x;i++)
- }
- interrupt [EXT_INT0] void ext_int0_isr(void)
- {
- uchar i,j,sum=0;
- GICR |=(0<<int0); Delayus(20); //延时20*0.14MS ,2.8MS</int0);
- for(i = 0;i < 14;i++)
- {
- Delayus(1);
- if(IRIN) //9MS内有高电平,则判断为干扰,退出处理程序
- {
- GICR |=(1<<int0); return; //返回</int0);
- }
- }
- 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延时时间进行计数
- if(sum >= 30) //高电平时间过长,则退出处理程序
- {
- GICR |=(1<<int0); return;</int0);
- }
- }
- IR_buf = IR_buf >> 1; //接受一位数据
- if(sum >= 6)
- {IR_buf = IR_buf | 0x80;} //若计数值大于6(高电平时间大于0.56),则为数据1
- sum = 0; //若计数小于6,数据最高位补"0",说明收到的是"0",同时计时清零
- }
- }
- if(IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
{ 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;}
- }
- }
|