ldx T1H,#%0 ; 定时器重新置零 orx _ir_flag,#1 ; 标记收到红外线信号 c3_x iret ;============================================================= vector TIMER1=_isr_T1 ;23.52mS _isr_T1: ; ldx _step_ctr,#0 ; 无红外线信号空挡,步骤置零 iret //C 语言部分 //////////////////////////////////////////////////////// // NEC uPD6121 波形 红外线读码 2007-08-23 江文正 // 方法 : 接收管输出下降沿触发中断子程序,读取下降沿之间的时间 width 后把定时器重新置零 // width 单位= 92.23uS, 前提是 定时器时钟 = 5.5296 MHz, prescale = 2 // 两个下降沿之间时段: 引导码, >11.81mS : width=128 // 重复码, >9mS : width=97 // >1.69mS : width=18 = 高电平数据, <1.69mS : width=18 = 低电平数据 IR_decode() { char rcv_8bit=0; int rcv_16bit=0; ir_flag &= 0xFE; //标记已处理 if (step_ctr ==0) { step_ctr=1; //开始 } else { if (width > 128) //引导码 { step_ctr=2; user_code=0; // 清0 cmd_code=0; // 清0 } else { if (width > 97) //重复码 { step_ctr=34; // } else { if (width > 18) //高电平 { rcv_8bit=1; rcv_16bit=1; } if (step_ctr<18) //用户码 { rcv_16bit = rcv_16bit << (step_ctr-1); user_code |= rcv_16bit; } else { if (step_ctr<26) //控制码 { rcv_8bit = rcv_8bit << (step_ctr-17); cmd_code |= rcv_8bit; } } if (step_ctr>25) //反码 { rcv_8bit = rcv_8bit << (step_ctr-25); comp_code |= rcv_8bit; } step_ctr++; if (step_ctr>33) //有效码 { comp_code ^= 0xFF; //2反位,2'complement comp_code--; if (cmd_code != comp_code) { step_ctr = 0; //错码,无效 } } } } } } 大部分国内生产的遥控器都使用NEC码,你先按照提示找出你手中遥控器的用户码,然后再找出你所想使用的那几个按键的功能码,再把这些码取代以下的部分 //所用遥控器的控制码, 不同遥控器的码会不一样 #define user 0xFF00;// 用户码 #define vol_up 0x58; // 增音量 <vol +> 按键 #define vol_dn 0x59; // 减音量 <vol -> 按键 #define ch_up 0x4A; // 下一个切换位置 <tune +> 按键 #define ch_dn 0x1E; // 前一个切换位置 <tune -> 按键 #define mute 0x46; // 静音 <mute> 按键 #define pwr 0x40; // 电源开关 <pwr> 按键 (责任编辑:admin) |