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

📄 demo.lst

📁 光驱改成CD播放器,51作CPU,1602作显示,可以加入遥控器,非常好用的
💻 LST
📖 第 1 页 / 共 2 页
字号:
 286   2            CS1 = 0; //WR,CS1置回
 287   2            DBL = 0xFF;
 288   2            DBM = 0xFF;
 289   2            dmsec(3); //延时
 290   2            //EA=1; 在这开中断
 291   2          }
 292   1        ReadStatus(); //返回当前状态
 293   1        //INTRQWait(); //等待CDROM中断
 294   1      }
 295          
 296          //返回数据,Count为返回数据的多少
 297          void ResData(unsigned char Count)
 298          {
 299   1        unsigned char TempCyc;
 300   1        for (TempCyc=0; TempCyc<Count; TempCyc++)
C51 COMPILER V7.09   DEMO                                                                  06/07/2004 00:25:23 PAGE 6   

 301   1          {
 302   2            CDCOM = REG_Data; //设控制IO,CS0-1=0,A0-2=0,WR-RD=1,RST=1
 303   2            //EA=0;//程序中有中断程序时应先关中断
 304   2            CS1 = 1;  //这时CS1=1,CS0=0,A0-2=0,为选择数据寄存器Data Register
 305   2            RD = 0; //开始读数据线
 306   2            PacketTemp[TempCyc*2] = DBL;
 307   2            PacketTemp[TempCyc*2+1] = DBM;
 308   2            RD = 1; 
 309   2            CS1 = 0; //WR,CS1置回
 310   2            dmsec(3); //延时
 311   2            //EA=1; 在这开中断  
 312   2          }
 313   1      
 314   1      }
 315          
 316          //读当前CDROM状态
 317          void ReadStatus(void)
 318          {
 319   1        RedREG(REG_Status);//读状态寄存器
 320   1        CDStatusREG = REGBL; //放入可寻址位方便使用
 321   1      }
 322          
 323          //读曲目TOC
 324          void ReadTOC(unsigned char Track)
 325          {
 326   1        unsigned char TempCyc = 0;
 327   1      
 328   1        LoadPacket(ReadTOCP); //暂存数据到RAM
 329   1        PacketTemp[6] = Track; //要读取的轨道,值为0H-63H,写AAH为返回开始区段值
 330   1        SendPacket(0); //向CDROM送信息包
 331   1        ResData(12);//返回数据4字节
 332   1      
 333   1        StartTrackNum = PacketTemp[2]; //读首曲目数字
 334   1        EndTrackNum = PacketTemp[3]; //读尾曲目数字
 335   1      
 336   1        if (Track == 0xAA)
 337   1          {
 338   2            EndM = PacketTemp[9]; //读曲目的MSF值
 339   2            EndS = PacketTemp[10];
 340   2            EndF = PacketTemp[11];
 341   2          }
 342   1        else
 343   1          {
 344   2            StartM = PacketTemp[9]; 
 345   2            StartS = PacketTemp[10];
 346   2            StartF = PacketTemp[11];      
 347   2          }
 348   1      }
 349          
 350          //播放MSF
 351          void PlayMSF(void)
 352          {
 353   1        LoadPacket(PlayMSFP); //暂存数据到RAM
 354   1        PacketTemp[3] = StartM; //写MSF值
 355   1        PacketTemp[4] = StartS;
 356   1        PacketTemp[5] = StartF;
 357   1        PacketTemp[6] = EndM;
 358   1        PacketTemp[7] = EndS;
 359   1        PacketTemp[8] = EndF;
 360   1        SendPacket(0); //向CDROM送信息包
 361   1      }
 362          
C51 COMPILER V7.09   DEMO                                                                  06/07/2004 00:25:23 PAGE 7   

 363          //弹出、装入
 364          void Eject(unsigned char EJ)
 365          {
 366   1        LoadPacket(PlayMSFP); //暂存数据到RAM
 367   1        PacketTemp[0] = 0x1B; //START/STOP UNIT Command字节
 368   1        PacketTemp[4] = EJ; //EJ=0为停止,1为开始并读次信道,2为弹出托盘,3为装载光盘
 369   1        SendPacket(1); //向CDROM送信息包
 370   1      }
 371          
 372          //暂停或继续
 373          void Pause(unsigned char PR)
 374          {
 375   1        LoadPacket(PlayMSFP); //暂存数据到RAM
 376   1        PacketTemp[0] = 0x4B; //PAUSE/RESUME Command
 377   1        PacketTemp[8] = ~PR; //PR为1时暂停
 378   1        SendPacket(0); //向CDROM送信息包
 379   1      }
 380          
 381          //停止
 382          void Stop(void)
 383          {
 384   1        LoadPacket(PlayMSFP); //暂存数据到RAM
 385   1        PacketTemp[0] = 0x4E; //STOP/SCAN Command
 386   1        SendPacket(0); //向CDROM送信息包
 387   1      }
 388          
 389          //前进或后退
 390          void Next(unsigned char NP)
 391          {
 392   1        ReadSub(); //读当前曲目
 393   1        if (NP) //计算
 394   1          NP = CurrentTrackNum + 1;
 395   1        else
 396   1          NP = CurrentTrackNum - 1;
 397   1        if (NP < StartTrackNum)
 398   1          NP = StartTrackNum;
 399   1        if (NP > EndTrackNum)
 400   1          NP = EndTrackNum;
 401   1        ReadTOC(NP); //读下一首或前一首的TOC
 402   1        PlayMSF(); //播放
 403   1      }
 404          
 405          //读次信道信息
 406          void ReadSub(void)
 407          {
 408   1        LoadPacket(ReadSubP); //暂存数据到RAM
 409   1        SendPacket(0); //向CDROM送信息包
 410   1        ResData(12);//返回数据16字节
 411   1        
 412   1        AudioStatus = PacketTemp[1];
 413   1        CurrentTrackNum = PacketTemp[6];
 414   1        CurrentM = PacketTemp[9];
 415   1        CurrentS = PacketTemp[10];
 416   1        CurrentF = PacketTemp[11];
 417   1      }
 418          
 419          //检查CDROM是否就绪
 420          void TestUnitReady(void)
 421          {
 422   1        unsigned char TempCyc;
 423   1        unsigned char TempS;
 424   1      
C51 COMPILER V7.09   DEMO                                                                  06/07/2004 00:25:23 PAGE 8   

 425   1        for (TempCyc = 0; TempCyc < 12; TempCyc++)
 426   1          PacketTemp[TempCyc] = 0x00; //Packet for Test Unit Ready Command
 427   1        do
 428   1          {
 429   2            SendPacket(1); //因可能CDROM不在就绪状态所以跳过DRQ检测
 430   2            TempS = CDStatusREG & 0x89; //CDStatusREG & 0x89为判断ERR,DRQ,BSY中是否有1
 431   2          }
 432   1        while(TempS); //PacketCommand失败时认为CDROM没就绪,再次发送Test Unit Ready Command
 433   1      }
 434          
 435          //初始化CDROM
 436          void InitCDROM(void)
 437          {
 438   1      //---------------------------------
 439   1      // 复位
 440   1      //---------------------------------
 441   1        DBL = 0xFF;
 442   1        DBM = 0xFF;
 443   1        RST = 0; //拉低RST,延时使CDROM复位
 444   1        dmsec(100); //延时
 445   1        RST = 1; //复位完成拉高RST
 446   1        dmsec(5000); //延时
 447   1      
 448   1      //---------------------------------
 449   1      // 选择Device 0
 450   1      //---------------------------------
 451   1      //Drive/Head寄存器D4位控制设备的选取
 452   1        RedREG(REG_DriveHead); //读Drive/Head寄存器
 453   1        DEV = REGBL & 0xEF; //读出Drive/Head寄存器值并把D4位清零
 454   1        WriREG(DEV, 0xFF, REG_DriveHead); //把值写回Drive/Head寄存器
 455   1      
 456   1      //---------------------------------
 457   1      // 校验CylLow和CyHig寄存器
 458   1      //---------------------------------
 459   1      //CDROM正常复位后CylLow的值为14H,CylHig的值为EBH,不对是说明设备出错
 460   1        RedREG(REG_CyLow); //读CyLow寄存器
 461   1        if (REGBL == 0x14)
 462   1          {
 463   2            RedREG(REG_CyHig); //读CyHig寄存器
 464   2            if (REGBL != 0xEB)
 465   2              INITERR = 1;
 466   2          }
 467   1        else
 468   1          {
 469   2            INITERR = 1;
 470   2          }
 471   1      
 472   1        if (!INITERR)
 473   1          {
 474   2      //---------------------------------
 475   2      // 执行自身诊断
 476   2      //---------------------------------
 477   2            WriREG(0x90,0xFF,REG_Command); //写Command寄存器,90H为执行设备诊断
 478   2            BSYWait();
 479   2            RedREG(REG_Err); //读Error寄存器 
 480   2            if ((REGBL != 0x01) && (REGBL != 0x81))
 481   2              TESTERR = 1; //当返回值不等于01H或81H时则说明CDROM自身诊断未通过,这里只考虑Device0
 482   2      
 483   2      //---------------------------------
 484   2      // 使能数据包(Packer Command)功能
 485   2      // IDENTIFY PACKET DEVICE
 486   2      //---------------------------------
C51 COMPILER V7.09   DEMO                                                                  06/07/2004 00:25:23 PAGE 9   

 487   2            WriREG(0xA1,0xFF,REG_Command); //写A1H,IDENTIFY PACKET DEVICE命令
 488   2            //INTRQWait(); //等待CDROM中断
 489   2            RedREG(REG_Data); //读一个字节的返回数据用于判断CDROM所定义的Packet长度
 490   2            REGBL = REGBL << 6;
 491   2            if (REGBL == 0x00)
 492   2              PacketSize = 6; //12byte 6word
 493   2            if (REGBL == 0x40)
 494   2              PacketSize = 8; //16byte 8word
 495   2            if (!PacketSize)
 496   2              UKERR = 1; //当不是这两个值是为未知错误
 497   2          }
 498   1      
 499   1        TestUnitReady();
 500   1        ERRLED = 0;
 501   1        ReadSub(); //读信息
 502   1        BSYWait();
 503   1        ERRLED = 1;
 504   1        if (CurrentTrackNum==0x01) //当前曲目应等于1
 505   1          CDOK = 1;
 506   1        else
 507   1          CDOK = 0;
 508   1      }
 509          
 510          //检测忙状态
 511          void BSYWait(void)
 512          {
 513   1        do
 514   1          {
 515   2            ReadStatus();
 516   2          }
 517   1        while(BSY); 
 518   1      }
 519          
 520          /*检测INTRQ引脚,CDROM中断
 521          void INTRQWait(void) 
 522          {
 523            do
 524              {
 525                INTRQ = 1;
 526              }
 527            while(INTRQ);
 528          }
 529          */
 530          
 531          //检测DRQ是否为1,BSY=0
 532          void DRQWait(void)
 533          {
 534   1        do
 535   1          {
 536   2            BSYWait();
 537   2            DRQ = ~DRQ; 
 538   2          }
 539   1        while(DRQ); 
 540   1      }
 541          
 542          //检测DRQ是否为0,BSY=0
 543          void NDRQWait(void)
 544          {
 545   1        do
 546   1          {
 547   2            BSYWait();
 548   2          }
C51 COMPILER V7.09   DEMO                                                                  06/07/2004 00:25:23 PAGE 10  

 549   1        while(DRQ); 
 550   1      }
 551          
 552          //数据包送暂存RAM
 553          void LoadPacket(unsigned char code *RT)
 554          {
 555   1        unsigned char TempCyc;
 556   1      
 557   1        for (TempCyc=0; TempCyc<12; TempCyc++) //数据包送暂存RAM
 558   1          {
 559   2            PacketTemp[TempCyc] = *RT;
 560   2            RT++;
 561   2          }
 562   1      }
 563          
 564          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    822    ----
   CONSTANT SIZE    =     36    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     43       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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