最近编程发现自己真的真的很菜,写红外遥控器解码的程序,耗时好久,最后参考别人的代码,但是有一处程序不理解,求指教。

2019-07-20 23:48发布

本帖最后由 时间继电器 于 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]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。