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

📄 sd.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    07AB 2400      CLR	R0
    07AC 2411      CLR	R1
    07AD 8A1B      STD	Y+19,R1
    07AE 8A0A      STD	Y+18,R0
(0232) 					entrycount++;	// increment entry counter		
    07AF 9180010F  LDS	R24,entrycount
    07B1 91900110  LDS	R25,entrycount+1
    07B3 9601      ADIW	R24,1
    07B4 93900110  STS	entrycount+1,R25
    07B6 9380010F  STS	entrycount,R24
(0233) 				}
(0234) 				// else ignore short_name_only entries
(0235) 			}
(0236) 		}
(0237) 		de++;
    07B8 858E      LDD	R24,Y+14
    07B9 859F      LDD	R25,Y+15
    07BA 9680      ADIW	R24,0x20
    07BB 879F      STD	Y+15,R25
    07BC 878E      STD	Y+14,R24
(0238) 		index++;
    07BD 8988      LDD	R24,Y+16
    07BE 8999      LDD	R25,Y+17
    07BF 9601      ADIW	R24,1
    07C0 8B99      STD	Y+17,R25
    07C1 8B88      STD	Y+16,R24
(0239) 	}	while (*de->deName || index == 16);	// 0 in de->deName[0] if no more entries
    07C2 85EE      LDD	R30,Y+14
    07C3 85FF      LDD	R31,Y+15
    07C4 8020      LDD	R2,Z+0
    07C5 2022      TST	R2
    07C6 F009      BEQ	0x07C8
    07C7 CE97      RJMP	0x065F
    07C8 8988      LDD	R24,Y+16
    07C9 8999      LDD	R25,Y+17
    07CA 3180      CPI	R24,0x10
    07CB E0E0      LDI	R30,0
    07CC 079E      CPC	R25,R30
    07CD F409      BNE	0x07CF
    07CE CE90      RJMP	0x065F
(0240) 
(0241) 	if (hasBuffer == 0)		// end of entries
    07CF 880A      LDD	R0,Y+18
    07D0 881B      LDD	R1,Y+19
    07D1 2000      TST	R0
    07D2 F439      BNE	0x07DA
    07D3 2011      TST	R1
    07D4 F429      BNE	0x07DA
(0242) 		return 0;
    07D5 E000      LDI	R16,0
    07D6 E010      LDI	R17,0
    07D7 E020      LDI	R18,0
    07D8 E030      LDI	R19,0
    07D9 C023      RJMP	0x07FD
(0243) 	
(0244) 	FileSize = de->deFileSize;
    07DA 85EE      LDD	R30,Y+14
    07DB 85FF      LDD	R31,Y+15
    07DC 8C24      LDD	R2,Z+28
    07DD 8C35      LDD	R3,Z+29
    07DE 8C46      LDD	R4,Z+30
    07DF 8C57      LDD	R5,Z+31
    07E0 92300426  STS	FileSize+1,R3
    07E2 92200425  STS	FileSize,R2
    07E4 92500428  STS	FileSize+3,R5
    07E6 92400427  STS	FileSize+2,R4
(0245) 	return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
    07E8 85EE      LDD	R30,Y+14
    07E9 85FF      LDD	R31,Y+15
    07EA 8C22      LDD	R2,Z+26
    07EB 8C33      LDD	R3,Z+27
    07EC 2444      CLR	R4
    07ED 2455      CLR	R5
    07EE 85EE      LDD	R30,Y+14
    07EF 85FF      LDD	R31,Y+15
    07F0 8864      LDD	R6,Z+20
    07F1 8875      LDD	R7,Z+21
    07F2 2488      CLR	R8
    07F3 2499      CLR	R9
    07F4 0143      MOVW	R8,R6
    07F5 2466      CLR	R6
    07F6 2477      CLR	R7
    07F7 0C62      ADD	R6,R2
    07F8 1C73      ADC	R7,R3
    07F9 1C84      ADC	R8,R4
    07FA 1C95      ADC	R9,R5
    07FB 0183      MOVW	R16,R6
    07FC 0194      MOVW	R18,R8
    07FD 9666      ADIW	R28,0x16
    07FE 940E0DA1  CALL	pop_gset5
    0800 9622      ADIW	R28,2
    0801 9508      RET
_fatNextCluster:
  offset               --> R10
  sector               --> Y+12
  fatOffset            --> Y+8
  fatMask              --> Y+4
  nextCluster          --> Y+0
  cluster              --> Y+22
    0802 940E0CAE  CALL	push_arg4
    0804 940E0DA8  CALL	push_gset3
    0806 9760      SBIW	R28,0x10
