⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irrecv.lst

📁 此代码实现功能为:在philips P89LPC935单片机上实现红外遥(对应红外发送芯片为:HT6222)控解码接收
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -