求助---红外控制如何实现连按处理
//===================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的显示会一直自动加或减,就像电视上的那种音量控制一样 怎么高手都不来下的呢{:cry:} 和按键不一样的吗? 不一样的 电视遥控器会发送“连发码” 就是这个“连发码”不知要怎样子写的,高手能反指点下吗 如果要在上面那代码上加“连发码”的处理要怎样子修改呢 等待高手们的指教呀{:mad:} 本帖最后由 zyyn123 于 2012-7-31 19:42 编辑
首先声明,我不是高手{:smile:}
提供一个思路,你试一下:
设置一变量,当检测到“连发码”时,变量置1,当解码完成后,将变量置0,延时检测变量的值(检测一次,就将变量置0,如果每次检测变量值都为1,说明按键连按) 如果连发码的每一桢的数据代表的意思是一样的话!有如下思路
*用一个变量保存上一次的键值
如:现在接到+号键的码,变量保存+号键码,并开始计时,在X时间内,如果接到其它键的码,则认为其它键被按下,如果接到的是+号键,则认为是同一次按键发出的码,超过了X时间,将变量值清为0,如果这里接到+号键码,则认为是第2次按下+号键! 谢谢各位的指点{:smile:} 遥控器的连发就好像是跟引导码一样,固定的长度连续发送。
你解码的时候,先保存下最后一次的功能码,让后接收到连续码时,就知道是什么功能按键长按了
编码的时候就更容易了,就像是发送引导码和高低电平一样,只是时间间隔不一样而已。
页:
[1]