📄 demo.lst
字号:
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 + -