📄 play.s
字号:
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.dbfile E:\MP3程序\Play/./mp3data.h
.dbsym e vsBeepMP3 _vsBeepMP3 A[4800:4800]kc
_header::
.byte 'R,'I
.byte 'F,'F
.byte 28,16
.byte 0,0
.byte 'W,'A
.byte 'V,'E
.byte 'f,'m
.byte 't,32
.byte 20,0
.byte 0,0
.byte 17,0
.byte 1,0
.byte 64,31
.byte 0,0
.byte 'u,18
.byte 0,0
.byte 0,1
.byte 4,0
.byte 2,0
.byte 249,1
.byte 'f,'a
.byte 'c,'t
.byte 4,0
.byte 0,0
.byte 92,31
.byte 0,0
.byte 'd,'a
.byte 't,'a
.byte 232,15
.byte 0,0
.dbfile Play.c
.dbsym e header _header A[60:60]kc
.area text(rom, con, rel)
.dbfile Play.c
.dbfile E:\MP3程序\Play/../Ch375b/CH375HFB.H
.dbfunc e xQueryInterrupt _xQueryInterrupt fV
.even
_xQueryInterrupt::
.dbline -1
.dbline 674
; #include <iom64v.h>
; #include <macros.h>
; #include <string.h>
; #include <stdio.h>
; #include "../Vs1003/vs1003.h"
; #include "./mp3data.h"
; #include "../Ch375b/375interface.h"
; #include "../Keyboard/key.h"
; extern uchar const nAsciiDot[];
; extern uchar const play_menu[];
; extern unsigned char const tab[];
; ///////////////////
; //调试录音
; ///////////////////
; const unsigned char header[] = {
; 0x52, 0x49, 0x46, 0x46, 0x1c, 0x10, 0x00, 0x00,
; 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, /*|RIFF....WAVEfmt |*/
; 0x14, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00,
; 0x40, 0x1f, 0x00, 0x00, 0x75, 0x12, 0x00, 0x00, /*|........@......|*/
; 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0xf9, 0x01,
; 0x66, 0x61, 0x63, 0x74, 0x04, 0x00, 0x00, 0x00, /*|.......fact....|*/
; 0x5c, 0x1f, 0x00, 0x00, 0x64, 0x61, 0x74, 0x61,
; 0xe8, 0x0f, 0x00, 0x00
; };
; unsigned char mp3buf[512]; /* data buffer for saving to disk */
; uchar filename[3][30];
; uchar Filename[40]; //保持选择的文件名称
; extern uchar keybuf;
;
; //#define WMA
; /* 以下定义的详细说明请看CH375HF9.H文件 */
; #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
; #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
;
; /* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
; //#define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
; /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
;
; #define CH375_INT_WIR ( PIND & 0x02 ) /* PIND.1, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
;
; #include "../Ch375b/CH375HFB.H"
; void mp3_pause(void)
; {
; while(1);
; }
; void mDelaymS( UINT32 ms )
; {
; UINT16 i;
; while ( ms -- ) for ( i = 2600; i != 0; i -- );
; }
;
;
; //1011测试
; void test_vs1003()
; {
; UINT16 data_pointer;UINT8 i;
; Print_str("Test vs1003b... \r\n");
; while (1)
; {
; data_pointer=0;
; while(data_pointer<4800)
; {
; if((PIND & DREQ) != 0)
; {
; mp3InData();
; for(i=0;i<32;i++)
; {
; spiSend(vsBeepMP3[data_pointer++]);
; }
; mp3OutData();
; }//end if(PIND & DREQ)
; }
; }
; }
; void Init_usb(void)
; {
; uint i;uchar t0,data,t1,t2;
; uint usbsize;
; Print_str("Now debug usb host....\r\n");
; CH375_PORT_INIT( );
; /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
; if(CH375LibInit()==0){Print_str("Ch375 init Ok!\r\n");}
; else Print_str("Ch375 init Error!\r\n");
;
; while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */
; mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
;
; Print_str("Find usb\r\n");
; /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
; for ( i = 0; i < 5; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */
; {
; if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
; }
; Print_str("Run here\r\n");
; /* 查询磁盘物理容量 */
; //LCD_write_english_string(0,0,"DiskSize" );
; Print_str("Usb = ");
; Print_size(CH375DiskSize());
; Print_str("M\r\n");
; }
; //在u盘中产生新文件
; /* 检查操作状态,如果错误则显示错误代码并停机 */
; void mStopIfError( uchar iError )
; {
; if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
; Print_str( "Error:="); /* 显示错误 */
; Print_val(iError);
; while ( 1 );
; }
; void write_block(uchar *ps) /* Write output block to disk */
; {
; uint i;
; mCmdParam.WriteX.mSectorCount =1; // 指定读取的扇区数
; mCmdParam.WriteX.mDataBuffer = ps; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
; i = CH375FileWriteX(); /* 向文件写入数据 */
; }
; void close_make_file(void)
; {
; uint i;
; mCmdParam.Close.mUpdateLen = 1; /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
; i = CH375FileClose( );
; mStopIfError( i );
; }
; /* 产生新文件 */
; void make_newfile(uchar *Filename)
; {
; uint i;
; Print_str( "Make New File\r\n" );
; strcpy((char *)mCmdParam.Create.mPathName, Filename); /* 新文件名,在根目录下 */
; i = CH375FileCreate(); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
; mStopIfError( i );
; Print_str( "Make File Ok\r\n" );
; }
; //播放MP3程序
; #define WMA 1
; void mp3_play(char *s)
; {
; uint i;
; uchar t0,data,t1,t2;
; UINT16 data_pointer;
; uchar *ps;
;
; show_clear();
; show_lcd(0, 0, 192, 2, &play_menu[0],0);
; show_play(s,3,0);
; /* 播放MP3 */
; strcpy( (char *)mCmdParam.Open.mPathName, s);
; /* 打开文件 */
; CH375FileOpen( );
; #ifdef WMA
; while(data_pointer<2048)//recommand 2048 zeros honoring DREQ befor soft reset
; { //用于从wma跳出到下一首歌,和一首歌结束填充数据//midi格式不需要
; while((PIND & DREQ) == 0); //加载数据
; { mp3InData();
; for(i=0;i<32;i++)
; {
; spiSend(0x00);//填充
; data_pointer++;
; }
; mp3OutData();
; if(data_pointer == 2047)break;
; }
; }//while(data_pointer<2048)
; SoftReset(); //软件复位
; #endif
; KEYBUF_NULL;
; while(1)
; {
; if(keybuf == K_ESC) break;
; mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区
; mCmdParam.Read.mSectorCount =1; // 指定读取的扇区数
; CH375FileReadX(); //读文件
; ps = &mp3buf[0]; //指向文件数据缓冲区
; data_pointer=0;
; while(data_pointer<512)
; {
; while((PIND & DREQ) == 0); //等待VS1003空闲加载数据
; mp3InData();
; for(i=0;i<32;i++)
; {
; spiSend(*ps++);
; data_pointer++;
; }
; mp3OutData();
; if (data_pointer==512) break; //如果现在的数据不够了,则跳出来
; }//while(data_pointer<512)
; if(mCmdParam.Read.mSectorCount<1 ) break; // 实际读出的扇区数较小则说明文件已经结束
; }//while(1)
; CH375FileClose( );//关闭文件
; }
; ///////////////////
; //调试录音
; ///////////////////
; #define SCI_HDAT0 0x08
; #define SCI_HDAT1 0x09
; void RecordAdpcm1003(uchar *Filename)
; { /* VS1003b/VS1023 */
; uint ii=0;
; uint w = 0, idx = 0;
; unsigned long int n;
; unsigned long int temp;
; /* Check and locate free space on disk */
; make_newfile(Filename); //创建文件
; record_init();
; for (idx=0; idx < sizeof(header); idx++)
; { /* Save header first */
; mp3buf[idx] = header[idx];
; }
; /* Fix rate if needed */
; /*mp3buf[24] = rate;*/
; /*mp3buf[25] = rate>>8;*/
; /* Record loop */
; KEYBUF_NULL;
; n=0;
; while (1)
; {
; do {
; w = mp3ReadReg(SCI_HDAT1);
; } while (w < 256 || w > 896);
; while (idx < 512) {
; w = mp3ReadReg(SCI_HDAT0);
; while ((idx & 255) == sizeof(header)+2 && (w & 0xFF))
; {
; do {
; w = mp3ReadReg(SCI_HDAT1);
; } while (w < 256);
; w = mp3ReadReg(SCI_HDAT0);
; }
; mp3buf[idx++] = w>>8;
; mp3buf[idx++] = w&0xFF;
; }//end while (idx < 512)
; idx = 0;
; write_block(&mp3buf[0]); /* Write output block to disk */
; n += 1;
; if(keybuf != K_ESC){KEYBUF_NULL;continue;}
; break;
; }
; close_make_file();
; //下面写入文件信息
; strcpy( (char *)mCmdParam.Open.mPathName, Filename);
; CH375FileOpen( );
; mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区
; mCmdParam.Read.mSectorCount =1; // 指定读取的扇区数
; Print_str("读取文件第一个扇区\r\n");
; mStopIfError(CH375FileReadX()); //读文件第一个扇区
; CH375FileClose( );//关闭文件
;
; /* Fix WAV header information */
; /* Then update FAT information */
; /* Normal reset, restore default settings */
; n *= 2;
; temp = n*256+52;
; mp3buf[4] = (uchar)temp;
; temp >>= 8;
; mp3buf[5] = (uchar)temp;
; temp >>= 8;
; mp3buf[6] = (uchar)temp;
; temp >>= 8;
; mp3buf[7] = (uchar)temp;
; //采样平率8KHZ
; temp = 8000;
; mp3buf[24] = (uchar)temp;
; temp >>= 8;
; mp3buf[25] = (uchar)temp;
; temp >>= 8;
; mp3buf[26] = (uchar)temp;
; temp >>= 8;
; mp3buf[27] = (uchar)temp;
; temp = 8000*256;
; temp /= 505;
; mp3buf[28] = (uchar)temp;
; temp >>= 8;
; mp3buf[29] = (uchar)temp;
; temp >>= 8;
; mp3buf[30] = (uchar)temp;
; temp >>= 8;
; mp3buf[31] = (uchar)temp;
;
; temp = n*505;
; mp3buf[48] = (uchar)temp;
; temp >>= 8;
; mp3buf[49] = (uchar)temp;
; temp >>= 8;
; mp3buf[50] = (uchar)temp;
; temp >>= 8;
; mp3buf[51] = (uchar)temp;
;
; temp = n * 256;
; mp3buf[56] = (uchar)temp;
; temp >>= 8;
; mp3buf[57] = (uchar)temp;
; temp >>= 8;
; mp3buf[58] = (uchar)temp;
; temp >>= 8;
; mp3buf[59] = (uchar)temp;
; mCmdParam.WriteX.mSectorCount =1; // 指定读取的扇区数
; mCmdParam.WriteX.mDataBuffer = &mp3buf[0]; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
; Print_str("新信息写入文件\r\n");
; mStopIfError(CH375FileWriteX()); /* 向文件写入数据 */
; CH375FileClose( );//关闭文件
; Print_str("Record ok\r\n");
; }
;
; uchar test_file(uchar *s)
; {
; uchar ii;
; while(ii != 100){
; if(*s++ != '.'){ii++; continue;}
; if((*s == 'W')|(*s == 'w')) return 1;
; if((*s == 'M')|(*s == 'm')) return 1;
; return 0;
; }
; return 0;
; }
; /****************************************************************
; *下面是随机播放文件的程序,一旦执行可以用退出键退出
; ****************************************************************/
; void Play_audio(void)
; {
; uchar c;
; uint i;
; /*枚举根目寻下的MP3文件*/
; 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(test_file((char *)mCmdParam.Open.mPathName) != 0){
; if(CH375vFileSize!=0xFFFFFFFF) /*播放枚举到的文件*/
; {
; mp3_play((char *)mCmdParam.Open.mPathName);
; }
; }
; }//end for
; }
; /****************************************************************
; *下面是选择播放文件的程序,一旦执行可以用退出键退出
; *只能查看前50个文件
; ****************************************************************/
; void show_file_name(uchar point, uchar type)
; {
; uchar ii;
; ii = 0;
; while(1){
; show_clear();
; show_lcd(0, 0, 192, 2, &tab[0],0);
; if(point > 0)
; show_play(&filename[0][0],2,0);
; if(point > 1)
; show_play(&filename[1][0],4,0);
; if(point > 2)
; show_play(&filename[2][0],6,0);
; switch(ii){
; case 0: show_play(&filename[0][0],2,1);break;
; case 1: show_play(&filename[1][0],4,1);break;
; case 2: show_play(&filename[2][0],6,1);break;
; }
; KEYBUF_NULL;
; while(keybuf == NULL);
; if(keybuf == K_UP) {
; if(--ii == 255) break;
; }
; if(keybuf == K_DOWN){if(++ii == point){
; if(point == 3) break;
; ii = 0;
; }
; }
;
; if(keybuf == K_ESC) break;
; if(keybuf == K_ENTER) {
; if(type == 0) mp3_play(&filename[ii][0]);
; else {strcpy(&Filename[0],&filename[ii][0]);
; break;
; }
; }
; }
; }
;
; void Play_xuanzhe(uchar type)
; {
; uchar point;
; uchar temp;
; uchar c;
; uint i;
; point = 0;
; /*枚举根目寻下的MP3文件*/
; 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(test_file((char *)mCmdParam.Open.mPathName) != 0){
; if(CH375vFileSize!=0xFFFFFFFF) /*播放枚举到的文件*/
; {
; strcpy(&filename[point][0],(char *)mCmdParam.Open.mPathName);
; point++;
; }
; }
; if(point != 3) continue;
; show_file_name(point,type);
; if(keybuf == K_UP) {c=0; point=0;KEYBUF_NULL;}
; if(type != 0){
; if(keybuf == K_ENTER) return;
; if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
; }
; point = 0;
;
; }//end for
; if((point != 0)&(point != 3)) {show_file_name(point, type);
; if(type != 0){
; if(keybuf == K_ENTER) return;
; if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
; }
; }
; }
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
L22:
.dbline 675
L23:
.dbline 675
;
sbic 0x10,1
rjmp L22
.dbline 676
;
ldi R16,34
xcall _xWriteCH375Cmd
.dbline 677
;
xcall _xReadCH375Data
sts _CH375IntStatus,R16
.dbline 678
;
lds R24,_CH375IntStatus
cpi R24,22
brne L25
.dbline 678
ldi R24,1
sts _CH375DiskStatus,R24
xjmp L26
L25:
.dbline 679
;
lds R24,_CH375IntStatus
cpi R24,21
brne L27
.dbline 679
ldi R24,2
sts _CH375DiskStatus,R24
L27:
L26:
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e xWriteToExtBuf _xWriteToExtBuf fV
; mLength -> R16
.even
_xWriteToExtBuf::
.dbline -1
.dbline 738
;
;
;
;
;
;
;
;
;
;
;
;
;
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -