📄 mp3.lst
字号:
038A DF74 RCALL _CH375LibInit
038B 2EA0 MOV R10,R16
038C 24BB CLR R11
038D C001 RJMP 0x038F
(0073) //if(i==0) test_1011();
(0074) while ( CH375DiskStatus != DISK_CONNECT )
(0075) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */
038E DF53 RCALL _xQueryInterrupt
038F 91800645 LDS R24,CH375DiskStatus
0391 3082 CPI R24,2
0392 F7D9 BNE 0x038E
(0076) mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
0393 EC08 LDI R16,0xC8
0394 E010 LDI R17,0
0395 E020 LDI R18,0
0396 E030 LDI R19,0
0397 DF76 RCALL _mDelaymS
(0077)
(0078) /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
(0079) for ( i = 0; i < 5; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */
0398 24AA CLR R10
0399 24BB CLR R11
039A C008 RJMP 0x03A3
(0080) {
(0081) if ( CH375DiskReady( ) == ERR_SUCCESS )
039B 940E239B CALL _CH375DiskReady
039D 2300 TST R16
039E F409 BNE 0x03A0
(0082) break; /* 查询磁盘是否准备好 */
039F C008 RJMP 0x03A8
03A0 01C5 MOVW R24,R10
03A1 9601 ADIW R24,1
03A2 015C MOVW R10,R24
03A3 01C5 MOVW R24,R10
03A4 3085 CPI R24,5
03A5 E0E0 LDI R30,0
03A6 079E CPC R25,R30
03A7 F398 BCS 0x039B
(0083) }
(0084)
(0085) /* 查询磁盘物理容量 */
(0086) LCD_write_String(0,0,"DiskSize" );
03A8 EC8A LDI R24,0xCA
03A9 E091 LDI R25,1
03AA 8399 STD Y+1,R25
03AB 8388 STD Y+0,R24
03AC 2722 CLR R18
03AD 2700 CLR R16
03AE 940E0687 CALL _LCD_write_String
(0087) i = CH375DiskSize( );
03B0 940E11EE CALL _CH375DiskSize
03B2 2EA0 MOV R10,R16
03B3 24BB CLR R11
(0088) data= (unsigned char)(mCmdParam.DiskSize.mDiskSizeSec >> 11);
03B4 E08B LDI R24,0xB
03B5 E090 LDI R25,0
03B6 904005E4 LDS R4,mCmdParam+2
03B8 905005E5 LDS R5,mCmdParam+3
03BA 902005E2 LDS R2,mCmdParam
03BC 903005E3 LDS R3,mCmdParam+1
03BE 938A ST R24,-Y
03BF 0181 MOVW R16,R2
03C0 0192 MOVW R18,R4
03C1 940E27E6 CALL lsr32
03C3 2EC0 MOV R12,R16
(0089) t1=data/100;
03C4 E614 LDI R17,0x64
03C5 940E277B CALL div8u
03C7 2EE0 MOV R14,R16
(0090) LCD_set_XY(56,0);
03C8 2722 CLR R18
03C9 E308 LDI R16,0x38
03CA 940E065E CALL _LCD_set_XY
(0091) LCD_write_char(t1+48);
03CC 2D0E MOV R16,R14
03CD 5D00 SUBI R16,0xD0
03CE 940E066D CALL _LCD_write_char
(0092) data=data%100;
03D0 E614 LDI R17,0x64
03D1 2D0C MOV R16,R12
03D2 940E2779 CALL mod8u
03D4 2EC0 MOV R12,R16
(0093) t1=data/10;
03D5 E01A LDI R17,0xA
03D6 940E277B CALL div8u
03D8 2EE0 MOV R14,R16
(0094) LCD_write_char(t1+48);
03D9 5D00 SUBI R16,0xD0
03DA 940E066D CALL _LCD_write_char
(0095) t2=data%10;
03DC E01A LDI R17,0xA
03DD 2D0C MOV R16,R12
03DE 940E2779 CALL mod8u
03E0 2EC0 MOV R12,R16
(0096) LCD_write_char(t2+48);
03E1 5D00 SUBI R16,0xD0
03E2 940E066D CALL _LCD_write_char
(0097) LCD_write_String(76,0,"M" );
03E4 EC88 LDI R24,0xC8
03E5 E091 LDI R25,1
03E6 8399 STD Y+1,R25
03E7 8388 STD Y+0,R24
03E8 2722 CLR R18
03E9 E40C LDI R16,0x4C
03EA 940E0687 CALL _LCD_write_String
03EC C05C RJMP 0x0449
(0098)
(0099) /*枚举根目寻下的MP3文件*/
(0100) while(1)
(0101) {
(0102) for ( c = 0; c < 255; c ++ )
03ED 2422 CLR R2
03EE 2433 CLR R3
03EF 92300601 STS c+1,R3
03F1 92200600 STS c,R2
03F3 C04C RJMP 0x0440
(0103) { /* 最多搜索前255个文件 */
(0104) strcpy( mCmdParam.Open.mPathName,"\\*" ); /* 搜索根目录下文件名*/
03F4 EC25 LDI R18,0xC5
03F5 E031 LDI R19,1
03F6 EE02 LDI R16,0xE2
03F7 E015 LDI R17,5
03F8 940E275F CALL _strcpy
(0105) i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */
03FA EE02 LDI R16,0xE2
03FB E015 LDI R17,5
03FC 940E2768 CALL _strlen
03FE 0158 MOVW R10,R16
(0106) mCmdParam.Open.mPathName[ i ] =0xFF; /* 将结束符替换为255说明序号在变量中 */
03FF EE82 LDI R24,0xE2
0400 E095 LDI R25,5
0401 01F5 MOVW R30,R10
0402 0FE8 ADD R30,R24
0403 1FF9 ADC R31,R25
0404 EF8F LDI R24,0xFF
0405 8380 STD Z+0,R24
(0107) CH375vFileSize=c; /*指定搜索的序号,几乎没有上限*/
0406 90200600 LDS R2,c
0408 90300601 LDS R3,c+1
040A 2444 CLR R4
040B 2455 CLR R5
040C 9230063B STS CH375vFileSize+1,R3
040E 9220063A STS CH375vFileSize,R2
0410 9250063D STS CH375vFileSize+3,R5
0412 9240063C STS CH375vFileSize+2,R4
(0108) i = CH375FileEnumer( ); /* 文件名中含有通配符*,则为搜索文件而不打开 */
0414 940E178C CALL _CH375FileEnumer
0416 2EA0 MOV R10,R16
0417 24BB CLR R11
(0109) if ( i == ERR_MISS_FILE )
0418 01C5 MOVW R24,R10
0419 3482 CPI R24,0x42
041A E0E0 LDI R30,0
041B 079E CPC R25,R30
041C F409 BNE 0x041E
(0110) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
041D C02B RJMP 0x0449
(0111) if ( i != ERR_SUCCESS )
041E 20AA TST R10
041F F411 BNE 0x0422
0420 20BB TST R11
0421 F009 BEQ 0x0423
(0112) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
0422 C026 RJMP 0x0449
(0113) if(CH375vFileSize!=0xFFFFFFFF) /*枚举到MP3文件*/
0423 EF4F LDI R20,0xFF
0424 EF5F LDI R21,0xFF
0425 EF6F LDI R22,0xFF
0426 EF7F LDI R23,0xFF
0427 9040063C LDS R4,CH375vFileSize+2
0429 9050063D LDS R5,CH375vFileSize+3
042B 9020063A LDS R2,CH375vFileSize
042D 9030063B LDS R3,CH375vFileSize+1
042F 1624 CP R2,R20
0430 0635 CPC R3,R21
0431 0646 CPC R4,R22
0432 0657 CPC R5,R23
0433 F019 BEQ 0x0437
(0114) {
(0115) mp3_play( (char *)mCmdParam.Open.mPathName );
0434 EE02 LDI R16,0xE2
0435 E015 LDI R17,5
0436 D0DD RCALL _mp3_play
0437 91800600 LDS R24,c
0439 91900601 LDS R25,c+1
043B 9601 ADIW R24,1
043C 93900601 STS c+1,R25
043E 93800600 STS c,R24
0440 91800600 LDS R24,c
0442 91900601 LDS R25,c+1
0444 3F8F CPI R24,0xFF
0445 E0E0 LDI R30,0
0446 079E CPC R25,R30
0447 F408 BCC 0x0449
0448 CFAB RJMP 0x03F4
0449 CFA3 RJMP 0x03ED
044A 9625 ADIW R28,5
044B 9508 RET
_CheckKey:
oldKey --> R20
delay --> R22
key --> R10
044C 940E27B1 CALL push_gset3
(0116) }
(0117) }
(0118) }
(0119) }
(0120)
(0121) // By 老圣(13809003593),2006.10.28
(0122) // 检查按键,并要时检查VS1011的是否需要数据并更新数据
(0123) uchar CheckKey(void)
(0124) {
(0125) uchar key;
(0126) uchar oldKey = KeyNone; // 要返回的按键值,缺省为无按键
044E 2744 CLR R20
(0127) uchar delay;
(0128)
(0129) UpdateData();
044F D087 RCALL _UpdateData
0450 C01A RJMP 0x046B
(0130)
(0131) while (1)
(0132) {
(0133) key = PINE & KeyMask;
0451 B181 IN R24,0x01
0452 778C ANDI R24,0x7C
0453 2EA8 MOV R10,R24
(0134) if (KeyMask != key) // 有键按下
0454 378C CPI R24,0x7C
0455 F099 BEQ 0x0469
(0135) {
(0136) for (delay = 0;delay < 10;delay++) // 延时
0456 2766 CLR R22
0457 C002 RJMP 0x045A
(0137) {
(0138) UpdateData(); // 延时过程中更新数据以避免声音断续
0458 D07E RCALL _UpdateData
0459 9563 INC R22
045A 306A CPI R22,0xA
045B F3E0 BCS 0x0458
(0139) }
(0140)
(0141) oldKey = key;
045C 2D4A MOV R20,R10
045D C009 RJMP 0x0467
(0142) while (1) // 等待按键释放
(0143) {
(0144) key = PINE & KeyMask;
045E B181 IN R24,0x01
045F 778C ANDI R24,0x7C
0460 2EA8 MOV R10,R24
(0145)
(0146) UpdateData(); // 延时过程中更新数据以避免声音断续
0461 D075 RCALL _UpdateData
(0147)
(0148)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -