📄 cdrom_task.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 + -