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

📄 ps.lst

📁 51单片机上实现对PS2手柄的解析
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE PS
OBJECT MODULE PLACED IN PS.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <stdio.h>
   2          #include <REG922.H>
   3          #include <intrins.h>
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          
   7          uchar code  dout[5]={0x01,0x42,0x00,0x00,0x00};
   8          uchar data  din[5]={0x00,0x00,0x00,0x00,0x00};
   9          uint  code  hos_tabup[16]={0xE31B,0xF800,0xF50D,0xFF07,0xDE26,0x0000,0x0000,0xDF27,              //主手柄释放键表
  10                                      0x877F,0xB941,0xBA42,0x8870,0xDC24,0xA159,0xD820,0xA058};                   
  11          uint  code  hos_tabdn[16]={0x639B,0x7880,0x758D,0x7F87,0x5EA6,0x0000,0x0000,0x5FA7,              //主手柄按键表
  12                                      0x07FF,0x39C1,0x3AC2,0x08F0,0x5CA4,0x21D9,0x58A0,0x20D8};   
  13          /*uint  code  hos_tabup[16]={0x0000,0x8870,0x877F,0x0000,0xDE26,0x0000,0x0000,0xDF27,            //主手柄释放键表
  14                                      0xF50D,0xFF07,0xE31B,0xF800,0xDC24,0xA159,0xD820,0xA058};                           
  15          uint  code  hos_tabdn[16]={0x0000,0x08F0,0x07FF,0x0000,0x5EA6,0x0000,0x0000,0x5FA7,              //主手柄按键表
  16                                      0x758D,0x7F87,0x639B,0x7880,0x5CA4,0x21D9,0x58A0,0x20D8};                           */
  17          uint  code  gue_tabup[16]={     0x9961,0x9A62,0x9B63,0x8B73,0x0000,0x0000,0x0000,0x0000,          //副手柄释放键表
  18                                      0xB149,0xA35B,0xFC04,0xF901,0x0000,0x0000,0x0000,0x0000};
  19          uint  code  gue_tabdn[16]={     0x19E1,0x1AE2,0x1BE3,0x0BF3,0x0000,0x0000,0x0000,0x0000,          //副手柄按键表
  20                                      0x31C9,0x23DB,0x7C84,0x7981,0x0000,0x0000,0x0000,0x0000};
  21          //unsigned long endcode=0x0005AA8A;                                                                                              //结束码的红外发射码    ,
  22          uint   KEY_hos[2]={0xFFFF,0xFFFF};                                         //主游戏手柄扫描值,
  23          uint   KEY_gue[2]={0xFFFF,0xFFFF};                                         //副游戏手柄扫描值,
  24          uint   ir_key;                                                                                                                             //标准红外码缓冲,
  25          uint   chan_key;                                 //手柄按键有变化的位,
  26          uint   stat_key;                                 //当前手柄的状态值,
  27          
  28          unsigned long ref;
  29          unsigned long idata irbuf[32];                                                     //红外输出缓冲区,
  30          unsigned long *p_t;                                            //指向红外缓冲区的两个指针,
  31          unsigned long *p_b;
  32          bit   bdata   Buf_emp=1;                                                                       //红外输出缓冲区空标志,
  33          bit   bdata   Bit_F=0;                                                                            //红外输出的移位标志,
  34          bit   bdata   Buf_ful=0;                                                                                  //红外输出缓冲区满标志
  35          bit   bdata   Saf_F=0;            //安全间隔标志位
  36          bit   bdata   Host_F=0;                                                                                                                  
  37          
  38          sbit  ACK1  =P1^2;
  39          sbit  ACK2  =P1^3;
  40          sbit  DI1   =P0^3;
  41          sbit  DI2   =P1^6;
  42          sbit  DO1   =P0^0;
  43          sbit  DO2   =P0^4;
  44          sbit  CLK1  =P0^2;
  45          sbit  CLK2  =P0^7;
  46          sbit  SEN1  =P0^1;
  47          sbit  SEN2  =P1^7;              
  48          sbit  PWM   =P0^5;
  49          sbit  IR_OUT=P0^6;
  50                                            
  51          
  52          void  delay(uchar n);
  53          void  Isp_Init();                         //初始化串口,
  54          //void  keysignout(void)        ;
  55          void  Getkey_hos(void);
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 2   

  56          void  Getkey_gue(void);
  57          void  Trans(void);               //手柄键码转化为红外输出码,
  58          
  59          main()
  60          {
  61   1      
  62   1         P0M1=0XDF;           //外部引脚I/O配置,
  63   1         P0M2=0XF7;
  64   1         P1M1=0XFF;
  65   1         P1M2=0X83;
  66   1         DIVM=0;                      //时钟分频设置,
  67   1      //   AUXR1=AUXR1|0x80;
  68   1         TH0=238;
  69   1         TL0=212;
  70   1         TMOD=0X01;           //记数器0设置,
  71   1         PWM=0;
  72   1         IR_OUT=1;
  73   1         TCON=0x14;           //设置下降沿中断,
  74   1         IEN0=0x06;           //开外部中断一    ,定时器零,
  75   1         EA=1;
  76   1         Isp_Init();                            //初始化串口,
  77   1      
  78   1         p_t=&irbuf[0];
  79   1         p_b=&irbuf[0];
  80   1      
  81   1      
  82   1      
  83   1        while(1)
  84   1        {
  85   2         Getkey_hos();
  86   2         chan_key=KEY_hos[0]^KEY_hos[1];
  87   2         if(chan_key)
  88   2         {
  89   3           Host_F=1;
  90   3           stat_key=KEY_hos[0];
  91   3           Trans();
  92   3               KEY_hos[1]=KEY_hos[0];
  93   3              }
  94   2         Getkey_gue();
  95   2         chan_key=KEY_gue[0]^KEY_gue[1];
  96   2         if(chan_key)  
  97   2         { 
  98   3           Host_F=0;
  99   3           stat_key=KEY_gue[0];
 100   3           Trans();
 101   3               KEY_gue[1]=KEY_gue[0];
 102   3          }
 103   2        }      
 104   1      
 105   1      }
 106          
 107          void irout() interrupt  2 using 2                  //使用外部中断1中断服务程序   ,
 108          {
 109   1        EA=0;
 110   1        IR_OUT=PWM;
 111   1        PWM=!PWM;
 112   1        EA=1;
 113   1      } 
 114          
 115          void delay(     uchar n)                         //n*12us延时程序;
 116          {
 117   1          uchar i,    j;
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 3   

 118   1              for(i=0;i<n;i++)
 119   1              {
 120   2                for(j=0;j<10;j++)
 121   2                {
 122   3                  _nop_();
 123   3                 }    
 124   2               }
 125   1      }       
 126          void  Getkey_hos()                                              //get gamekdy
 127          {
 128   1       uchar p,i,ref;
 129   1        SEN2=0;
 130   1        delay(4);
 131   1        for(p=0;p<5;p++)
 132   1       {
 133   2              for(ref=0x01;ref>0x00;ref<<=1)
 134   2        {
 135   3              CLK2=0;
 136   3              if(ref&dout[p])            //输出一位控制数据     ?是否满足4us    
 137   3                DO2=1;
 138   3              else
 139   3                DO2=0;
 140   3              for(i=0;i<3;i++)                //大概2us的延迟,
 141   3              _nop_();                                
 142   3              CLK2=1;
 143   3              if(DI2)
 144   3                din[p]=ref|din[p];  //输入一位控制数据          ?是否满足4us   
 145   3              for(i=0;i<2;i++)                //大概2us的延迟,
 146   3              _nop_();
 147   3         }
 148   2          DO2=1;
 149   2          if(p<4)
 150   2              { 
 151   3      
 152   3      //        delay(1); 
 153   3      //      do
 154   3      //        {
 155   3      //        while(ACK2)                     //检测ACK信号是否响应。         有响应则向下          执行。
 156   3      //        {
 157   3                _nop_();
 158   3      //        ACK=1;
 159   3      //        timeout=10000;
 160   3      //        break;
 161   3      //        }
 162   3                delay(2);
 163   3      //        }
 164   3      //        while(timeout--);
 165   3              }
 166   2      //      else
 167   2      //      {}
 168   2      
 169   2         }
 170   1        SEN2=1;
 171   1      //  delay(2);
 172   1      //  keysignout();                     // 键码值通过串口输出。   
 173   1         KEY_hos[0]=din[3];
 174   1         KEY_hos[0]<<=8;
 175   1         KEY_hos[0]+=din[4];
 176   1        for(i=0;i<5;i++)
 177   1        din[i]=0x00;
 178   1      //  for(i=0;i<255;i++)
 179   1      //  delay(255); 
C51 COMPILER V8.05a   PS                                                                   06/20/2007 10:34:01 PAGE 4   

 180   1      
 181   1      } 
 182          
 183          void  Getkey_gue()                                              //get gamekdy
 184          {
 185   1       uchar p,i,ref;
 186   1      
 187   1        SEN1=0;
 188   1        delay(4);
 189   1        for(p=0;p<5;p++)
 190   1       {
 191   2              for(ref=0x01;ref>0x00;ref<<=1)
 192   2        {
 193   3              CLK1=0;

⌨️ 快捷键说明

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