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

📄 mp3.lis

📁 用AVR的MP3代码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 0000           ; 
 0000           ; /* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
 0000           ; #define FILE_DATA_BUF_LEN             0x0200  /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
 0000           ; /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
 0000           ; 
 0000           ; #define CH375_INT_WIR         ( PINC & 0x40 ) /* PINC.6, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
 0000           ; 
 0000           ; #include "CH375HFB.H"
 0000           ; 
 0000           ; // By 老圣(13809003593),2006.10.28
 0000           ; // 将数据指针作为全局量
 0000           ; UINT16 data_pointer = 0;      // 数据指针
 0000           ; void UpdateData(void);
 0000           ; void ReadFileData(void);
 0000           ; void  mDelaymS( UINT32 ms )
 0000           ; {
 0000           ;       UINT16  i;
 0000           ;     
 0000           ;       while ( ms -- )
 0000           ;     { 
 0000           ;           for ( i = 2600; i != 0; i -- )
 0000           ;         {
 0000           ;               ;
 0000           ;               }
 0000           ;       }
 0000           ; }
 0000           ; 
 0000           ; void mp3_play(char *s);
 0000           ; 
 0000           ; void main()
 0000           ; {
 0000           ;       uint i;
 0000           ;     uchar t0, data, t1, t2; 
 0000           ;       mp3_port_init(); 
 0000           ;     LCD_Init();
 0000           ;    LCD_clear();
 0000           ;    LCD_write_String(0,5,"MEGA64L    MP3"); // 显示英文字符串
 0000           ;    LCD_draw_map(0,2,AVR_bmp,40,24);        // 显示“AVR”位图 
 0000           ;    LCD_draw_map(44,2,china_bmp,36,15);     // 显示”实验室“位图 
 0000           ;    delay_nms(4);
 0000           ;       
 0000           ;     
 0000           ;     // By 老圣(13809003593),2006.10.28
 0000           ;       // 初始化IO后,延时,等待U盘电源稳定
 0000           ;     mDelaymS(200);
 0000           ;      
 0000           ;     vs1003_init();
 0000           ; 
 0000           ;       CH375_PORT_INIT( );     
 0000           ;     vs1003_cmd_write(0x03,0X4000);     //CLOCK F
 0000           ; 
 0000           ;       DDRE=0x00;                   //按键输入
 0000           ;        /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
 0000           ;       i=CH375LibInit( );  
 0000           ;       //if(i==0) test_1011();
 0000           ;       while ( CH375DiskStatus != DISK_CONNECT ) 
 0000           ;       xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
 0000           ;       mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
 0000           ;               
 0000           ;       /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
 0000           ;       for ( i = 0; i < 5; i ++ )  /* 有的U盘总是返回未准备好,不过可以被忽略 */
 0000           ;       { 
 0000           ;               if ( CH375DiskReady( ) == ERR_SUCCESS ) 
 0000           ;               break;  /* 查询磁盘是否准备好 */
 0000           ;       }
 0000           ;               
 0000           ;       /* 查询磁盘物理容量 */
 0000           ;       LCD_write_String(0,0,"DiskSize" );
 0000           ;       i = CH375DiskSize( );  
 0000           ;       data= (unsigned char)(mCmdParam.DiskSize.mDiskSizeSec >> 11);
 0000           ;       t1=data/100;
 0000           ;       LCD_set_XY(56,0);
 0000           ;       LCD_write_char(t1+48);
 0000           ;       data=data%100;
 0000           ;       t1=data/10;
 0000           ;       LCD_write_char(t1+48);
 0000           ;       t2=data%10;
 0000           ;       LCD_write_char(t2+48);
 0000           ;       LCD_write_String(76,0,"M" );
 0000           ;       
 0000           ;       /*枚举根目寻下的MP3文件*/
 0000           ;       while(1)
 0000           ;       {
 0000           ;               for ( c = 0; c < 255; c ++ )
 0000           ;               {  /* 最多搜索前255个文件 */
 0000           ;                       strcpy( mCmdParam.Open.mPathName,"\\*" );  /* 搜索根目录下文件名*/
 0000           ;                       i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
 0000           ;                       mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
 0000           ;                       CH375vFileSize=c;       /*指定搜索的序号,几乎没有上限*/
 0000           ;                       i = CH375FileEnumer( );  /* 文件名中含有通配符*,则为搜索文件而不打开 */
 0000           ;                       if ( i == ERR_MISS_FILE ) 
 0000           ;               break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
 0000           ;                       if ( i != ERR_SUCCESS ) 
 0000           ;               break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
 0000           ;                       if(CH375vFileSize!=0xFFFFFFFF)   /*枚举到MP3文件*/
 0000           ;                       {
 0000           ;                               mp3_play( (char *)mCmdParam.Open.mPathName );
 0000           ;                       }
 0000           ;               }
 0000           ;       }
 0000           ; }
 0000           ; 
 0000           ; // By 老圣(13809003593),2006.10.28
 0000           ; // 检查按键,并要时检查VS1011的是否需要数据并更新数据
 0000           ; uchar CheckKey(void)
 0000           ; {     
 0000           ;       uchar key;
 0000           ;     uchar oldKey = KeyNone;   // 要返回的按键值,缺省为无按键
 0000           ;     uchar delay;
 0000           ;     
 0000           ;     UpdateData();
 0000           ;         
 0000           ;     while (1)
 0000           ;     {
 0000           ;           key = PINE & KeyMask;
 0000           ;         if (KeyMask != key)   // 有键按下
 0000           ;         {             
 0000           ;             for (delay = 0;delay < 10;delay++)        // 延时
 0000           ;             { 
 0000           ;               UpdateData();   // 延时过程中更新数据以避免声音断续
 0000           ;                       }            
 0000           ;             
 0000           ;             oldKey = key;
 0000           ;             while (1) // 等待按键释放
 0000           ;             {
 0000           ;               key = PINE & KeyMask;
 0000           ;                 
 0000           ;                 UpdateData(); // 延时过程中更新数据以避免声音断续
 0000           ;          
 0000           ;                 if (KeyMask == key)   // 键已释放
 0000           ;                 {
 0000           ;                       return oldKey; 
 0000           ;                 } 
 0000           ;             }
 0000           ;               }
 0000           ;         else  // 无键按下
 0000           ;         {
 0000           ;               return oldKey;
 0000           ;         }
 0000           ;     } 
 0000           ;     
 0000           ;     return oldKey;   
 0000           ; }
 0000           ; 
 0000           ; // By 老圣(13809003593),2006.10.28
 0000           ; // 按键处理
 0000           ; uchar ProcessKey(void)
 0000           ; {
 0000           ;       uchar key = CheckKey(); // 取得按键
 0000           ;     
 0000           ;     if (KeyNone == key)
 0000           ;       return key;
 0000           ;       
 0000           ;     // 以下为按键处理,注意:没有处理多键同时按下的情况
 0000           ;     
 0000           ;       //ST/PS键按下
 0000           ;       if (!(key & STOP))
 0000           ;       {       
 0000           ;               flag ^= 0x01;
 0000           ;         return key;
 0000           ;       }
 0000           ;       //VOLDOWN键按下
 0000           ;       else if (!(key & VOLDOWN))  
 0000           ;       {
 0000           ;               vol = vol + ((uint)(2 << 8) + 2);
 0000           ;               if (vol >= 0xFAFA)
 0000           ;               {
 0000           ;               vol=0xFAFA;
 0000           ;               }
 0000           ;               else
 0000           ;         {
 0000           ;                       vs1003_cmd_write(0x0b,vol);    //每次左右声道VOL减2
 0000           ;               }
 0000           ;       }
 0000           ;       //VOLUP键按下
 0000           ;       else if (!(key & VOLUP))
 0000           ;       {
 0000           ;       vol = vol - ((uint)(2 << 8) + 2);
 0000           ;               if (vol <= 0x0505)
 0000           ;         {
 0000           ;                       vol = 0x0505;
 0000           ;               }            
 0000           ;               else
 0000           ;         { 
 0000           ;                       vs1003_cmd_write(0x0b, vol);   //每次左右声道VOL加2
 0000           ;               }
 0000           ;       }
 0000           ;       //NEXT键按下
 0000           ;       else if (!(key & NEXTSONG)) 
 0000           ;       {
 0000           ;               return KeyNextOrPrev;       //跳到下一首歌曲
 0000           ;       }
 0000           ;       //PREV键按下
 0000           ;       else if (!(key & PREVSONG))
 0000           ;     {
 0000           ;               c = c - 2;
 0000           ;               return KeyNextOrPrev;  //返回前一首歌曲
 0000           ;       }
 0000           ;     return key;
 0000           ; }        
 0000           ; 
 0000           ; // By 老圣(13809003593),2006.10.28
 0000           ; // 检查VS1011是否需要数据,若需要则更新(必要时读文件)
 0000           ; void UpdateData(void)
 0000           ; {
 0000           ;       uchar i;
 0000           ;     
 0000           ;       if (data_pointer >= 511)        // 如果现在的数据不够了,则读数据
 0000           ;     {
 0000           ;       if (mCmdParam.Read.mSectorCount < 1)    // 到文件结束了,则直接返回
 0000           ;         { 
 0000           ;               return ;                
 0000           ;               }
 0000           ;         else  // 读数据
 0000           ;         {
 0000           ;               ReadFileData();         
 0000           ;         }            
 0000           ;       }
 0000           ;     
 0000           ;       if (PINB & MP3_DATA_REQ)        // 检查VS1011是否需要数据
 0000           ;       {  
 0000           ;       // 一次写32个数据
 0000           ;       for(i = 0;i < 32;i++)
 0000           ;               {
 0000           ;               vs1003_data_write(FILE_DATA_BUF[data_pointer]);
 0000           ;               data_pointer++;
 0000           ;               }
 0000           ;       }        
 0000           ; }
 0000           ; 
 0000           ; // By 老圣(13809003593),2006.10.28
 0000           ; // 检查VS1011是否需要数

⌨️ 快捷键说明

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