📄 cd_rom.c~
字号:
{
SendPacket(1); //因可能CDROM不在就绪状态所以跳过DRQ检测
NDRQWait();
ReadStatus();
TempS = CDStatusREG & 0x89; //CDStatusREG & 0x89为判断ERR,DRQ,BSY中是否有1
}
while(TempS);
ReadStatus();
}
void InitIO(void){
RST=1;
RSTD=1;
RST=0;
delay_ms(10);
RST=1;
RD=1;
WR=1;
RDD=1;
WRD=1;
CS1=1;
CS0=0;
CS0D=1;
CS1D=1;
A0D=1;
A1D=1;
A2D=1;
PORTC=0XFF;
DDRC=0X00;
NDRQWait();
WriREG(0xA1,0xFF,REG_Command); //写A1H,IDENTIFY PACKET DEVICE命令
RedREG(REG_Data);
REGBL=REGBL<< 6;
ReadStatus();
UKERR=(REG_Err>>2)&0x01;
if (REGBL == 0x00)
{PacketSize = 6; //12byte 6word
Size=6;}
if (REGBL == 0x40)
{PacketSize=8; //16byte 8word
Size=8;}
if (!PacketSize)
UKERR = 1;
RedREG(REG_DriveHead); //读Drive/Head寄存器
DEV=REGBL&0xEF; //读出Drive/Head寄存器值并把D4位清零
WriREG(DEV, 0xFF, REG_DriveHead); //把值写回Drive/Head寄存器
}
unsigned char DataC(unsigned char Dta){
unsigned char st=0;
st|=(Dta&0x01)<<7;
st|=(Dta&0x02)<<5;
st|=(Dta&0x04)<<3;
st|=(Dta&0x08)<<1;
st|=(Dta&0x10)>>1;
st|=(Dta&0x20)>>3;
st|=(Dta&0x40)>>5;
st|=(Dta&0x80)>>7;
return(st);
}
void DRQWait(void){
do{
BSYWait();
DRQ=(CDStatusREG>>3)&0x01;
DRQ = ~DRQ;}
while(DRQ);
}
void BSYWait(void){
do{
ReadStatus();
// PBCheck();
BSY=(CDStatusREG>>7)&0x01;
}
while(BSY);
}
//检测DRQ是否为0,BSY=0
void NDRQWait(void){
do{
BSYWait();
DRQ=(CDStatusREG>>3)&0x01;
}
while(DRQ);
} //数据包送暂存RAM
void LoadPacket(unsigned int *RT){
unsigned char TempCyc;
for (TempCyc=0; TempCyc<12; TempCyc++) //数据包送暂存RAM
{
PacketTemp[TempCyc]=*RT;
RT++;
}
}
void adc_key_scan(void){
Uchar i,j;
Uint Temp,key_data[10];
Uint Sum_data;
for (i=0;i<9;i++){
ADCSRA=(ADEN|DIV_8);
ADMUX=ADC0; //choose channel four
ADCSRA|=ADSC; //start ad
while(!ADCSRA.4){;} //wait conversion finish
ADCSRA.4=1;
//if(!key_cdc) return UN_KEY_PRESS;
key_data[i]=ADCW&0X03FF; //read conversion 10 times
}
for (i=0;i<9;i++){ //small to big compositor
for (j=i+1;j<10;j++){
if (key_data[i]>key_data[j]){
Temp=key_data[i];
key_data[i]=key_data[j];
key_data[j]=Temp;
}
}
}
Sum_data=0;
for (i=2;i<8;i++) {Sum_data+=key_data[i];} //except top2 and bottom2 Sum
Temp=Sum_data/6;//average conversion for sum
if ((Temp>=0x03d6)&(Temp<=0x03ff))
{
if(PCStatus==0)
{ if (PLAYING)
{
Pause(1); //暂停
Stop();
PLAYING=0;
PAUSEING=0;
STOPKey=0;
STOPING=1;
}
GetBack();
delay_ms(500);
DDRC=0;
PORTC=0;
DDRD=0;
PORTD=0;
PCC();
/*DDRB.1=1;
PORTB.1=1;
delay_ms(100);
PORTB.1=0;
do{}
while(!Power);*/
PCStatus=1;
}
else
{
delay_ms(500);
DDRC=0;
PORTC=0;
DDRD=0;
PORTD=0;
DDRA.1=1;
PORTA.1=1;
/* do{}
while(Power);*/
PCStatus=0;
}
}
else if ((Temp>=0x036f)&(Temp<=0x03c1))
{delay_ms(300);
PLAYKey=0;
STOPKey=0;
NEXTKey=1;
PREVIOUSKey=0;
}
else if ((Temp>=0x02d6)&(Temp<=0x0328))
{delay_ms(300);
PLAYKey=0;
STOPKey=0;
NEXTKey=0;
PREVIOUSKey=1;
}
else if ((Temp>=0x0265)&(Temp<=0x02b7))
{delay_ms(300);
AudioAdd(1);
/*delay_ms(10);
i2cstart();
i2cwrite(0x88);
//i2cwrite(0x80);//hunying
i2cwrite(0x41);//通道选择
i2cwrite(0xa0);//rf
i2cwrite(0xc0);//lr
//i2cwrite(0xe0);//rr
//i2cwrite(0x40);//lf
i2cwrite(0X00);//volume
i2cstop();
delay_ms(10);*/
}
else if ((Temp>=0x01d6)&(Temp<=0x0228))
{ delay_ms(300);
AudioAdd(0);
}
else if ((Temp>=0x0109)&(Temp<=0x015b))
{
delay_ms(300);
PLAYKey=0;
STOPKey=1;
NEXTKey=0;
PREVIOUSKey=0;
}
else if ((Temp>=0x0076)&(Temp<=0x00ce))
{delay_ms(300);
PLAYKey=1;
STOPKey=0;
NEXTKey=0;
PREVIOUSKey=0;
}
else return ;
}
void PBCheck(void)
{
if(PCStatus==1){
if(Power==0)
{
PCStatus=0;
PORTA.1=1;
}
}
}
void DeviceD(void){
if((!PCStatus)&PLAYING)
{delay_ms(10);
ReadStatus();
if ((REGBL&0x01)&PLAYING)
{
PLAYING = 0; //标识
PLAYKey=1;
STOPING=1;
PAUSEING=0;
STOPKey=0;
NEXTKey=0;
}
}
}
void WrAudioReg(unsigned char volume)
{
i2cstart();
i2cwrite(0x88);
i2cwrite(0x80);
if(volume<2)
{
if(volume<0){
volume=0;}
if(PCStatus==0){
i2cwrite(0x9f);
i2cwrite(0xbf);
}
else {
i2cwrite(0xdf);
i2cwrite(0xff);
}
i2cstop();
}
else if((volume>2)&(volume)<8)
{
if(volume>7){
volume=7;}
i2cwrite(0x41);//通道选择
if(PCStatus==0){
i2cwrite(0xa0);//pc
i2cwrite(0x80);//pc
//i2cwrite(0xe0);//rr
i2cwrite(0xc0);//lr
}
else{
i2cwrite(0xa0);//pc
i2cwrite(0x80);//pc
}
i2cwrite(0X3F-(volume*8));
i2cstop();
}
}
void AudioAdd(unsigned char AdSb)
{
if(AdSb==1){
CurrentAudio=CurrentAudio+1;
WrAudioReg(CurrentAudio);
}
else
{
CurrentAudio=CurrentAudio-1;
WrAudioReg(CurrentAudio);
}
}
/*void Eject(unsigned char EJ)
{
LoadPacket(p3); //暂存数据到RAM
PacketTemp[0] = 0x1B; //START/STOP UNIT Command字节
PacketTemp[4] = EJ; //EJ=0为停止,1为开始并读次信道,2为弹出托盘,3为装载光盘
SendPacket(1); //向CDROM送信息包
}
void WatchDogEn(void)
{WDTCR=0X0F;
}
void WatchDogClr(void)
{
#asm
WDR
#endasm
}
*/
void i2cstart(void)
{
SCLD=1;
SDAD=1;
SCL=1;
SDA=1;
delay_us(100); //设置100US延时
SDA=0; //设置SDA线为低电平
delay_us(500);
SCL=0; //设置SCL线为低电平
}
/*3. 停止I2C总线*/
void i2cstop(void)
{
SDA=1;
SCL=0;
delay_ms(10);
SCL=1;
delay_ms(10);
SDA=1;
}
/*7. 向I2C总线上发送1个数据字节*/
void i2cwrite(unsigned char shu)
{
unsigned char i=8;
while(i--){
SCL=0;
delay_us(100);
if(shu & 0x80)
SDA=1;
else
SDA=0;
shu<<=1;
delay_us(100);
SCL=1;
delay_us(100);
}
SCL=0;
//add 9'th CLK to check ACK.
SDAD=0;
SDA=1;
delay_us(100);
SCL=1;
if(PINB.3==0)
{
ack=1;
} else {
ack=0;
}
delay_us(100);
SCL=0;
delay_ms(10);
SDAD=1; //设置1MS延时
delay_ms(10);
}
void GetBack(void){
RSTD=0;
RST=0;
RDD=0;
WRD=0;
RD=0;
WR=0;
CS0D=0;
CS1D=0;
CS1=0;
CS0=0;
A0D=0;
A1D=0;
A2D=0;
A0=0;
A1=0;
A2=0;
WrAudioReg(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -