本帖最后由 时间继电器 于 2019-6-16 19:49 编辑
下面代码中在第二个for循环的地方,把for(j=1;j<=8;j++)改成for(j=0;j<8;j++),并且这样改动后,同时把程序里的if(j<8)判断语句也删除,因为我认为都是执行8次,没必要这样判断,但是实际程序出错,而且经过好几次测试就是由于这样修改才导致运行出错的,但是我不明白这个是为何?按照我的改动,应该是没影响吧。求指点!(具体描述可能不清楚,所以我附上改动前后的图)
改动前
改动后
下面是整段程序的代码:
[mw_shl_code=c,true]/************************************红外按键解码********************************/
void VS_1838B_decoding(void) //红外信号解码程序
{
static unsigned int USER_DATA=0; //用于在重发模式下 返回上一次的用户码
static unsigned char KEY_DATA=0; //用于在重发模式下 返回上一次的按键码
unsigned char i,j,k; //用于循环采集红外输出的数据
unsigned char hr_time=0; //用于提取每个电平的保持时间
unsigned char hr_dat=0; //用于保存红外信号中的单个字节数据
unsigned char IR_data[4]; //用于存放红外遥控器的数据 16位用户码 8位按键码 8位按键反码
if(Receive_completion_flag) //判断红外遥控信息是否已经捕获完成
{
k=1; //开始解码(这里跳过对引导码的处理,即从时间捕获数组的第二个成员开始处理)
for(i=0;i<4;i++) //每次红外发送四个字节的数据
{
for(j=1;j<=8;j++) //每个字节有8位
{
hr_time=HR_time_data[k]; //提取每一个电平的保持时长
if(hr_time>7) //周期大于(7*250=1.750ms)的信号为“1”信号,正常红外“1”信号周期为2.25ms
{ //如果周期小于1.750ms,则为“0”信号,正常红外的“0”信号周期为1.12ms
hr_dat|=0x80; //写“1”
}
if(j<8)
{
hr_dat>>=1; //右移一位,准备接收下一位信号,(写“0”也在这里完成)
}
k++;
}
IR_data
=hr_dat; //完成一个字节的解码后,数据保存在IR_data数组里
hr_dat=0; //变量清除,准备接收下一个字节数据
}
Receive_completion_flag=0; //完成一次红外数据解码后,清除标志位,准备下一轮按键的解码
if ((IR_data[2] | IR_data[3])==0xff) //4组数据接收完毕 校验按键码是否正确
{
User_code=(((unsigned int)IR_data[1]<<8)|IR_data[0]);//获取用户码
Key_code=IR_data[2]; //获取按键码
Key_code_F=IR_data[3]; //获取按键反码
Infrared_flag=1; //建立红外按下的标志位
USER_DATA=User_code; //静态变量保持本次用户码
KEY_DATA=Key_code; //静态变量保持本次按键码
}
}
}[/mw_shl_code]
一周热门 更多>