📄 irrecv.lst
字号:
190 6 g_pulseNum++; //计算脉宽,insr0>=3,bit counter
191 6 g_insr1 = g_insr0;
192 6 g_insr0 = 0x00;
193 6 }
194 5 else
195 5 {
196 6 if(g_insr0 >= MAX_CONT_PLS) //大于连续按键最大脉宽即为前导码
197 6 {
198 7 g_IR_SF = 0;
199 7 //g_keyPressed = 0x00;
200 7 g_pulseNum++; //计算脉宽,insr0>=3,bit counter
201 7 g_insr1 = g_insr0; //High level counter
202 7 g_insr0 = 0x00;
203 7 g_RSDA2 = 1; //a high level,a valid pulse
204 7 }
205 6 else //连续按键
206 6 {
207 7 g_IR_SF = 1; //2ms<Pulse width<2.5ms,translate the same key value
208 7 g_RSDA2 = 1;
209 7 }
210 6 }
211 5 checkPulse();
212 5 }
213 4 }
214 3 }
215 2 }
216 1 else
217 1 {
218 2 if(!IR_SIGNAL)
219 2 {
220 3 g_RSDA1 = 1; //ir_sign fall,指示遥控按键操作的第一个下降沿
221 3 g_RSDA2 = 0; //no high pulse,RSDA2=0,脉冲指示清0
222 3 g_IR_SF = 0; //连续按键指示清0
223 3
224 3 g_insr0 = 0x00; //counter init,TIM0计数器清0
225 3 g_pulseNum = 0x00; //bit cnt init
226 3 }
227 2 }
228 1 // TL0 = 0xB0; //100uS
229 1 // TH0 = 0xFE; //定时器0 happen per 0.1MS
230 1
231 1 TL1 = 0xD8; //100uS
232 1 TH1 = 0xFD; //定时器0 happen per 0.1MS
233 1 }
234
235
236 /*******************************************************************
237 ** 函 数 名: checkProc()
238 ** 输 入: 无
239 ** 输 出: 无
240 ** 描 述: 每0.5ms分析脉冲波形。
241 ** 全局变量:
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 5
242 ** g_keyPressed -- 连续按键标志
243 ** 调用模块:
244 ** pulseProc -- 脉冲处理
245 ** 被调模块:
246 ** 作 者: 金雨和
247 ** 创建日期: 2005年11月02日
248 ** 修 改:
249 ** 日 期 版本 修改人 修改内容
250 ** 1.
251 ********************************************************************/
252 void checkPulse()
253 {
254 1 if(g_RSDA2) //有效脉冲
255 1 {
256 2 if(g_IR_SF) //连续按键,所谓连续按键就是按住一个键不放,
257 2 { // 2.0ms<脉宽<2.5ms,为连续按键
258 3 g_keyPressed++;
259 3 g_IR_SF = 0; //连续按键标志清零
260 3 g_RSDA1 = 0;
261 3 if(g_keyPressed > 6) //收到10个连续按键脉冲才认为是有效连续按键
262 3 {
263 4 g_keyPressed = 0x00;
264 4 g_rsFlag = 1; //RSFLAG indicate remote data is active
265 4 }
266 3 }
267 2 else //按键正常波形
268 2 pulseProc(g_pulseNum); //正常按键波形处理
269 2 }
270 1 else //无效脉冲,退出
271 1 {
272 2 if(g_RSDA1)
273 2 if(g_insr0 > INVALID_PLS)
274 2 g_RSDA1 = 0;
275 2 }
276 1 }
277
278
279 /*******************************************************************
280 ** 函 数 名: pulseProc()
281 ** 输 入:
282 ** pulseNum -- 脉冲数
283 ** 输 出: 无
284 ** 描 述: 脉冲处理函数。
285 ** 全局变量:
286 ** g_keyUser -- 用户码
287 ** g_keyUserF -- 用户反码
288 ** g_keyValue -- 键码
289 ** g_keyValueF -- 键码反码
290 ** 调用模块: 无
291 ** 被调模块:
292 ** checkPulse -- 脉冲检测
293 ** 作 者: 金雨和
294 ** 创建日期: 2005年11月02日
295 ** 修 改:
296 ** 日 期 版本 修改人 修改内容
297 ** 1.
298 ********************************************************************/
299 void pulseProc(unsigned char pulseNum)
300 {
301 1 if(pulseNum > 0)
302 1 {
303 2 if(g_insr1 == 0)
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 6
304 2 return;
305 2
306 2 if(pulseNum > 1)
307 2 {
308 3 if((pulseNum >=2) && (pulseNum <= 9)) //用户码处理
309 3 {
310 4 if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
311 4 g_keyUser >>= 1;
312 4 else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
313 4 {
314 5 g_keyUser >>= 1;
315 5 g_keyUser = g_keyUser+128;
316 5 }
317 4 else
318 4 ;//g_RSDA3 = 1;
319 4 }
320 3 else if((pulseNum >= 10) && (pulseNum <= 17)) //用户码反码处理
321 3 {
322 4 if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
323 4 g_keyUserF >>= 1;
324 4 else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
325 4 {
326 5 g_keyUserF >>= 1;
327 5 g_keyUserF = g_keyUserF+128;
328 5 }
329 4 else
330 4 ;//g_RSDA3 = 1;
331 4 }
332 3 else if((pulseNum >= 18) && (pulseNum <= 25)) //键值处理
333 3 {
334 4 if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
335 4 g_keyValue >>= 1;
336 4 else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
337 4 {
338 5 g_keyValue >>= 1;
339 5 g_keyValue = g_keyValue+128;
340 5 }
341 4 else
342 4 ;//g_RSDA3 = 1;
343 4 }
344 3 else if((pulseNum >= 26) && (pulseNum <= 33)) //键值反码处理
345 3 {
346 4 if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
347 4 g_keyValueF >>= 1;
348 4 else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
349 4 {
350 5 g_keyValueF >>= 1;
351 5 g_keyValueF = g_keyValueF+128;
352 5 }
353 4 else
354 4 ;//g_RSDA3 = 1;
355 4 }
356 3
357 3 if(pulseNum >= 33) //正确收到
358 3 {
359 4 if((g_keyUser == 0x00) && (g_keyUserF == 0xFF) && (g_keyValue == ~g_keyValueF))
360 4 {
361 5 g_rsData = g_keyValue; //得到红外遥控键值
362 5
363 5 g_IR_SF = 0;
364 5 g_rsFlag = 1;
365 5 g_RSDA1 = 0;
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 7
366 5 }
367 4 else
368 4 g_RSDA1 = 0;
369 4 }
370 3 }
371 2 else //g_pulseNum为1,第一个脉冲为前导码标志,
372 2 { //一个下降沿和上升沿构成一个波形脉冲|_|--
373 3 if((g_insr1 > MIN_CODE_PLS)&&(g_insr1 < MAX_CODE_PLS)) //检测到前导码
374 3 {
375 4 g_keyValue = 0x00; //键值
376 4 g_keyValueF = 0x00; //键值反码
377 4 g_keyUser = 0x00; //用户码
378 4 g_keyUserF = 0x00; //用户码反码
379 4 }
380 3 else
381 3 ;//g_RSDA3 = 1;
382 3 }
383 2
384 2 //g_insr1 = 0;
385 2 }
386 1 else
387 1 g_RSDA3 = 0; //清无效标志
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -