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

📄 ps.lst

📁 51单片机上实现对PS2手柄的解析
💻 LST
📖 第 1 页 / 共 2 页
字号:
 194   3              if(ref&dout[p])            //输出一位控制数据     ?是否满足4us    
 195   3                DO1=1;
 196   3              else
 197   3                DO1=0;
 198   3              for(i=0;i<3;i++)                //大概2us的延迟,
 199   3              _nop_();                                
 200   3              CLK1=1;
 201   3              if(DI1)
 202   3                din[p]=ref|din[p];  //输入一位控制数据          ?是否满足4us   
 203   3              for(i=0;i<2;i++)                //大概2us的延迟,
 204   3              _nop_();
 205   3         }
 206   2          DO1=1;
 207   2          if(p<4)
 208   2              { 
 209   3      
 210   3      //        delay(1); 
 211   3      //      do
 212   3      //        {
 213   3      //        while(ACK2)                     //检测ACK信号是否响应。         有响应则向下          执行。
 214   3      //        {
 215   3                _nop_();
 216   3      //        ACK=1;
 217   3      //        timeout=10000;
 218   3      //        break;
 219   3      //        }
 220   3                delay(2);
 221   3      //        }
 222   3      //        while(timeout--);
 223   3              }
 224   2      //      else
 225   2      //      {}
 226   2      
 227   2         }
 228   1        SEN1=1;
 229   1      //  delay(2);
 230   1      //  keysignout();                     // 键码值通过串口输出。   
 231   1         KEY_gue[0]=(din[3]|0x0F);
 232   1         KEY_gue[0]<<=8;
 233   1         KEY_gue[0]+=(din[4]|0x0F);
 234   1        for(i=0;i<5;i++)
 235   1        din[i]=0x00;
 236   1      //  for(i=0;i<255;i++)
 237   1      //  delay(255); 
 238   1                                       
 239   1      }
 240          void Isp_Init()                           //初始化串口,
 241          {
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 5   

 242   1          SSTAT=0xFA;
 243   1              BRGCON=0x00;
 244   1              AUXR1=0x40;
 245   1              SCON=0x50;
 246   1              BRGR1=0x90;
 247   1              BRGR0=0x00;
 248   1              BRGCON=0x03;
 249   1      }
 250          
 251          void t0() interrupt 1 using 2              //使用定时器0中断服务程序     ,
 252          {
 253   1      /* if(Buf_emp==0)
 254   1        TxD=0;
 255   1       else
 256   1        TxD=1;         */
 257   1       if(Saf_F)                                                         //安全间隔时间定时,
 258   1       {                                                                         
 259   2           Saf_F=0;
 260   2               IR_OUT=1;
 261   2               TH0=39;
 262   2               TL0=200;
 263   2               TR0=1;
 264   2       }
 265   1       else
 266   1       {
 267   2        if(Buf_emp==0)
 268   2         {
 269   3           TH0=255;                                              //定时45us
 270   3           TL0=6;
 271   3           if(Bit_F==0)
 272   3                 {
 273   4                  Bit_F=1;
 274   4                  ref=0x00000001; 
 275   4              }
 276   3               if(*p_b&ref)                                     //输出一位红外数据,
 277   3                  IR_OUT=0;                                     
 278   3               else
 279   3                  IR_OUT=1;
 280   3               TR0=1;
 281   3               ref<<=1;
 282   3               if(ref>0x00080000)                               //判断一个红外码字是否发完,
 283   3                      {
 284   4                      Bit_F=0;
 285   4                  Buf_ful=0;
 286   4                      if(p_b==&irbuf[31])
 287   4                        p_b=&irbuf[0];
 288   4                      else
 289   4                        p_b++;
 290   4                  if(p_b==p_t)
 291   4                        Buf_emp=1;
 292   4                      Saf_F=1;                                          //置保护时间标志,
 293   4       
 294   4                      }
 295   3         }
 296   2        else
 297   2         {
 298   3            TH0=255;                                            //这个时间能否再减小?
 299   3            TL0=6; 
 300   3            TR0=1;
 301   3                IR_OUT=!PWM;                                                                          
 302   3         }
 303   2       }
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 6   

 304   1      }
 305          
 306           void Trans()                                           //手柄键码值转换为红外输出码值,
 307          {
 308   1        uchar  i;
 309   1        uint   ref;                                                                            //一次扫描手柄后出现变化的键,
 310   1       // if(KEY[0]==KEY[1])
 311   1       // return;
 312   1       // else
 313   1        if(Buf_ful==0)
 314   1        {
 315   2      
 316   2        for(i=0,ref=0x8000;i<16;i++,ref>>=1)
 317   2        {
 318   3          if(chan_key&ref)
 319   3              {
 320   4                if(stat_key&ref)                                                                 //为真检测到释放键
 321   4                 {
 322   5                  if(Host_F)                                                                     //释放键为主手柄的释放键
 323   5                  ir_key=hos_tabup[i];
 324   5                      else                                                                                    //释放键为副手柄的释放键
 325   5                      ir_key=gue_tabup[i];                                //释放键进入红外寄存器 
 326   5                  *p_t=ir_key&0x00FF;
 327   5              *p_t<<=12;
 328   5              *p_t+=(((ir_key&0xFF00)>>6)|0x0802);
 329   5      
 330   5      /*         if(p_t==&irbuf[31])
 331   5                   p_t=&irbuf[0];
 332   5                 else
 333   5                   p_t++;
 334   5                 Buf_emp=0;                                    //红外输出缓冲区有数据,
 335   5                 if(p_t==p_b)
 336   5                  {
 337   5                   Buf_ful=1;                                              //红外输出缓冲区满,
 338   5                       while(1)                                 //测试缓冲区是否会满,
 339   5                       {
 340   5                        DO1=1;
 341   5                        delay(5);
 342   5                        DO1=0;
 343   5                        delay(5);
 344   5                        }
 345   5                   return;                        
 346   5                  }
 347   5      
 348   5                      *p_t=0x0005AA8A;                                                        //结束键进缓冲区,                      */
 349   5                 }
 350   4                else                                                                                    //检测到按下键,
 351   4                 {                                                                                      
 352   5                  if(Host_F)                                                                    //按下键为主手柄的按下键,
 353   5                  ir_key=hos_tabdn[i];
 354   5                      else                                                                              //按下键为副手柄的按下键,
 355   5                      ir_key=gue_tabdn[i];
 356   5              *p_t=ir_key&0x00FF;
 357   5              *p_t<<=12;
 358   5              *p_t+=(((ir_key&0xFF00)>>6)|0x0802);              //标准红外码转换为添加过引导码的发送红外码,
 359   5                 }
 360   4                if(p_t==&irbuf[31])
 361   4                  p_t=&irbuf[0];
 362   4                else
 363   4                  p_t++;
 364   4                Buf_emp=0;                   //红外输出缓冲区有数据,
 365   4                if(p_t==p_b)
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 7   

 366   4                 {
 367   5                  Buf_ful=1;                            //红外输出缓冲区满,
 368   5      //      while(1)                                  //测试缓冲区是否会满,
 369   5      //               {
 370   5                TxD=0;
 371   5      //                }             
 372   5                      return;
 373   5                 }
 374   4               
 375   4              }
 376   3      
 377   3         }
 378   2         }
 379   1      
 380   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1062    ----
   CONSTANT SIZE    =    133    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     29       3
   IDATA SIZE       =    128    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -