📄 mp3.lst
字号:
(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 + -