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

📄 cdrom_task.c

📁 atmel at89c51snd1c mp3芯片方案源码
💻 C
字号:
#include "config.h"                         /* system definition */
#include "cdrom_drv.h"
#include "lib_mcu\clock\clock.h"
#include "lib_mcu\lcd\lcd_drv.h" 
#include "lib_mcu\ide\ide_drv.h"
#include "modules\display\disp_task.h"
#include "lib_mcu\kbd\key_drv.h"            /* Keyboard driver definition */
#include <stdio.h>


extern      bit     gl_key_press;       /* TRUE when a key is decoded */
extern      Byte    gl_key;             /* value of the key pressed */
extern      INT8U   CmdPack[12];

INT8U    RcvBuff[24];
INT8U    u8CdStatus;

str_cdinfo  str_CdTotalInfo;
str_cdinfo  str_CdCurrentInfo; 

////////////////////////////////////////////////////////////////////////
void cd_playtrack(INT8U u8Track)
{
   INT8U i;
   for(i=0; i<12; i++)
   {
     CmdPack[i] = 0;
   }

   CmdPack[0] = 0x43;
   CmdPack[1] = 0x02;
   CmdPack[6] = u8Track;
   CmdPack[8] = 0x0c;

   do{ACC = CDROM_FILE7;}while(BSY | DRQ);
   CDROM_FILE7 = 0xa0;
   do{ACC = CDROM_FILE7;}while(BSY | (!DRQ));

   for(i=0; i<12;)
   {
 	  DAT16H      = CmdPack[i + 1];
      CDROM_FILE0 = CmdPack[i]; 
      i += 2;
   }

   cd_getdata(RcvBuff, 16);

   for(i=0; i<12; i++)
   {
     CmdPack[i] = 0;
   }

   CmdPack[0] = 0x47;
   CmdPack[3] = RcvBuff[9];
   CmdPack[4] = RcvBuff[10];
   CmdPack[5] = RcvBuff[11];
   CmdPack[6] = str_CdTotalInfo.u8Min;
   CmdPack[7] = str_CdTotalInfo.u8Sec;

   do{ACC = CDROM_FILE7;}while(BSY | DRQ);
   CDROM_FILE7 = 0xa0;
   do{ACC = CDROM_FILE7;}while(BSY | (!DRQ));

   for(i=0; i<12;)
   {
 	  DAT16H      = CmdPack[i + 1];
      CDROM_FILE0 = CmdPack[i]; 
      i += 2;
   }
}


////////////////////////////////////////////////////////////////////////
INT8U cdrom_getvol(void)
{
   cd_command(CMD_MODESENSE);
   cd_getdata(RcvBuff, 24);
   //u16CdVolumeStep = RcvBuff[17] / 10;   //for example vol=123 volstep = 12
   //return u16CdVolumeStep;
   return RcvBuff[17];
}


////////////////////////////////////////////////////////////////////////
INT8U cdrom_volctrl(bit ctrl)
{
   INT8U i,u8Vol;

   u8Vol = cdrom_getvol();

   if(ctrl == CDROM_VOLUP)
   {
      if(u8Vol < 240)
	  {
	    u8Vol += 10;
        RcvBuff[17] = RcvBuff[19] = u8Vol; 
	  }
	  else
	  {
	    RcvBuff[17] = RcvBuff[19] = 0xff;
	  }
     
   }
   else if(ctrl == CDROM_VOLDN)
   {
      if(u8Vol > 10)
	  {
	    u8Vol -= 10;
        RcvBuff[17] = RcvBuff[19] = u8Vol; 
	  }
      else
	  {
	     RcvBuff[17] = RcvBuff[19] = 0; 
	  }
   } 

   for(i=0; i<8; i++)
   {
     RcvBuff[i] = 0;
   }

   cd_command(CMD_MODESELECT);
   while(!CD_INTRQ);
   do{ACC = CDROM_FILE7;}while(!DRQ);

   for(i=0; i<24;)
   {
 	  DAT16H      = RcvBuff[i + 1];
      CDROM_FILE0 = RcvBuff[i]; 
      i += 2;
      clock_vDelay(10);
   }

   return (u8Vol/10);
}


////////////////////////////////////////////////////////////////////////
void cdrom_init(void)
{
   INT8U i;

   AUXR = 0x5c;         //设置EXT16=1,使能16-BIT传送模式

   CD_RST = 0;
   clock_vDelay(500);
   CD_RST = 1;
   clock_vDelay(1000);

   do{ACC = CDROM_FILE7;}while(BSY);
   //取驱动器选择寄存器值
   i = CDROM_FILE6;
   CDROM_FILE6 = i & 0xef;

   i = CDROM_FILE4;
   i = CDROM_FILE5;

   //执行设备诊断命令
   CDROM_FILE7 = 0x90;
   do{ACC = CDROM_FILE7;}while(BSY);

   ACC = CDROM_FILE1;

   clock_vDelay(500);

   CDROM_FILE5 = 0x00;
   CDROM_FILE4 = 0x10;

   CDROM_FILE7 = 0xa1;
   cd_getdata(RcvBuff, 16);
   clock_vDelay(100);

   do{ACC = CDROM_FILE7;}while(BSY | (!DRDY));

   key_cdrom_task_init();
   u8CdStatus = STATUS_TESTUNITREADY;
}


