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

📄 usbex.lst

📁 使用ch375和stc 51写的usb鼠标的代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 155          //      ((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
 156          //      ((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
 157          //      return( out );
 158          //}
 159          
 160          void CH375_WR_CMD_PORT( unsigned char cmd ) {                            /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较
             -快则延时 */
 161   1              //delay2us();
 162   1              CH375_CMD_PORT=cmd;
 163   1              Delay2us( );
 164   1      }
 165          
 166          void CH375_WR_DAT_PORT( unsigned char dat ) {                            /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机
             -较快则延时 */
 167   1              CH375_DAT_PORT=dat;
 168   1              Delay1us();                                                                                     /* 因为MCS51单片机较慢所以实际上无需延时 */
 169   1      }
 170          
 171          unsigned char CH375_RD_DAT_PORT() {                                             /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延
             -时 */
 172   1              Delay1us( );                                                                            /* 因为MCS51单片机较慢所以实际上无需延时 */
 173   1              return( CH375_DAT_PORT );
 174   1      
 175   1      }
 176          /* CH375初始化子程序 */
C51 COMPILER V7.06   USBEX                                                                 04/03/2006 15:21:51 PAGE 4   

 177          void    CH375_Init( )
 178          {
 179   1      /* 设置USB工作模式, 必要操作 */
 180   1              CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
 181   1              CH375_WR_DAT_PORT( 1 );                                                                         /* 设置为使用内置固件的USB设备方式 */
 182   1              for ( ;; ) {                                                                                    /* 等待操作成功,通常需要等待10uS-20uS */
 183   2                      if ( CH375_RD_DAT_PORT( )==CMD_RET_SUCCESS ) break;
 184   2              }
 185   1      
 186   1      /* 下述启用中断,假定CH375连接在INT0 */
 187   1              IT0 = 0;  /* 置外部信号为低电平触发 */
 188   1              IE0 = 0;  /* 清中断标志 */
 189   1              EX0 = 1;  /* 允许CH375中断 */
 190   1      }
 191          //*********************************************************
 192          
 193          //*********************************************************
 194          //端点0数据上传
 195          void mCh375Ep0Up(){
 196   1              unsigned char i,len;
 197   1              if(mVarSetupLength){                                                                                            //长度不为0传输具体长度的数据
 198   2                      if(mVarSetupLength<=8){
 199   3                              len=mVarSetupLength;
 200   3                              mVarSetupLength=0;
 201   3              }       //长度小于8则长输要求的长度
 202   2                      else{
 203   3                              len=8;
 204   3                              mVarSetupLength-=8;
 205   3                      }                                                                                               //长度大于8则传输8个,切总长度减8
 206   2                  CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);                                                //发出写端点0的命令
 207   2              CH375_WR_DAT_PORT(len);                                                                         //写入长度
 208   2              for(i=0;i!=len;i++)
 209   2              CH375_WR_DAT_PORT(request.buffer[i]);                           //循环写入数据
 210   2          }
 211   1              else{
 212   2                      CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);                                            //发出写端点0的命令
 213   2                      CH375_WR_DAT_PORT(0);                                                      //上传0长度数据,这是一个状态阶段
 214   2              }
 215   1      }
 216          
 217          
 218          //*********************************************************
 219          
 220          //复制描述符以便上传
 221          void mCh375DesUp(){
 222   1              unsigned char k;        
 223   1              for (k=0; k!=8; k++ ) {
 224   2               request.buffer[k]=*VarSetupDescr;                                                              //依次复制8个描述符,
 225   2               VarSetupDescr++;
 226   2          }
 227   1      }
 228          
 229          /* CH375中断服务程序INT0,使用寄存器组1 */
 230          void    mCH375Interrupt( ) interrupt 0 using 1
 231          {
 232   1              unsigned char InterruptStatus;
 233   1              unsigned char length, c1, len;
 234   1              unsigned char   *pBuf;
 235   1              unsigned char   mBuf[64];
 236   1              CH375_WR_CMD_PORT(CMD_GET_STATUS);                                                                      /* 获取中断状态并取消中断请求 */
 237   1              InterruptStatus =CH375_RD_DAT_PORT();                                                                   /* 获取中断状态 */
 238   1              IE0 = 0;                                                                                                                                /* 清中断标志,对应于INT0中断 */
C51 COMPILER V7.06   USBEX                                                                 04/03/2006 15:21:51 PAGE 5   

 239   1              switch(InterruptStatus){  // 分析中断状态
 240   2                      case  USB_INT_EP2_OUT:                                                                                          // 批量端点下传成功 
 241   2                              pBuf=mBuf;                                                                                                                                      //数据未处理
 242   2                              CH375_WR_CMD_PORT(CMD_RD_USB_DATA);                                                                     //发出读数据命令
 243   2                              length=CH375_RD_DAT_PORT();                                                                                     //首先读出的是长度                                                                                                              
 244   2                              for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT();   //将数据读入到缓冲区                     
 245   2                              pBuf=mBuf;
 246   2      // 演示回传
 247   2                              CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);                                                            //发出写上传端点命令
 248   2                              CH375_WR_DAT_PORT(length);      
 249   2                              for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf);    //将数据写入上传端点
 250   2                              break;
 251   2                      case   USB_INT_EP2_IN:                                                                                           //批量端点上传成功,未处理
 252   2                              CH375_WR_CMD_PORT (CMD_UNLOCK_USB);                                                             //释放缓冲区
 253   2                              break;
 254   2                      case   USB_INT_EP1_IN:                                                                                          //中断端点上传成功,未处理
 255   2                              CH375_WR_CMD_PORT (CMD_UNLOCK_USB);                                                             //释放缓冲区
 256   2                              break;
 257   2                      case   USB_INT_EP1_OUT:                                                                                         //中断端点下传成功,未处理
 258   2                              CH375_WR_CMD_PORT(CMD_RD_USB_DATA);                                                                     //发出读数据命令
 259   2                              if(length=CH375_RD_DAT_PORT()){                                                                         //长度为0跳出
 260   3                                      for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT();                                     //取出下传数据
 261   3                              }
 262   2      //                      CH375_WR_CMD_PORT (CMD_UNLOCK_USB);                                                             //释放缓冲区,如果前面没有CMD_RD_USB_DATA命令则使用本命令
 263   2                              break;
 264   2                      case   USB_INT_EP0_SETUP:                                                                                       //控制端点建立成功
 265   2                      CH375_WR_CMD_PORT(CMD_RD_USB_DATA);
 266   2                              length=CH375_RD_DAT_PORT();
 267   2                              for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT();  // 取出数据
 268   2                              if(length==0x08){
 269   3                                  mVarSetupLength=request.buffer[6]&0x7f;                                                     //控制传输数据长度最大设置为128
 270   3                                      if((c1=request.r.bmReuestType)&0x40){                                            //厂商请求,未处理
 271   4                                      }
 272   3                                      if((c1=request.r.bmReuestType)&0x20){                                           //类请求,未处理
 273   4                                      }
 274   3                                      if(!((c1=request.r.bmReuestType)&0x60)){                                        //标准请求
 275   4                                              mVarSetupRequest=request.r.bRequest;                                                    //暂存标准请求码
 276   4                                              switch(request.r.bRequest){  // 分析标准请求
 277   5                                                      case DEF_USB_CLR_FEATURE:                                                                       //清除特性
 278   5                                                              if((c1=request.r.bmReuestType&0x1F)==0X02){                                     //不是端点不支持
 279   6                                                                      switch(request.buffer[4]){
 280   7                                                                              case 0x82:
 281   7                                                                                      CH375_WR_CMD_PORT(CMD_SET_ENDP7);                                       //清除端点2上传
 282   7                                                                                      CH375_WR_DAT_PORT(0x8E);                                        //发命令清除端点
 283   7                                                                                      break;
 284   7                                                                              case 0x02:
 285   7                                                                                      CH375_WR_CMD_PORT(CMD_SET_ENDP6);
 286   7                                                                                      CH375_WR_DAT_PORT(0x80);                                                        //清除端点2下传
 287   7                                                                                      break;
 288   7                                                                              case 0x81:
 289   7                                                                                      CH375_WR_CMD_PORT(CMD_SET_ENDP5);                                       //清除端点1上传
 290   7                                                                                      CH375_WR_DAT_PORT(0x8E);
 291   7                                                                                      break;
 292   7                                                                              case 0x01:
 293   7                                                                                      CH375_WR_CMD_PORT(CMD_SET_ENDP4);                                       //清除端点1下传
 294   7                                                                                      CH375_WR_DAT_PORT(0x80);
 295   7                                                                                      break;
 296   7                                                                              default:
 297   7                                                                                      break;
 298   7                                                                      }
 299   6                                                              }
 300   5                                                              else{
C51 COMPILER V7.06   USBEX                                                                 04/03/2006 15:21:51 PAGE 6   

 301   6                                                                      CH375FLAGERR=1;                                                         //不支持的清除特性,置错误标志
 302   6                                                              }
 303   5                                                              break;
 304   5                                                      case DEF_USB_GET_STATUS:                                                                //获得状态
 305   5                                                              request.buffer[0]=0;
 306   5                                                              request.buffer[1]=0;                                                            //上传状态
 307   5                                                              break;
 308   5                                                      case DEF_USB_SET_ADDRESS:                                                               //设置地址
 309   5                                                              VarUsbAddress=request.buffer[2];                                        //暂存USB主机发来的地址
 310   5                                                              break;
 311   5                                                      case DEF_USB_GET_DESCR:                                                                 //获得描述符
 312   5                                                              if(request.buffer[3]==1)                                                        //设备描述符上传

⌨️ 快捷键说明

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