(0246) }
(0247) 
(0248) /*-----------------------------------------------------------------------
(0249)  在FAT表中查询下一个簇所在扇区号
(0250) -----------------------------------------------------------------------*/
(0251) unsigned long fatNextCluster(unsigned long cluster)
(0252) {
(0253) 	unsigned long nextCluster;
(0254) 	unsigned long fatMask;
(0255) 	unsigned long fatOffset;
(0256) 	unsigned long sector;
(0257) 	unsigned int offset;
(0258) 	
(0259) 	if(Fat32Enabled)
    0807 90200439  LDS	R2,Fat32Enabled
    0809 2022      TST	R2
    080A F0D9      BEQ	0x0826
(0260) 	{
(0261) 		// 一个表项为4bytes(32 bits)
(0262) 		fatOffset = cluster << 2;
    080B E082      LDI	R24,2
    080C E090      LDI	R25,0
    080D 01FE      MOVW	R30,R28
    080E 8826      LDD	R2,Z+22
    080F 8837      LDD	R3,Z+23
    0810 8C40      LDD	R4,Z+24
    0811 8C51      LDD	R5,Z+25
    0812 938A      ST	R24,-Y
    0813 0181      MOVW	R16,R2
    0814 0192      MOVW	R18,R4
    0815 940E0DE8  CALL	lsl32
    0817 01FE      MOVW	R30,R28
    0818 8700      STD	Z+8,R16
    0819 8711      STD	Z+9,R17
    081A 8722      STD	Z+10,R18
    081B 8733      STD	Z+11,R19
(0263) 		// 设置 FAT32 bit mask
(0264) 		fatMask = FAT32_MASK;
    081C EF4F      LDI	R20,0xFF
    081D EF5F      LDI	R21,0xFF
    081E EF6F      LDI	R22,0xFF
    081F E07F      LDI	R23,0xF
    0820 01FE      MOVW	R30,R28
    0821 8344      STD	Z+4,R20
    0822 8355      STD	Z+5,R21
    0823 8366      STD	Z+6,R22
    0824 8377      STD	Z+7,R23
(0265) 	}
    0825 C017      RJMP	0x083D
(0266) 	else
(0267) 	{
(0268) 		// 一个表项为2bytes(16 bits)
(0269) 		fatOffset = cluster << 1;
    0826 01FE      MOVW	R30,R28
    0827 8826      LDD	R2,Z+22
    0828 8837      LDD	R3,Z+23
    0829 8C40      LDD	R4,Z+24
    082A 8C51      LDD	R5,Z+25
    082B 0C22      LSL	R2
    082C 1C33      ROL	R3
    082D 1C44      ROL	R4
    082E 1C55      ROL	R5
    082F 01FE      MOVW	R30,R28
    0830 8620      STD	Z+8,R2
    0831 8631      STD	Z+9,R3
    0832 8642      STD	Z+10,R4
    0833 8653      STD	Z+11,R5
(0270) 		// 设置 FAT16 bit mask
(0271) 		fatMask = FAT16_MASK;
    0834 EF4F      LDI	R20,0xFF
    0835 EF5F      LDI	R21,0xFF
    0836 E060      LDI	R22,0
    0837 E070      LDI	R23,0
    0838 01FE      MOVW	R30,R28
    0839 8344      STD	Z+4,R20
    083A 8355      STD	Z+5,R21
    083B 8366      STD	Z+6,R22
    083C 8377      STD	Z+7,R23
(0272) 	}
(0273) 	
(0274) 	//计算FAT扇区号
(0275) 	sector = FirstFATSector + (fatOffset / BytesPerSector);
    083D 90200433  LDS	R2,BytesPerSector
    083F 90300434  LDS	R3,BytesPerSector+1
    0841 2444      CLR	R4
    0842 2455      CLR	R5
    0843 01FE      MOVW	R30,R28
    0844 8460      LDD	R6,Z+8
    0845 8471      LDD	R7,Z+9
    0846 8482      LDD	R8,Z+10
    0847 8493      LDD	R9,Z+11
    0848 925A      ST	R5,-Y
    0849 924A      ST	R4,-Y
    084A 923A      ST	R3,-Y
    084B 922A      ST	R2,-Y
    084C 0183      MOVW	R16,R6
    084D 0194      MOVW	R18,R8
    084E 940E0CCF  CALL	div32u
    0850 9040042F  LDS	R4,FirstFATSector+2
    0852 90500430  LDS	R5,FirstFATSector+3
    0854 9020042D  LDS	R2,FirstFATSector
    0856 9030042E  LDS	R3,FirstFATSector+1
    0858 0E20      ADD	R2,R16
    0859 1E31      ADC	R3,R17
    085A 1E42      ADC	R4,R18
    085B 1E53      ADC	R5,R19
    085C 01FE      MOVW	R30,R28
    085D 8624      STD	Z+12,R2
    085E 8635      STD	Z+13,R3
    085F 8646      STD	Z+14,R4
    0860 8657      STD	Z+15,R5
(0276) 	//计算FAT扇区号中表项的偏移地址
(0277) 	offset = fatOffset % BytesPerSector;
    0861 90200433  LDS	R2,BytesPerSector
    0863 90300434  LDS	R3,BytesPerSector+1
    0865 2444      CLR	R4
    0866 2455      CLR	R5
    0867 01FE      MOVW	R30,R28
    0868 8460      LDD	R6,Z+8
    0869 8471      LDD	R7,Z+9
    086A 8482      LDD	R8,Z+10
    086B 8493      LDD	R9,Z+11
    086C 925A      ST	R5,-Y
    086D 924A      ST	R4,-Y
    086E 923A      ST	R3,-Y
    086F 922A      ST	R2,-Y
    0870 0183      MOVW	R16,R6
    0871 0194      MOVW	R18,R8
    0872 940E0CD1  CALL	mod32u
    0874 0158      MOVW	R10,R16
(0278)     
(0279) 	ReadBlock(sector);
    0875 01FE      MOVW	R30,R28
    0876 8504      LDD	R16,Z+12
    0877 8515      LDD	R17,Z+13
    0878 8526      LDD	R18,Z+14
    0879 8537      LDD	R19,Z+15
    087A DBDC      RCALL	_ReadBlock
(0280) 
(0281) 	// 读取下一个簇号
(0282) 	nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) & fatMask;
    087B E285      LDI	R24,0x25
    087C E092      LDI	R25,2
    087D 01F5      MOVW	R30,R10
    087E 0FE8      ADD	R30,R24
    087F 1FF9      ADC	R31,R25
    0880 8020      LDD	R2,Z+0
    0881 8031      LDD	R3,Z+1
    0882 8042      LDD	R4,Z+2
    0883 8053      LDD	R5,Z+3
    0884 01FE      MOVW	R30,R28
    0885 8064      LDD	R6,Z+4
    0886 8075      LDD	R7,Z+5
    0887 8086      LDD	R8,Z+6
    0888 8097      LDD	R9,Z+7
    0889 2026      AND	R2,R6
    088A 2037      AND	R3,R7
    088B 2048      AND	R4,R8
    088C 2059      AND	R5,R9
    088D 01FE      MOVW	R30,R28
    088E 8220      STD	Z+0,R2
    088F 8231      STD	Z+1,R3
    0890 8242      STD	Z+2,R4
    0891 8253      STD	Z+3,R5
