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

📄 sd.lst

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0DCD 926002BE  STS	FirstFATSector,R6
    0DCF 929002C1  STS	FirstFATSector+3,R9
    0DD1 928002C0  STS	FirstFATSector+2,R8
(0084) //查询SD卡文件系统分区类型
(0085) 	switch (PartInfo.prPartType)
    0DD3 90C002CF  LDS	R12,0x2CF
    0DD5 24DD      CLR	R13
    0DD6 01C6      MOVW	R24,R12
    0DD7 3084      CPI	R24,4
    0DD8 E0E0      LDI	R30,0
    0DD9 079E      CPC	R25,R30
    0DDA F0B1      BEQ	0x0DF1
    0DDB 3086      CPI	R24,6
    0DDC E0E0      LDI	R30,0
    0DDD 079E      CPC	R25,R30
    0DDE F091      BEQ	0x0DF1
    0DDF 3084      CPI	R24,4
    0DE0 E0E0      LDI	R30,0
    0DE1 079E      CPC	R25,R30
    0DE2 F174      BLT	0x0E11
    0DE3 01C6      MOVW	R24,R12
    0DE4 308B      CPI	R24,0xB
    0DE5 E0E0      LDI	R30,0
    0DE6 079E      CPC	R25,R30
    0DE7 F0C9      BEQ	0x0E01
    0DE8 308C      CPI	R24,0xC
    0DE9 E0E0      LDI	R30,0
    0DEA 079E      CPC	R25,R30
    0DEB F0A9      BEQ	0x0E01
    0DEC 308E      CPI	R24,0xE
    0DED E0E0      LDI	R30,0
    0DEE 079E      CPC	R25,R30
    0DEF F009      BEQ	0x0DF1
    0DF0 C020      RJMP	0x0E11
(0086) 	{
(0087) 		case PART_TYPE_DOSFAT16:
(0088) 		case PART_TYPE_FAT16: 
(0089) 		case PART_TYPE_FAT16LBA:
(0090) 			// 第一个目录扇区号为2
(0091) 			FirstDirSector	= CLUST_FIRST;
    0DF1 E042      LDI	R20,2
    0DF2 E050      LDI	R21,0
    0DF3 E060      LDI	R22,0
    0DF4 E070      LDI	R23,0
    0DF5 935002BB  STS	FirstDirSector+1,R21
    0DF7 934002BA  STS	FirstDirSector,R20
    0DF9 937002BD  STS	FirstDirSector+3,R23
    0DFB 936002BC  STS	FirstDirSector+2,R22
(0092) 			//FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
(0093) 			Fat32Enabled = 0;
    0DFD 2422      CLR	R2
    0DFE 922002CA  STS	Fat32Enabled,R2
(0094) 			
(0095) 			break;
    0E00 C010      RJMP	0x0E11
(0096) 		case PART_TYPE_FAT32LBA:
(0097) 		case PART_TYPE_FAT32:
(0098) 			
(0099) 			FirstDirSector = bpb->bpbRootClust;
    0E01 01F5      MOVW	R30,R10
    0E02 A021      LDD	R2,Z+33
    0E03 A032      LDD	R3,Z+34
    0E04 A043      LDD	R4,Z+35
    0E05 A054      LDD	R5,Z+36
    0E06 923002BB  STS	FirstDirSector+1,R3
    0E08 922002BA  STS	FirstDirSector,R2
    0E0A 925002BD  STS	FirstDirSector+3,R5
    0E0C 924002BC  STS	FirstDirSector+2,R4
(0100) 			Fat32Enabled = 1;
    0E0E E081      LDI	R24,1
    0E0F 938002CA  STS	Fat32Enabled,R24
(0101) 			break;
(0102) 		default:break;
(0103) 			//return 1;
(0104) 	}
(0105) //查询SD卡文件系统信息
(0106) 	switch (PartInfo.prPartType)
    0E11 90A002CF  LDS	R10,0x2CF
    0E13 24BB      CLR	R11
    0E14 01C5      MOVW	R24,R10
    0E15 3084      CPI	R24,4
    0E16 E0E0      LDI	R30,0
    0E17 079E      CPC	R25,R30
    0E18 F0B9      BEQ	0x0E30
    0E19 3086      CPI	R24,6
    0E1A E0E0      LDI	R30,0
    0E1B 079E      CPC	R25,R30
    0E1C F0E1      BEQ	0x0E39
    0E1D 3084      CPI	R24,4
    0E1E E0E0      LDI	R30,0
    0E1F 079E      CPC	R25,R30
    0E20 F40C      BGE	0x0E22
    0E21 C03B      RJMP	0x0E5D
    0E22 01C5      MOVW	R24,R10
    0E23 308B      CPI	R24,0xB
    0E24 E0E0      LDI	R30,0
    0E25 079E      CPC	R25,R30
    0E26 F169      BEQ	0x0E54
    0E27 308C      CPI	R24,0xC
    0E28 E0E0      LDI	R30,0
    0E29 079E      CPC	R25,R30
    0E2A F101      BEQ	0x0E4B
    0E2B 308E      CPI	R24,0xE
    0E2C E0E0      LDI	R30,0
    0E2D 079E      CPC	R25,R30
    0E2E F099      BEQ	0x0E42
    0E2F C02D      RJMP	0x0E5D
(0107) 	{
(0108) 		case PART_TYPE_DOSFAT16:
(0109) 				LCD_write_english_string(0,0,"DOSFAT 16");
    0E30 EA89      LDI	R24,0xA9
    0E31 E090      LDI	R25,0
    0E32 8399      STD	Y+1,R25
    0E33 8388      STD	Y+0,R24
    0E34 2722      CLR	R18
    0E35 2700      CLR	R16
    0E36 940E0C88  CALL	_LCD_write_english_string
(0110) 				break;
    0E38 C02C      RJMP	0x0E65
(0111) 		case PART_TYPE_FAT16:
(0112) 				LCD_write_english_string(0,0,"FAT16 ");
    0E39 EA82      LDI	R24,0xA2
    0E3A E090      LDI	R25,0
    0E3B 8399      STD	Y+1,R25
    0E3C 8388      STD	Y+0,R24
    0E3D 2722      CLR	R18
    0E3E 2700      CLR	R16
    0E3F 940E0C88  CALL	_LCD_write_english_string
(0113) 				break;
    0E41 C023      RJMP	0x0E65
(0114) 		case PART_TYPE_FAT16LBA:
(0115) 				LCD_write_english_string(0,0,"FAT16 LBA");
    0E42 E988      LDI	R24,0x98
    0E43 E090      LDI	R25,0
    0E44 8399      STD	Y+1,R25
    0E45 8388      STD	Y+0,R24
    0E46 2722      CLR	R18
    0E47 2700      CLR	R16
    0E48 940E0C88  CALL	_LCD_write_english_string
(0116) 				break;
    0E4A C01A      RJMP	0x0E65
(0117) 		case PART_TYPE_FAT32LBA:
(0118) 				LCD_write_english_string(0,0,"FAT32 LBA");
    0E4B E88E      LDI	R24,0x8E
    0E4C E090      LDI	R25,0
    0E4D 8399      STD	Y+1,R25
    0E4E 8388      STD	Y+0,R24
    0E4F 2722      CLR	R18
    0E50 2700      CLR	R16
    0E51 940E0C88  CALL	_LCD_write_english_string
(0119) 				break;
    0E53 C011      RJMP	0x0E65
(0120) 		case PART_TYPE_FAT32:
(0121) 				LCD_write_english_string(0,0,"FAT32");
    0E54 E888      LDI	R24,0x88
    0E55 E090      LDI	R25,0
    0E56 8399      STD	Y+1,R25
    0E57 8388      STD	Y+0,R24
    0E58 2722      CLR	R18
    0E59 2700      CLR	R16
    0E5A 940E0C88  CALL	_LCD_write_english_string
(0122) 				break;
    0E5C C008      RJMP	0x0E65
(0123) 		default:
(0124) 				LCD_write_english_string(0,0,"No Partition!");
    0E5D E78A      LDI	R24,0x7A
    0E5E E090      LDI	R25,0
    0E5F 8399      STD	Y+1,R25
    0E60 8388      STD	Y+0,R24
    0E61 2722      CLR	R18
    0E62 2700      CLR	R16
    0E63 940E0C88  CALL	_LCD_write_english_string
(0125) 				break;
(0126) 	}
(0127) //显示磁盘容量
(0128) data=PartInfo.prSize>>11;
    0E65 E08B      LDI	R24,0xB
    0E66 E090      LDI	R25,0
    0E67 904002D9  LDS	R4,0x2D9
    0E69 905002DA  LDS	R5,0x2DA
    0E6B 902002D7  LDS	R2,0x2D7
    0E6D 903002D8  LDS	R3,0x2D8
    0E6F 938A      ST	R24,-Y
    0E70 0181      MOVW	R16,R2
    0E71 0192      MOVW	R18,R4
    0E72 940E13ED  CALL	lsr32
    0E74 0158      MOVW	R10,R16
(0129)     LCD_set_XY(56,0);
    0E75 2722      CLR	R18
    0E76 E308      LDI	R16,0x38
    0E77 940E0C5F  CALL	_LCD_set_XY
(0130)     t1=data/100;
    0E79 E624      LDI	R18,0x64
    0E7A E030      LDI	R19,0
    0E7B 0185      MOVW	R16,R10
    0E7C 940E12C6  CALL	div16u
(0131) 	LCD_write_char(t1+48);
    0E7E 5D00      SUBI	R16,0xD0
    0E7F 940E0C6E  CALL	_LCD_write_char
(0132) 	data=data%100;
    0E81 E624      LDI	R18,0x64
    0E82 E030      LDI	R19,0
    0E83 0185      MOVW	R16,R10
    0E84 940E12C4  CALL	mod16u
    0E86 0158      MOVW	R10,R16
(0133) 	t1=data/10;
    0E87 E02A      LDI	R18,0xA
    0E88 E030      LDI	R19,0
    0E89 940E12C6  CALL	div16u
    0E8B 2EC0      MOV	R12,R16
(0134) 	LCD_write_char(t1+48);
    0E8C 5D00      SUBI	R16,0xD0
    0E8D 940E0C6E  CALL	_LCD_write_char
(0135) 	t2=data%10;
    0E8F E02A      LDI	R18,0xA
    0E90 E030      LDI	R19,0
    0E91 0185      MOVW	R16,R10
    0E92 940E12C4  CALL	mod16u
    0E94 2EA0      MOV	R10,R16
(0136) 	LCD_write_char(t2+48);
    0E95 5D00      SUBI	R16,0xD0
    0E96 940E0C6E  CALL	_LCD_write_char
(0137) 	LCD_write_english_string(76,0,"M");
    0E98 E788      LDI	R24,0x78
    0E99 E090      LDI	R25,0
    0E9A 8399      STD	Y+1,R25
    0E9B 8388      STD	Y+0,R24
    0E9C 2722      CLR	R18
    0E9D E40C      LDI	R16,0x4C
    0E9E 940E0C88  CALL	_LCD_write_english_string
(0138)     LCD_write_english_string(0,1,"RATE");
    0EA0 E783      LDI	R24,0x73
    0EA1 E090      LDI	R25,0
    0EA2 8399      STD	Y+1,R25
    0EA3 8388      STD	Y+0,R24
    0EA4 E021      LDI	R18,1
    0EA5 2700      CLR	R16
    0EA6 940E0C88  CALL	_LCD_write_english_string
(0139) 	return 0;	
    0EA8 2700      CLR	R16
    0EA9 9622      ADIW	R28,2
    0EAA 940E1397  CALL	pop_gset4
    0EAC 9508      RET
_fatGetDirEntry:
  rval                 --> Y+8
  save2                --> R10
  save                 --> Y+4
  b                    --> Y+20
  sector               --> Y+0
  hasBuffer            --> Y+18
  index                --> Y+16
  de                   --> Y+14
  p                    --> R12
  we                   --> Y+12
  i                    --> R14
  entry                --> Y+32
    0EAD 931A      ST	R17,-Y
    0EAE 930A      ST	R16,-Y
    0EAF 940E139D  CALL	push_gset5
    0EB1 9766      SBIW	R28,0x16
(0140) }
(0141) 
(0142) /*-----------------------------------------------------------------------
(0143) 查询一个文件的开始簇
(0144) -----------------------------------------------------------------------*/
(0145) unsigned int baseentry = 0;
(0146) unsigned int entrycount = 0;
(0147) 
(0148) 
(0149) unsigned long fatGetDirEntry(unsigned int entry)
(0150) {
(0151) 	unsigned long sector;
(0152) 	struct direntry *de = 0;	// 防止compiler warning
    0EB2 2400      CLR	R0
    0EB3 2411      CLR	R1
    0EB4 861F      STD	Y+15,R1
    0EB5 860E      STD	Y+14,R0
(0153) 	struct winentry *we;
(0154) 	unsigned int hasBuffer;
(0155) 	unsigned int b;
(0156) 	int i,index;
(0157) 	char *p;
(0158) 	
(0159) 		entrycount = 0;
    0EB6 2422      CLR	R2
    0EB7 2433      CLR	R3
    0EB8 92300070  STS	entrycount+1,R3
    0EBA 9220006F  STS	entrycount,R2
(0160) 		DirNameBuffer = 0;
    0EBC 92300068  STS	DirNameBuffer+1,R3
    0EBE 92200067  STS	DirNameBuffer,R2
(0161) 	
(0162) 	
(0163) 	// 读取目录区数据
(0164) 	sector = fatClustToSect(FirstDirSector);
    0EC0 912002BC  LDS	R18,FirstDirSector+2
    0EC2 913002BD  LDS	R19,FirstDirSector+3
    0EC4 910002BA  LDS	R16,FirstDirSector
    0EC6 911002BB  LDS	R17,FirstDirSector+1
    0EC8 DE22      RCALL	_fatClustToSect
    0EC9 01FE      MOVW	R30,R28
    0ECA 8300      STD	Z+0,R16
    0ECB 8311      STD	Z+1,R17
    0ECC 8322      STD	Z+2,R18
    0ECD 8333      STD	Z+3,R19
(0165) 
(0166) 	hasBuffer = 0;
    0ECE 2400      CLR	R0
    0ECF 2411      CLR	R1
    0ED0 8A1B      STD	Y+19,R1
    0ED1 8A0A      STD	Y+18,R0
(0167) 
(0168) 	index = 16;	
    0ED2 E180      LDI	R24,0x10
    0ED3 E090      LDI	R25,0
    0ED4 8B99      STD	Y+17,R25
    0ED5 8B88      STD	Y+16,R24
(0169) 	do 
(0170) 	{
(0171) 		if(index == 16)	// 是否该一人一扇区time for next sector ?
    0ED6 8988      LDD	R24,Y+16
    0ED7 8999      LDD	R25,Y+17
    0ED8 3180      CPI	R24,0x10
    0ED9 E0E0      LDI	R30,0
    0EDA 079E      CPC	R25,R30
    0EDB F009      BEQ	0x0EDD
    0EDC C02A      RJMP	0x0F07
(0172) 		{
(0173) 			ReadBlock(sector++);
    0EDD 01FE      MOVW	R30,R28
    0EDE 8020      LDD	R2,Z+0
    0EDF 8031      LDD	R3,Z+1
    0EE0 8042      LDD	R4,Z+2
    0EE1 8053      LDD	R5,Z+3
    0EE2 01FE      MOVW	R30,R28
    0EE3 8224      STD	Z+4,R2
    0EE4 8235      STD	Z+5,R3
    0EE5 8246      STD	Z+6,R4
    0EE6 8257      STD	Z+7,R5
    0EE7 E041      LDI	R20,1
    0EE8 E050      LDI	R21,0
    0EE9 E060      LDI	R22,0
    0EEA E070      LDI	R23,0
    0EEB 01FE      MOVW	R30,R28
    0EEC 8024      LDD	R2,Z+4
    0EED 8035      LDD	R3,Z+5
    0EEE 8046      LDD	R4,Z+6
    0EEF 8057      LDD	R5,Z+7
    0EF0 0E24      ADD	R2,R20
    0EF1 1E35      ADC	R3,R21
    0EF2 1E46      ADC	R4,R22
    0EF3 1E57      ADC	R5,R23
    0EF4 01FE      MOVW	R30,R28
    0EF5 8220      STD	Z+0,R2
    0EF6 8231      STD	Z+1,R3
    0EF7 8242      STD	Z+2,R4
    0EF8 8253      STD	Z+3,R5
    0EF9 01FE      MOVW	R30,R28
    0EFA 8104      LDD	R16,Z+4
    0EFB 8115      LDD	R17,Z+5
    0EFC 8126      LDD	R18,Z+6
    0EFD 8137      LDD	R19,Z+7
    0EFE DDCF      RCALL	_ReadBlock
(0174) 			de = (struct direntry *)BUFFER;
    0EFF EB86      LDI	R24,0xB6
    0F00 E090      LDI	R25,0
    0F01 879F      STD	Y+15,R25
    0F02 878E      STD	Y+14,R24
(0175) 			index = 0;
    0F03 2400      CLR	R0
    0F04 2411      CLR	R1
    0F05 8A19      STD	Y+17,R1
    0F06 8A08      STD	Y+16,R0
(0176) 		}	
(0177) 	
(0178) 		if(*de->deName != 0xE5)
    0F07 85EE      LDD	R30,Y+14
    0F08 85FF      LDD	R31,Y+15
    0F09 8180      LDD	R24,Z+0
    0F0A 3E85      CPI	R24,0xE5
    0F0B F409      BNE	0x0F0D
    0F0C C122      RJMP	0x102F
(0179) 		{
(0180) 			// 如果if not a deleted entry
(0181) 			if(de->deAttributes == ATTR_LONG_FILENAME)
    0F0D 8583      LDD	R24,Z+11
    0F0E 308F      CPI	R24,0xF
    0F0F F009      BEQ	0x0F11
    0F10 C06F      RJMP	0x0F80
(0182) 			{
(0183) 				// we have a long name entry

⌨️ 快捷键说明

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