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

📄 main.c

📁 用atmega64+ch375(usb控制器)制成的板子用来读取USB中的数据的程序
💻 C
字号:
#include <iom64v.h>
#include <macros.h>
#include <string.h>
#include <stdio.h>

#include "main.h"
#include "vs1003.h"
#include "ch375interface.h"

#define CH375_INT_WIR	( PINC & 0x80 )
#define PORT_ST 		(PINB & 0x01)  // PB0 输入按键ST/PS
#define FILE_DATA_BUF_LEN		0x0200

#include "CH375HFB.H"

#define N_ST 0x01 //PB0 输入按键ST/PS
#define N_PREV 0x10 //PE4 输入按键PREV
#define N_NEXT 0x20 //PE5 输入按键NEXT
#define N_VOLr 0x40 //PE6 输入按键VOL-
#define N_VOLp 0x80 //PE7 输入按键VOL+

int size = 0;
int mode = 0;
unsigned char flag = 0;
unsigned char bflag = 0;
char mp3name[50];
void port_init(void){
	// DDRB &= ~N_ST;
	 DDRB |= N_ST;
	 DDRE &= ~N_PREV;
	 DDRE &= ~N_NEXT;
	 DDRE &= ~N_VOLr;
	 DDRE &= ~N_VOLp;
	 PORTB = 0xFF;
}
int main(void)
	{
	 			
	 	unsigned char test = 0;
		unsigned char status = 0;
		unsigned char ret = 0;
		unsigned int i,c;
		
		port_init();
		
		mp3_port_init();
	/*	while(PORT_ST)
		
		bflag = 1;
		delay_nms(200);
	 	while(1)
		{			
			 if(!PORT_ST)
				break;
		}
		bflag = 1;
		*/
		vs1003_init();
		SPCR = 0x50; //提速
		SPSR = 0x01; //setup SPI
		
		CH375_PORT_INIT( );
		xWriteCH375Cmd(CMD_RESET_ALL);
		delay_nms(40);
		xWriteCH375Cmd(CMD_CHECK_EXIST);
		xWriteCH375Data(0x01);
		test = xReadCH375Data();
		
		xWriteCH375Cmd(CMD_SET_USB_MODE);
		xWriteCH375Data(0x06);
		status = xReadCH375Data();
				
		while(CH375_INT_WIR);
		xWriteCH375Cmd(CMD_GET_STATUS);
		status = xReadCH375Data();
		if(status == USB_INT_CONNECT)
			delay_nms(250);
		
		status = CH375LibInit();	
		while(1)
		{
		 	if(CH375DiskReady() == ERR_SUCCESS)break;
		}
		ret = CH375DiskSize();
		size =(unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ;
		while(1)
		{
		 	for ( c = 0; c < 255; c ++ )
			{  /* 最多搜索前255个文件 */
				strcpy( mCmdParam.Open.mPathName,"\\*" );  /* 搜索根目录下文件名*/
				i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
				CH375vFileSize=c;       /*指定搜索的序号,几乎没有上限*/
				i = CH375FileEnumer( );  /* 文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
				if(CH375vFileSize!=0xFFFFFFFF)   /*枚举到MP3文件*/
				{
				//else LCD_write_english_string(0,5,"this is mp3file" );
					//bflag = PORT_ST;
					//delay_nms(1);
					strcpy( mp3name,(char *)mCmdParam.Open.mPathName );
					mp3_play( (char *)mCmdParam.Open.mPathName );
				}
				//else LCD_write_english_string(0,5,"directory" );
			
			}
	  	}
		return 0;
	}
void mp3_play(char *s)
{
 uint i;uchar t0,data,t1,t2;UINT16 data_pointer;
/* 播放MP3 */
	strcpy( (char *)mCmdParam.Open.mPathName, s); 
	strcpy( mp3name,s );
	 /* 打开文件 */
	i=CH375FileOpen( );
	//查询当前文件的信息
	CH375FileQuery( );
	//LCD_write_english_string(0,1,"SongSize" );
	data=(unsigned char)(CH375vFileSize/102400);
	t1=data/10;
	//LCD_set_XY(56,1);
	//LCD_write_char(t1+48);
	//LCD_write_english_string(64,1,"." );	
	//LCD_set_XY(68,1);
	t2=data%10;
	//LCD_write_char(t2+48);
    //LCD_write_english_string(76,1,"M" );
    //显示开始播放
	//LCD_write_english_string(0,2,"Playing" );
	
  	while( 1 )
	{
	 		
	mCmdParam.Read.mSectorCount =1;  // 指定读取的扇区数	
	if(flag==0) CH375FileRead();       //读完后文件指针自动后移
	
	//处理数据
	data_pointer=0; 
    while(data_pointer<512)
    {   
	 	if(!PORT_ST)
		{
		
	/*	delay_nms(200);
	 	while(1)
		{	
		bflag = 1;		
			if(!PORT_ST)
				break;
		}
		bflag = 1;
		delay_nms(200);*/

		goto NEXT;
		} 
		
        if(PINE&MP3_DATA_REQ)      //加载数据
        {
             for(i=0;i<32;i++)
		     {
                 vs1003_data_write(FILE_DATA_BUF[data_pointer]);
                 data_pointer++;   
   	         }
		}
	  	if(data_pointer==511) break;   //如果现在的数据不够了,则跳出来
	 }
	 if(mCmdParam.Read.mSectorCount<1) break; // 实际读出的扇区数较小则说明文件已经结束
    }
	
	NEXT: CH375FileClose( );  /* 关闭文件 */
}

void test_1003(void) 
{
   	 UINT16 data_pointer;UINT8 i;
  	 while(1)
     {
	   	data_pointer=0; 
    	while(data_pointer<4800)
        { 
     	   if(PINE&MP3_DATA_REQ)
           {
     	      for(i=0;i<32;i++)
              {
       		    vs1003_data_write(vsBeepMP3[data_pointer]);
        		data_pointer++;
              }
			  if(data_pointer==4799) break;   //如果现在的数据不够了,则跳出来
           }
        }
	 }
}

⌨️ 快捷键说明

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