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

📄 cd_rom.c~

📁 AVR单片机控制实现播放CD音频数据
💻 C~
📖 第 1 页 / 共 2 页
字号:
		{
			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 + -