(0283) 
(0284) 	// 是否文件的结束簇
(0285) 	if (nextCluster == (CLUST_EOFE & fatMask))
    0892 01FE      MOVW	R30,R28
    0893 8024      LDD	R2,Z+4
    0894 8035      LDD	R3,Z+5
    0895 8046      LDD	R4,Z+6
    0896 8057      LDD	R5,Z+7
    0897 01FE      MOVW	R30,R28
    0898 8060      LDD	R6,Z+0
    0899 8071      LDD	R7,Z+1
    089A 8082      LDD	R8,Z+2
    089B 8093      LDD	R9,Z+3
    089C 1462      CP	R6,R2
    089D 0473      CPC	R7,R3
    089E 0484      CPC	R8,R4
    089F 0495      CPC	R9,R5
    08A0 F449      BNE	0x08AA
(0286) 		nextCluster = 0;
    08A1 E040      LDI	R20,0
    08A2 E050      LDI	R21,0
    08A3 E060      LDI	R22,0
    08A4 E070      LDI	R23,0
    08A5 01FE      MOVW	R30,R28
    08A6 8340      STD	Z+0,R20
    08A7 8351      STD	Z+1,R21
    08A8 8362      STD	Z+2,R22
    08A9 8373      STD	Z+3,R23
(0287) 		
(0288) 	return nextCluster;
    08AA 01FE      MOVW	R30,R28
    08AB 8100      LDD	R16,Z+0
    08AC 8111      LDD	R17,Z+1
    08AD 8122      LDD	R18,Z+2
    08AE 8133      LDD	R19,Z+3
    08AF 9660      ADIW	R28,0x10
    08B0 940E0D9B  CALL	pop_gset3
    08B2 9624      ADIW	R28,4
    08B3 9508      RET
FILE: E:\V3U~1\sd\M64-SD卡MP3程序\mp3.c
(0001) /************************************************************/
(0002) /*		         MP3 Code for   M32L					    */
(0003) /*				   By   pasyong								*/
(0004) /*				   2006-4									*/
(0005) /*				   Base ICC6.31A					        */
(0006) /************************************************************/
(0007) #include <iom64v.h>
(0008) #include <macros.h>
(0009) #include <stdio.h>
(0010) #include "1011.h"
(0011) #include "mp3.h"
(0012) #include "sd.h"
(0013) #include "fat.h"
(0014) #include "lcd.h"
(0015) #include "bmp.h"
(0016) #include "delay.h"
(0017) 
(0018) void key_port(void)
(0019)  {
(0020)  DDRE=0X00;
_key_port:
    08B4 2422      CLR	R2
    08B5 B822      OUT	0x02,R2
(0021)  PORTE=0XFF;
    08B6 EF8F      LDI	R24,0xFF
    08B7 B983      OUT	0x03,R24
    08B8 9508      RET
_main:
    08B9 9725      SBIW	R28,5
(0022)  }
(0023) void main()
(0024) {
(0025) key_port();
    08BA DFF9      RCALL	_key_port
(0026) spi_init();
    08BB 940E03DC  CALL	_spi_init
(0027)    LCD_Init();
    08BD 940E0A99  CALL	_LCD_Init
(0028)    LCD_clear();
    08BF 940E0ADF  CALL	_LCD_clear
(0029)    LCD_write_String(0,5,"MEGA64L    MP3"); // 显示英文字符串
    08C1 E186      LDI	R24,0x16
    08C2 E092      LDI	R25,2
    08C3 8399      STD	Y+1,R25
    08C4 8388      STD	Y+0,R24
    08C5 E025      LDI	R18,5
    08C6 2700      CLR	R16
    08C7 940E0B1F  CALL	_LCD_write_String
(0030)    LCD_draw_map(0,2,AVR_bmp,40,24);        // 显示“AVR”位图 
    08C9 E188      LDI	R24,0x18
    08CA 838C      STD	Y+4,R24
    08CB E288      LDI	R24,0x28
    08CC 838A      STD	Y+2,R24
    08CD E586      LDI	R24,0x56
    08CE E091      LDI	R25,1
    08CF 8399      STD	Y+1,R25
    08D0 8388      STD	Y+0,R24
    08D1 E022      LDI	R18,2
    08D2 2700      CLR	R16
    08D3 940E0C2B  CALL	_LCD_draw_map
(0031)    LCD_draw_map(44,2,china_bmp,36,15);     // 显示”实验室“位图 
    08D5 E08F      LDI	R24,0xF
    08D6 838C      STD	Y+4,R24
    08D7 E284      LDI	R24,0x24
    08D8 838A      STD	Y+2,R24
    08D9 EC8E      LDI	R24,0xCE
    08DA E091      LDI	R25,1
    08DB 8399      STD	Y+1,R25
    08DC 8388      STD	Y+0,R24
    08DD E022      LDI	R18,2
    08DE E20C      LDI	R16,0x2C
    08DF 940E0C2B  CALL	_LCD_draw_map
(0032) mp3_port_init();vs1003_init();vs1003_init();
    08E1 940E03E3  CALL	_mp3_port_init
    08E3 940E0442  CALL	_vs1003_init
    08E5 940E0442  CALL	_vs1003_init
(0033) sd_port_init();SD_Init();SD_Init();
    08E7 940E02F2  CALL	_sd_port_init
    08E9 940E0352  CALL	_SD_Init
    08EB 940E0352  CALL	_SD_Init
(0034) SPCR = 0x50;                //提速
    08ED E580      LDI	R24,0x50
    08EE B98D      OUT	0x0D,R24
(0035) SPSR = 0x01;                //setup SPI
    08EF E081      LDI	R24,1
    08F0 B98E      OUT	0x0E,R24
(0036) 
(0037) fatInit();            

⌨️ 快捷键说明

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