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

📄 mp3.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0709) 	if ( mLength ) {
(0710) 		do {  /* 根据长度读取数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
(0711) 			*current_buffer = xReadCH375Data( );  /* 读出数据并保存,可以用这种方式将文件数据保存到单片机的各种串行存储器中 */
(0712) 			current_buffer ++;
(0713) 		} while ( -- mLength );
(0714) 	}  /* 复制上述数据的总时间不得超过2mS */
(0715) 	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.ReadX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
(0716) 		current_buffer += (UINT16)mCmdParam.ReadX.mDataBuffer;  /* mDataBuffer中为负值 */
(0717) 		mCmdParam.ReadX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileReadX之前也应该清0 */
(0718) 	}
(0719) }
(0720) #ifdef EN_DISK_WRITE
(0721) void xReadFromExtBuf( UINT8 mLength )	/* 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWriteX调用 */
(0722) {
(0723) 	if ( mLength ) {
(0724) 		do {  /* 根据长度写入数据,实际上长度总是CH375_MAX_DATA_LEN,也就是64 */
(0725) 			xWriteCH375Data( *current_buffer );  /* 将数据写入,可以用这种方式从单片机的各种串行存储器中取出文件数据 */
(0726) 			current_buffer ++;
(0727) 		} while ( -- mLength );
(0728) 	}  /* 复制上述数据的总时间不得超过2mS */
(0729) 	else {  /* 重试,恢复缓冲区起址,如果将文件数据读写的缓冲区的当前指针放在mCmdParam.WriteX.mDataBuffer中则会被自动恢复,无需下面的两行程序 */
(0730) 		current_buffer += (UINT16)mCmdParam.WriteX.mDataBuffer;  /* mDataBuffer中为负值 */
(0731) 		mCmdParam.WriteX.mDataBuffer = 0;  /* 为了支持重试,在调用CH375FileWriteX之前也应该清0 */
(0732) 	}
(0733) }
(0734) #endif
(0735) #endif
(0736) #else									/* LIB_CFG_FILE_IO != 0,文件读写的数据的复制方式不是"外部子程序" */
(0737) void xWriteToExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
(0738) {
(0739) 	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
_xWriteToExtBuf:
  mLength              --> R16
    02FB 950A      DEC	R16
    02FC 9508      RET
(0740) }
(0741) #ifdef EN_DISK_WRITE
(0742) void xReadFromExtBuf( UINT8 mLength )	/* 不会调用该子程序 */
(0743) {
(0744) 	mLength --;  /* 该操作无意义,只是避免出现警告信息 */
_xReadFromExtBuf:
  mLength              --> R16
    02FD 950A      DEC	R16
    02FE 9508      RET
(0745) }
(0746) #endif
(0747) #endif
(0748) 
(0749) UINT8	CH375LibInit( void )  /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
(0750) {
(0751) 	CH375LibConfig = LIB_CFG_VALUE;  /* CH375程序库配置值 */
_CH375LibInit:
    02FF E085      LDI	R24,5
    0300 93800644  STS	CH375LibConfig,R24
(0752) 	DISK_BASE_BUF[0] = 0;  /* 该操作无意义,只是为了防止编译器优化时不产生DISK_BASE_BUF缓冲区 */
    0302 2422      CLR	R2
    0303 922003E2  STS	DISK_BASE_BUF,R2
(0753) 	if ( CH375GetVer( ) < CH375_LIB_VER ) return( 0xFF );  /* 获取当前子程序库的版本号,版本太低则返回错误 */
    0305 940E0800  CALL	_CH375GetVer
    0307 3209      CPI	R16,0x29
    0308 F410      BCC	0x030B
    0309 EF0F      LDI	R16,0xFF
    030A C002      RJMP	0x030D
(0754) 	return( CH375Init( ) );  /* 初始化CH375 */
    030B 940E08F2  CALL	_CH375Init
    030D 9508      RET
_mDelaymS:
  i                    --> R10
  ms                   --> Y+10
    030E 940E2774  CALL	push_arg4
    0310 940E27B1  CALL	push_gset3
    0312 9724      SBIW	R28,4
FILE: C:\DOCUME~1\pas\桌面\mp3代码\u盘MP3代码\mp3.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include <string.h>
(0004) #include <stdio.h>
(0005) #include "1011.h"
(0006) #include "mp3.h"
(0007) #include "375interface.h"
(0008) #include "lcd.h"
(0009) #include "bmp.h"
(0010) #include "delay.h"
(0011) 
(0012) unsigned int  vol = 0X2020;            //音量变量
(0013) unsigned int  c;              //歌曲INDEX
(0014) unsigned char  flag = 0;          //停止按键开关量
(0015) 
(0016) /* 以下定义的详细说明请看CH375HF9.H文件 */
(0017) #define LIB_CFG_FILE_IO			1	/* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
(0018) #define LIB_CFG_INT_EN			0		/* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
(0019) 
(0020) /* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
(0021) #define FILE_DATA_BUF_LEN		0x0200	/* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
(0022) /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
(0023) 
(0024) #define CH375_INT_WIR		( PINC & 0x40 )	/* PINC.6, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
(0025) 
(0026) #include "CH375HFB.H"
(0027) 
(0028) // By 老圣(13809003593),2006.10.28
(0029) // 将数据指针作为全局量
(0030) UINT16 data_pointer = 0;	// 数据指针
(0031) void UpdateData(void);
(0032) void ReadFileData(void);
(0033) void	mDelaymS( UINT32 ms )
(0034) {
    0313 C00B      RJMP	0x031F
(0035) 	UINT16	i;
(0036)     
(0037) 	while ( ms -- )
(0038)     { 
(0039) 	    for ( i = 2600; i != 0; i -- )
    0314 E288      LDI	R24,0x28
    0315 E09A      LDI	R25,0xA
    0316 015C      MOVW	R10,R24
    0317 C003      RJMP	0x031B
    0318 01C5      MOVW	R24,R10
    0319 9701      SBIW	R24,1
    031A 015C      MOVW	R10,R24
    031B 20AA      TST	R10
    031C F7D9      BNE	0x0318
    031D 20BB      TST	R11
    031E F7C9      BNE	0x0318
    031F 01FE      MOVW	R30,R28
    0320 8422      LDD	R2,Z+10
    0321 8433      LDD	R3,Z+11
    0322 8444      LDD	R4,Z+12
    0323 8455      LDD	R5,Z+13
    0324 01FE      MOVW	R30,R28
    0325 8220      STD	Z+0,R2
    0326 8231      STD	Z+1,R3
    0327 8242      STD	Z+2,R4
    0328 8253      STD	Z+3,R5
    0329 E041      LDI	R20,1
    032A E050      LDI	R21,0
    032B E060      LDI	R22,0
    032C E070      LDI	R23,0
    032D 01FE      MOVW	R30,R28
    032E 8020      LDD	R2,Z+0
    032F 8031      LDD	R3,Z+1
    0330 8042      LDD	R4,Z+2
    0331 8053      LDD	R5,Z+3
    0332 1A24      SUB	R2,R20
    0333 0A35      SBC	R3,R21
    0334 0A46      SBC	R4,R22
    0335 0A57      SBC	R5,R23
    0336 01FE      MOVW	R30,R28
    0337 8622      STD	Z+10,R2
    0338 8633      STD	Z+11,R3
    0339 8644      STD	Z+12,R4
    033A 8655      STD	Z+13,R5
    033B E040      LDI	R20,0
    033C E050      LDI	R21,0
    033D E060      LDI	R22,0
    033E E070      LDI	R23,0
    033F 01FE      MOVW	R30,R28
    0340 8020      LDD	R2,Z+0
    0341 8031      LDD	R3,Z+1
    0342 8042      LDD	R4,Z+2
    0343 8053      LDD	R5,Z+3
    0344 1624      CP	R2,R20
    0345 0635      CPC	R3,R21
    0346 0646      CPC	R4,R22
    0347 0657      CPC	R5,R23
    0348 F009      BEQ	0x034A
    0349 CFCA      RJMP	0x0314
    034A 9624      ADIW	R28,4
    034B 940E27A4  CALL	pop_gset3
    034D 9624      ADIW	R28,4
    034E 9508      RET
_main:
  t0                   --> Y+6
  t2                   --> R12
  t1                   --> R14
  data                 --> R12
  i                    --> R10
    034F 9725      SBIW	R28,5
(0040)         {
(0041)         	;
(0042)       	}
(0043)   	}
(0044) }
(0045) 
(0046) void mp3_play(char *s);
(0047) 
(0048) void main()
(0049) {
(0050) 	uint i;
(0051)     uchar t0, data, t1, t2; 
(0052) 	mp3_port_init(); 
    0350 940E0573  CALL	_mp3_port_init
(0053)     LCD_Init();
    0352 940E0601  CALL	_LCD_Init
(0054)    LCD_clear();
    0354 940E0647  CALL	_LCD_clear
(0055)    LCD_write_String(0,5,"MEGA64L    MP3"); // 显示英文字符串
    0356 ED83      LDI	R24,0xD3
    0357 E091      LDI	R25,1
    0358 8399      STD	Y+1,R25
    0359 8388      STD	Y+0,R24
    035A E025      LDI	R18,5
    035B 2700      CLR	R16
    035C 940E0687  CALL	_LCD_write_String
(0056)    LCD_draw_map(0,2,AVR_bmp,40,24);        // 显示“AVR”位图 
    035E E188      LDI	R24,0x18
    035F 838C      STD	Y+4,R24
    0360 E288      LDI	R24,0x28
    0361 838A      STD	Y+2,R24
    0362 E080      LDI	R24,0
    0363 E091      LDI	R25,1
    0364 8399      STD	Y+1,R25
    0365 8388      STD	Y+0,R24
    0366 E022      LDI	R18,2
    0367 2700      CLR	R16
    0368 940E0793  CALL	_LCD_draw_map
(0057)    LCD_draw_map(44,2,china_bmp,36,15);     // 显示”实验室“位图 
    036A E08F      LDI	R24,0xF
    036B 838C      STD	Y+4,R24
    036C E284      LDI	R24,0x24
    036D 838A      STD	Y+2,R24
    036E E788      LDI	R24,0x78
    036F E091      LDI	R25,1
    0370 8399      STD	Y+1,R25
    0371 8388      STD	Y+0,R24
    0372 E022      LDI	R18,2
    0373 E20C      LDI	R16,0x2C
    0374 940E0793  CALL	_LCD_draw_map
(0058)    delay_nms(4);
    0376 E004      LDI	R16,4
    0377 E010      LDI	R17,0
    0378 940E07F1  CALL	_delay_nms
(0059) 	
(0060)     
(0061)     // By 老圣(13809003593),2006.10.28
(0062) 	// 初始化IO后,延时,等待U盘电源稳定
(0063)     mDelaymS(200);
    037A EC08      LDI	R16,0xC8
    037B E010      LDI	R17,0
    037C E020      LDI	R18,0
    037D E030      LDI	R19,0
    037E DF8F      RCALL	_mDelaymS
(0064)      
(0065)     vs1003_init();
    037F 940E05D5  CALL	_vs1003_init
(0066) 
(0067) 	CH375_PORT_INIT( );	
    0381 940E053A  CALL	_CH375_PORT_INIT
(0068)     vs1003_cmd_write(0x03,0X4000);     //CLOCK F
    0383 E020      LDI	R18,0
    0384 E430      LDI	R19,0x40
    0385 E003      LDI	R16,3
    0386 940E0586  CALL	_vs1003_cmd_write
(0069) 
(0070) 	DDRE=0x00;                   //按键输入
    0388 2422      CLR	R2
    0389 B822      OUT	0x02,R2
(0071) 	 /* 初始化CH375程序库和CH375芯片,操作成功返回0 */
(0072)    	i=CH375LibInit( );  

⌨️ 快捷键说明

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