////////////////////////////////////////////////////
void cdrom_task(void)
{  
  INT16U   u16CdVolumeStep;
  INT8U pStr[20];

  switch(u8CdStatus)
  {
     case STATUS_TESTUNITREADY:
	      cd_command(CMD_TESTUNITREADY);
          cd_getdata(RcvBuff, 16);
          ACC = CDROM_FILE7;
		  if(ERR)
		  {//test unit ready failed
		    lcd_print_string(7,"Disc Not Ready...");
		  }
		  else
		  {//test unit ready
            lcd_print_string(7,"Loading Disc... ");
            clock_vDelay(30000);
            lcd_print_string(7,"                ");
            u8CdStatus = STATUS_READTOC;
		  }

          if(gl_key_press == TRUE)
          {
             if(gl_key == KEY_OPEN)
			 {
			    cd_command(CMD_OPEN);
                lcd_print_string(0x40,"Open...   ");
                u8CdStatus = STATUS_OPENCD;
			 }
		     gl_key_press = FALSE;
          }
     break;

     case STATUS_READTOC:
	      cd_command(CMD_READTOC);
          cd_getdata(RcvBuff, 16);
          str_CdTotalInfo.u8Track = RcvBuff[3];
          str_CdTotalInfo.u8Min   = RcvBuff[9];
          str_CdTotalInfo.u8Sec   = RcvBuff[10];
          disp_cdrom_time(str_CdTotalInfo.u8Track, str_CdTotalInfo.u8Min, str_CdTotalInfo.u8Sec);
          clock_vDelay(30000);
          cd_playtrack(1);
          u8CdStatus = STATUS_PLAYCD;
		  lcd_print_string(0x40,"Play...   ");
     break;

	 case STATUS_PLAYCD:
	      cd_command(CMD_READSUBCH);
          cd_getdata(RcvBuff, 16);
          str_CdCurrentInfo.u8Track = RcvBuff[6];
          str_CdCurrentInfo.u8Min   = RcvBuff[13];
          str_CdCurrentInfo.u8Sec   = RcvBuff[14];
          disp_cdrom_time(str_CdCurrentInfo.u8Track, str_CdCurrentInfo.u8Min, str_CdCurrentInfo.u8Sec);

          if(gl_key_press == TRUE)
          {
             if(gl_key < 10)
             {
                str_CdCurrentInfo.u8Track = gl_key;
                cd_playtrack(str_CdCurrentInfo.u8Track);
             }
             else switch(gl_key)
             {
                case KEY_OPEN:
                	 cd_command(CMD_OPEN);
                     lcd_print_string(0x40,"Open...   ");
                     u8CdStatus = STATUS_OPENCD; 
                break;

                case KEY_PLAY:
                     cd_command(CMD_PAUSE);
                     lcd_print_string(0x40,"Pause...  ");
                     u8CdStatus = STATUS_PAUSECD; 
                break;

                case KEY_NEXT:
                     if(str_CdCurrentInfo.u8Track == str_CdTotalInfo.u8Track)
                     {
                        str_CdCurrentInfo.u8Track = 1;
                     }
                     else
                     {
                        str_CdCurrentInfo.u8Track ++;
                     }
                     cd_playtrack(str_CdCurrentInfo.u8Track);
                break;

                case KEY_PREV:
                     if(str_CdCurrentInfo.u8Track == 1)
                     {
                        str_CdCurrentInfo.u8Track =  str_CdTotalInfo.u8Track;
                     }
                     else
                     {
                        str_CdCurrentInfo.u8Track --;
                     }
                     cd_playtrack(str_CdCurrentInfo.u8Track);
                break;

				case KEY_INC:
				     u16CdVolumeStep = cdrom_volctrl(CDROM_VOLUP);
                     sprintf(pStr, "VOL:%02d", u16CdVolumeStep);
                     lcd_print_string(0x4a, pStr);
				break;

                case KEY_DEC:
                     u16CdVolumeStep = cdrom_volctrl(CDROM_VOLDN);
                     sprintf(pStr, "VOL:%02d", u16CdVolumeStep);
                     lcd_print_string(0x4a, pStr);
		        break; 
                
             }
		     gl_key_press = FALSE;
          }	
	 break;

	 case STATUS_PAUSECD:
          if(gl_key_press == TRUE)
          {
             switch(gl_key)
             {
                case KEY_OPEN:
                	 cd_command(CMD_OPEN);
                     lcd_print_string(0x40,"Open...   ");
                     u8CdStatus = STATUS_OPENCD; 
                break;

                case KEY_PLAY:
                     cd_command(CMD_RESUME);
                     lcd_print_string(0x40,"Play...   ");
                     u8CdStatus = STATUS_PLAYCD; 
                break; 
             } 
          }         
	 break;

	 case STATUS_OPENCD:
          if(gl_key_press == TRUE)
          {
             if(gl_key == KEY_OPEN)
			 {
			    cd_command(CMD_CLOSE);
                lcd_print_string(0x40,"Close...  ");
                u8CdStatus = STATUS_TESTUNITREADY;
			 }
		     gl_key_press = FALSE;
          }	      
	 break;
  }

}

⌨️ 快捷键说明

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