hlfqzy 发表于 2012-7-31 13:50:03

求助---红外控制如何实现连按处理

//===================24MHZ=========================

#define c(x) (x*2)

sbit Ir_Pin=P3^3;

unsigned char Ir_Buf;                               //用于保存解码结果
//unsigned char mode,showmode;                                                                                                       

                                                                  
unsigned int Ir_Get_Low();
unsigned int Ir_Get_High();
void mcu_init(void);
void code_efficacy(void);
void output_control(void);

//#define myhonwai

/****************************************************
函数名称:service_int1
功能描述:外部中断函数,当接收到红外信号时产生中断
输 入: 无
输 出: 无
日期:2009-4-8
外部中断1
*****************************************************/
void service_int1()interrupt 2
{
   unsigned int temp;
   unsigned char i,j;       
   temp=Ir_Get_Low();
   if(temp<c(8500) || temp>c(9500)) return;//引导脉冲低电平9000
   temp=Ir_Get_High();
   if(temp<c(4000) || temp>c(5000)) return;//引导脉冲高电平4500
   for(i=0;i<4;i++)                        //4个字节
   for(j=0;j<8;j++)                        //每个字节8位
   {
      temp=Ir_Get_Low();                                                   
      if(temp<c(300) || temp>c(800))return;
      temp=Ir_Get_High();
      if(temp<c(300) || temp>c(1800))return;
      Ir_Buf>>=1;
      if(temp>c(1120)) Ir_Buf|=0x80;
      }       
       
//   code_efficacy();                         //对接收到的数据进行效验
       output_control();
}
//==============================================================================
unsigned int Ir_Get_Low()
{
      TL1=0;
      TH1=0;
      TR1=1;
      while(!Ir_Pin&& (TH1&0x80)==0);    //等待高电平到来            
      TR1=0;                                                                                           
      return TH1*256+TL1;         //返回T1计数值,以便判断
}

//==============================================================================
unsigned int Ir_Get_High()                                                                                                       

                  
{
      TL1=0;
      TH1=0;
      TR1=1;                  
      while(Ir_Pin && (TH1&0x80)==0);
      TR1=0;
      return TH1*256+TL1;
}
/****************************************************
函数名称:output_control
功能描述:控制输出
输 入: 无
输 出: 无
日期:2009-4-8
*****************************************************/
void output_control(void)
{

   switch(Ir_Buf)
       {
           //=============================开关灯=======================================
           case0x00: Flg_light=1;light++;light%=2;P0=LEDCODE; NeedWriteFunctionFlag=1;break;                               

               
       //=============================运行模式 ======================================
           case0x01: modeA++;if(modeA==3)modeA++;modeA%=5;P0=LEDmodeA;NeedWriteFunctionFlag=1; break;



         default : break;
       }


}


现在每按一下按键,P0的显示会加一,我想请教的是怎样改成长按着按键,P0的显示会一直自动加或减,就像电视上的那种音量控制一样

hlfqzy 发表于 2012-7-31 14:39:16

怎么高手都不来下的呢{:cry:}

raxb 发表于 2012-7-31 14:51:24

和按键不一样的吗?

hlfqzy 发表于 2012-7-31 15:12:37

不一样的

lcw_swust 发表于 2012-7-31 15:15:00

电视遥控器会发送“连发码”

hlfqzy 发表于 2012-7-31 15:21:01

就是这个“连发码”不知要怎样子写的,高手能反指点下吗

hlfqzy 发表于 2012-7-31 15:26:49

如果要在上面那代码上加“连发码”的处理要怎样子修改呢

hlfqzy 发表于 2012-7-31 16:48:43

等待高手们的指教呀{:mad:}

zyyn123 发表于 2012-7-31 19:41:21

本帖最后由 zyyn123 于 2012-7-31 19:42 编辑

首先声明,我不是高手{:smile:}
提供一个思路,你试一下:
设置一变量,当检测到“连发码”时,变量置1,当解码完成后,将变量置0,延时检测变量的值(检测一次,就将变量置0,如果每次检测变量值都为1,说明按键连按)

zxd08 发表于 2012-7-31 20:45:55

如果连发码的每一桢的数据代表的意思是一样的话!有如下思路
*用一个变量保存上一次的键值
如:现在接到+号键的码,变量保存+号键码,并开始计时,在X时间内,如果接到其它键的码,则认为其它键被按下,如果接到的是+号键,则认为是同一次按键发出的码,超过了X时间,将变量值清为0,如果这里接到+号键码,则认为是第2次按下+号键!

hlfqzy 发表于 2012-8-1 08:23:30

谢谢各位的指点{:smile:}

leicai05 发表于 2012-8-1 08:47:09

遥控器的连发就好像是跟引导码一样,固定的长度连续发送。
你解码的时候,先保存下最后一次的功能码,让后接收到连续码时,就知道是什么功能按键长按了
编码的时候就更容易了,就像是发送引导码和高低电平一样,只是时间间隔不一样而已。
页: [1]
查看完整版本: 求助---红外控制如何实现连按处理