搜索
bottom↓
回复: 11

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

[复制链接]

出0入0汤圆

发表于 2012-7-31 13:50:03 | 显示全部楼层 |阅读模式
//===================  24MHZ  =========================

#define c(x) (x*2)

sbit Ir_Pin=P3^3;

unsigned char Ir_Buf[4];                               //用于保存解码结果
//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[i]>>=1;
        if(temp>c(1120)) Ir_Buf[i]|=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[2])
         {
           //=============================  开关灯  =======================================
           case  0x00: Flg_light=1;light++;light%=2;P0=LEDCODE[light]; NeedWriteFunctionFlag=1;  break;                               

               
         //=============================  运行模式 ======================================
           case  0x01: modeA++;if(modeA==3)modeA++;modeA%=5;P0=LEDmodeA[modeA];  NeedWriteFunctionFlag=1; break;



           default : break;
         }


}


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-7-31 14:39:16 | 显示全部楼层
怎么高手都不来下的呢

出0入0汤圆

发表于 2012-7-31 14:51:24 | 显示全部楼层
和按键不一样的吗?

出0入0汤圆

 楼主| 发表于 2012-7-31 15:12:37 | 显示全部楼层
不一样的

出0入0汤圆

发表于 2012-7-31 15:15:00 | 显示全部楼层
电视遥控器会发送“连发码”

出0入0汤圆

 楼主| 发表于 2012-7-31 15:21:01 | 显示全部楼层
就是这个“连发码”不知要怎样子写的,高手能反指点下吗

出0入0汤圆

 楼主| 发表于 2012-7-31 15:26:49 | 显示全部楼层
如果要在上面那代码上加“连发码”的处理要怎样子修改呢

出0入0汤圆

 楼主| 发表于 2012-7-31 16:48:43 | 显示全部楼层
等待高手们的指教呀

出0入0汤圆

发表于 2012-7-31 19:41:21 | 显示全部楼层
本帖最后由 zyyn123 于 2012-7-31 19:42 编辑

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-8-1 08:23:30 | 显示全部楼层
谢谢各位的指点

出0入0汤圆

发表于 2012-8-1 08:47:09 | 显示全部楼层
遥控器的连发就好像是跟引导码一样,固定的长度连续发送。
你解码的时候,先保存下最后一次的功能码,让后接收到连续码时,就知道是什么功能按键长按了
编码的时候就更容易了,就像是发送引导码和高低电平一样,只是时间间隔不一样而已。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 20:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表