📄 m16_vs1003_test.lst
字号:
__start:
__text_start:
02CA EFCF LDI R28,0xFF
02CB E1D0 LDI R29,0x10
02CC BFCD OUT 0x3D,R28
02CD BFDE OUT 0x3E,R29
02CE 51CE SUBI R28,0x1E
02CF 40D0 SBCI R29,0
02D0 EA0A LDI R16,0xAA
02D1 8308 STD Y+0,R16
02D2 2400 CLR R0
02D3 E9E4 LDI R30,0x94
02D4 E0F1 LDI R31,1
02D5 E014 LDI R17,4
02D6 33EB CPI R30,0x3B
02D7 07F1 CPC R31,R17
02D8 F011 BEQ 0x02DB
02D9 9201 ST R0,Z+
02DA CFFB RJMP 0x02D6
02DB 8300 STD Z+0,R16
02DC E0E0 LDI R30,0
02DD E0F5 LDI R31,5
02DE E0A0 LDI R26,0
02DF E0B1 LDI R27,1
02E0 E015 LDI R17,5
02E1 39E4 CPI R30,0x94
02E2 07F1 CPC R31,R17
02E3 F021 BEQ 0x02E8
02E4 95C8 LPM
02E5 9631 ADIW R30,1
02E6 920D ST R0,X+
02E7 CFF9 RJMP 0x02E1
02E8 940E02EB CALL _main
_exit:
02EA CFFF RJMP _exit
FILE: C:\AVR\M\1\main.c
(0001) #include "SPI.h"
(0002) #include "Usart.h"
(0003) #include "fat.h"
(0004) #include "vs1003.h"
(0005) #include "AD_key.h"
(0006) #include "3310LCD_function.h"
(0007) #include "bmp_pixel.h"
(0008) extern struct DISK_FAT_INFO DiskFATInfo;
(0009) extern struct MUSIC_INFO MusicInfoList[3];
(0010)
(0011) //-------------- 音乐播放程序 -------------------//
(0012)
(0013) void VS1003_Play(void);
(0014)
(0015)
(0016)
(0017) //----------------- ------------------------------
(0018) //
(0019) // 主函数
(0020) //
(0021) //------------------------------------------------
(0022) void main()
(0023) {
(0024)
(0025) // Usart_Init(9600); // 串口初始化9600bps
(0026)
(0027) SPI_Init(); // SPI初始化,默认速度400Hz
_main:
02EB 940E08EF CALL _SPI_Init
(0028)
(0029)
(0030) LCD_init();
02ED 940E05B9 CALL _LCD_init
(0031) VS1003_Init(); // VS1003芯片初始化
02EF 940E1266 CALL _VS1003_Init
(0032)
(0033) while(SD_Init()); // SD卡循环初始化
02F1 940E07DA CALL _SD_Init
02F3 2300 TST R16
02F4 F7E1 BNE 0x02F1
(0034)
(0035) Fat_Init(); // 文件系统初始化
02F5 940E0904 CALL _Fat_Init
(0036) AD_Init(); // AD初始化
02F7 940E11DB CALL _AD_Init
(0037) TC0_Init(); // T/C0初始化
02F9 940E11F1 CALL _TC0_Init
(0038) VS1003_Play(); // 音乐播放
02FB D001 RCALL _VS1003_Play
02FC 9508 RET
_VS1003_Play:
j --> Y+18
num --> Y+14
music_num --> Y+25
music_last --> R12
music_next --> R14
play_flag --> Y+24
i --> Y+10
size_buf --> Y+6
vol_flag --> R10
n --> Y+2
data_pointer --> Y+22
02FD 940E1422 CALL push_gset5
02FF 976A SBIW R28,0x1A
(0039) }
(0040)
(0041)
(0042)
(0043) //----------------- ------------------------------
(0044) //
(0045) // 音乐播放函数
(0046) //
(0047) //------------------------------------------------
(0048) void VS1003_Play(void)
(0049) {
(0050) uint32 n;
(0051) uint32 i,j=46;
0300 E24E LDI R20,0x2E
0301 E050 LDI R21,0
0302 E060 LDI R22,0
0303 E070 LDI R23,0
0304 01FE MOVW R30,R28
0305 8B42 STD Z+18,R20
0306 8B53 STD Z+19,R21
0307 8B64 STD Z+20,R22
0308 8B75 STD Z+21,R23
(0052) uint32 size_buf=0; // 已播放的文件大小
0309 E040 LDI R20,0
030A E050 LDI R21,0
030B E060 LDI R22,0
030C E070 LDI R23,0
030D 01FE MOVW R30,R28
030E 8346 STD Z+6,R20
030F 8357 STD Z+7,R21
0310 8760 STD Z+8,R22
0311 8771 STD Z+9,R23
(0053) uint32 num; // 音乐文件所在的簇
(0054) uint8 music_num=0; // 正在播放文件的号码
0312 2400 CLR R0
0313 8E09 STD Y+25,R0
(0055) uint8 play_flag=1; // 播放标志
0314 2400 CLR R0
0315 9403 INC R0
0316 8E08 STD Y+24,R0
(0056) uint16 data_pointer=0;
0317 2400 CLR R0
0318 2411 CLR R1
0319 8A1F STD Y+23,R1
031A 8A0E STD Y+22,R0
(0057) uint8 music_next=0,music_last=0; // 音乐换曲标志
031B 24EE CLR R14
031C 24CC CLR R12
(0058) uint8 vol_flag=0; // 音量调节标志
031D 24AA CLR R10
(0059)
(0060) AD_Flag=0; // AD键盘标志
031E 2422 CLR R2
031F 92200431 STS AD_Flag,R2
(0061) AD_time=0; // AD键盘采样次数
0321 92200430 STS AD_time,R2
(0062) key_num=0; // 按键号
0323 9220042E STS key_num,R2
(0063)
(0064) GetMusicFile(); // 获取音乐文件
0325 940E0AB7 CALL _GetMusicFile
(0065)
(0066) num = MusicInfoList[0].FileStartClustor; // 调用音乐文件
0327 904001B7 LDS R4,0x1B7
0329 905001B8 LDS R5,0x1B8
032B 902001B5 LDS R2,0x1B5
032D 903001B6 LDS R3,0x1B6
032F 01FE MOVW R30,R28
0330 8626 STD Z+14,R2
0331 8637 STD Z+15,R3
0332 8A40 STD Z+16,R4
0333 8A51 STD Z+17,R5
0334 C260 RJMP 0x0595
(0067)
(0068) while(1)
(0069) {
(0070) LCD_clear();
0335 940E05DB CALL _LCD_clear
(0071) LCD_write_english_string(j,3,MusicInfoList[music_num].FileName);
0337 E289 LDI R24,0x29
0338 8C09 LDD R0,Y+25
0339 9D80 MUL R24,R0
033A 0110 MOVW R2,R0
033B E984 LDI R24,0x94
033C E091 LDI R25,1
033D 0E28 ADD R2,R24
033E 1E39 ADC R3,R25
033F 8239 STD Y+1,R3
0340 8228 STD Y+0,R2
0341 E023 LDI R18,3
0342 01FE MOVW R30,R28
0343 8902 LDD R16,Z+18
0344 940E061B CALL _LCD_write_english_string
(0072) for(i=0;i<DiskFATInfo.SectorsPerClustor;i++)
0346 E040 LDI R20,0
0347 E050 LDI R21,0
0348 E060 LDI R22,0
0349 E070 LDI R23,0
034A 01FE MOVW R30,R28
034B 8742 STD Z+10,R20
034C 8753 STD Z+11,R21
034D 8764 STD Z+12,R22
034E 8775 STD Z+13,R23
034F C1C3 RJMP 0x0513
(0073) {
(0074) SD_ReadBlock(DiskFATInfo.FDT_LBA+(num-DiskFATInfo.FDT_StartClustor)*DiskFATInfo.SectorsPerClustor+i,Fat_Buffer); // 获取音乐文件的数据
0350 E28E LDI R24,0x2E
0351 E092 LDI R25,2
0352 8399 STD Y+1,R25
0353 8388 STD Y+0,R24
0354 9020021B LDS R2,0x21B
0356 9030021C LDS R3,0x21C
0358 2444 CLR R4
0359 2455 CLR R5
035A 01FE MOVW R30,R28
035B 8466 LDD R6,Z+14
035C 8477 LDD R7,Z+15
035D 8880 LDD R8,Z+16
035E 8891 LDD R9,Z+17
035F 1862 SUB R6,R2
0360 0873 SBC R7,R3
0361 0884 SBC R8,R4
0362 0895 SBC R9,R5
0363 90200220 LDS R2,0x220
0365 2433 CLR R3
0366 2444 CLR R4
0367 2455 CLR R5
0368 925A ST R5,-Y
0369 924A ST R4,-Y
036A 923A ST R3,-Y
036B 922A ST R2,-Y
036C 0183 MOVW R16,R6
036D 0194 MOVW R18,R8
036E 940E13E6 CALL empy32u
0370 90400215 LDS R4,0x215
0372 90500216 LDS R5,0x216
0374 90200213 LDS R2,0x213
0376 90300214 LDS R3,0x214
0378 0E20 ADD R2,R16
0379 1E31 ADC R3,R17
037A 1E42 ADC R4,R18
037B 1E53 ADC R5,R19
037C 01FE MOVW R30,R28
037D 8462 LDD R6,Z+10
037E 8473 LDD R7,Z+11
037F 8484 LDD R8,Z+12
0380 8495 LDD R9,Z+13
0381 0C26 ADD R2,R6
0382 1C37 ADC R3,R7
0383 1C48 ADC R4,R8
0384 1C59 ADC R5,R9
0385 0181 MOVW R16,R2
0386 0192 MOVW R18,R4
0387 940E0839 CALL _SD_ReadBlock
(0075) do
(0076) {
(0077) //--------------------------- AD按键检测 ---------------------------//
(0078)
(0079) if(key_num==6&&AD_time==0)play_flag=1; // Key6按下,播放
0389 9180042E LDS R24,key_num
038B 3086 CPI R24,6
038C F441 BNE 0x0395
038D 90200430 LDS R2,AD_time
038F 2022 TST R2
0390 F421 BNE 0x0395
0391 2400 CLR R0
0392 9403 INC R0
0393 8E08 STD Y+24,R0
0394 C036 RJMP 0x03CB
(0080) else if(key_num==5&&AD_time==0)play_flag=0; // Key5按下,停止
0395 9180042E LDS R24,key_num
0397 3085 CPI R24,5
0398 F439 BNE 0x03A0
0399 90200430 LDS R2,AD_time
039B 2022 TST R2
039C F419 BNE 0x03A0
039D 2400 CLR R0
039E 8E08 STD Y+24,R0
039F C02B RJMP 0x03CB
(0081) else if(key_num==1&&AD_time==0)music_next=1; // Key1按下,下一首
03A0 9180042E LDS R24,key_num
03A2 3081 CPI R24,1
03A3 F439 BNE 0x03AB
03A4 90200430 LDS R2,AD_time
03A6 2022 TST R2
03A7 F419 BNE 0x03AB
03A8 24EE CLR R14
03A9 94E3 INC R14
03AA C020 RJMP 0x03CB
(0082) else if(key_num==4&&AD_time==0)music_last=1; // Key4按下,上一首
03AB 9180042E LDS R24,key_num
03AD 3084 CPI R24,4
03AE F439 BNE 0x03B6
03AF 90200430 LDS R2,AD_time
03B1 2022 TST R2
03B2 F419 BNE 0x03B6
03B3 24CC CLR R12
03B4 94C3 INC R12
03B5 C015 RJMP 0x03CB
(0083) else if(key_num==3&&AD_time==0)vol_flag=1; // Key3按下,音量+
03B6 9180042E LDS R24,key_num
03B8 3083 CPI R24,3
03B9 F439 BNE 0x03C1
03BA 90200430 LDS R2,AD_time
03BC 2022 TST R2
03BD F419 BNE 0x03C1
03BE 24AA CLR R10
03BF 94A3 INC R10
03C0 C00A RJMP 0x03CB
(0084) else if(key_num==2&&AD_time==0)vol_flag=2; // Key2按下,音量-
03C1 9180042E LDS R24,key_num
03C3 3082 CPI R24,2
03C4 F431 BNE 0x03CB
03C5 90200430 LDS R2,AD_time
03C7 2022 TST R2
03C8 F411 BNE 0x03CB
03C9 E082 LDI R24,2
03CA 2EA8 MOV R10,R24
(0085)
(0086) //-------------- 音量调节 ----------------//
(0087) if(vol_flag!=0)
03CB 20AA TST R10
03CC F409 BNE 0x03CE
03CD C04E RJMP 0x041C
(0088) {
(0089) if(vol_flag==1)
03CE 2D8A MOV R24,R10
03CF 3081 CPI R24,1
03D0 F4C9 BNE 0x03EA
(0090) {
(0091) if(VOL>27)VOL=29;
03D1 E18B LDI R24,0x1B
03D2 E090 LDI R25,0
03D3 90200439 LDS R2,VOL
03D5 9030043A LDS R3,VOL+1
03D7 1582 CP R24,R2
03D8 0593 CPC R25,R3
03D9 F430 BCC 0x03E0
03DA E18D LDI R24,0x1D
03DB 9390043A STS VOL+1,R25
03DD 93800439 STS VOL,R24
03DF C022 RJMP 0x0402
(0092) else VOL+=2;
03E0 91800439 LDS R24,VOL
03E2 9190043A LDS R25,VOL+1
03E4 9602 ADIW R24,2
03E5 9390043A STS VOL+1,R25
03E7 93800439 STS VOL,R24
(0093) }
03E9 C018 RJMP 0x0402
(0094) else
(0095) {
(0096) if(VOL<2)VOL=0;
03EA 91800439 LDS R24,VOL
03EC 9190043A LDS R25,VOL+1
03EE 3082 CPI R24,2
03EF E0E0 LDI R30,0
03F0 079E CPC R25,R30
03F1 F438 BCC 0x03F9
03F2 2422 CLR R2
03F3 2433 CLR R3
03F4 9230043A STS VOL+1,R3
03F6 92200439 STS VOL,R2
03F8 C009 RJMP 0x0402
(0097) else VOL-=2;
03F9 91800439 LDS R24,VOL
03FB 9190043A LDS R25,VOL+1
03FD 9702 SBIW R24,2
03FE 9390043A STS VOL+1,R25
0400 93800439 STS VOL,R24
(0098) }
(0099)
(0100) VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]); // 送音量数据
0402 91200439 LDS R18,VOL
0404 9130043A LDS R19,VOL+1
0406 E002 LDI R16,2
0407 E010 LDI R17,0
0408 940E13D6 CALL empy16s
040A 01F8 MOVW R30,R16
040B EC84 LDI R24,0xC4
040C E094 LDI R25,4
040D 0FE8 ADD R30,R24
040E 1FF9 ADC R31,R25
040F 9125 LPM R18,Z+
0410 9134 LPM R19,0(Z)
0411 E00B LDI R16,0xB
0412 940E11FD CALL _VS1003_WriteReg
(0101)
(0102) while(VS1003_DREQ_STATE() != VS1003_DREQ); // 等待
0414 B383 IN R24,0x13
0415 7880 ANDI R24,0x80
0416 3880 CPI R24,0x80
0417 F7E1 BNE 0x0414
(0103)
(0104) key_num = 0;
0418 2422 CLR R2
0419 9220042E STS key_num,R2
(0105) vol_flag=0;
041B 24AA CLR R10
(0106) }
(0107)
(0108)
(0109) //----------------- 换曲操作 -----------------//
(0110)
(0111) if(music_next!=0||music_last!=0)
041C 20EE TST R14
041D F411 BNE 0x0420
041E 20CC TST R12
041F F071 BEQ 0x042E
(0112) {
(0113) data_pointer=512;
0420 E080 LDI R24,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -