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

📄 fat.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module fat.c
	.area text(rom, con, rel)
	.dbfile C:\AVR\M\1\fat.c
	.dbfunc e Fat_Init _Fat_Init fc
	.even
_Fat_Init::
	xcall push_gset3
	sbiw R28,2
	.dbline -1
	.dbline 18
; 
; #include"fat.h"
; #include "Usart.h"
; uint32 FAT_MASK;
; uint8   Fat_Buffer[512]; 
; uint32 NumOfFile;  //文件的数量
; 
; 
; //DISK_FAT_INFO结构,用来存储SD卡的信息
; struct DISK_FAT_INFO DiskFATInfo;
; 
; //MUSIC_INFO结构,用来存储音乐的信息,MusicInfoList用来存放音乐列表,这里限制100首
; struct MUSIC_INFO MusicInfoList[3];
; 
; //******************************************************************************
; //初始化FAT,将SD卡信息,存到DiskFATInfo结构
; uint8 Fat_Init(void)
; {
	.dbline 19
;   SD_ReadBlock(0,Fat_Buffer);
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	std y+1,R25
	std y+0,R24
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,0
	xcall _SD_ReadBlock
	.dbline 20
;   if(Fat_Buffer[0] != 0xEB)
	lds R24,_Fat_Buffer
	cpi R24,235
	brne X2
	xjmp L2
X2:
	.dbline 21
;   {
	.dbline 22
;    	DiskFATInfo.DBR_LBA = (Fat_Buffer[454]|(Fat_Buffer[455]<<8)|((uint32)Fat_Buffer[456]<<16)|((uint32)Fat_Buffer[457]<<24));
	lds R2,_Fat_Buffer+455
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+454
	clr R5
	or R4,R2
	or R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	lds R6,_Fat_Buffer+456
	clr R7
	clr R8
	clr R9
	movw R8,R6
	clr R6
	clr R7
	or R2,R6
	or R3,R7
	or R4,R8
	or R5,R9
	ldi R24,24
	ldi R25,0
	lds R6,_Fat_Buffer+457
	clr R7
	clr R8
	clr R9
	st -y,R24
	movw R16,R6
	movw R18,R8
	xcall lsl32
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	sts _DiskFATInfo+1,R3
	sts _DiskFATInfo,R2
	sts _DiskFATInfo+2+1,R5
	sts _DiskFATInfo+2,R4
	.dbline 23
; 	switch(Fat_Buffer[0x1C2])
	lds R10,_Fat_Buffer+450
	clr R11
	movw R24,R10
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L14
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brge X3
	xjmp L3
X3:
L16:
	movw R24,R10
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	breq L12
	xjmp L3
X0:
	.dbline 24
; 	{
L12:
	.dbline 26
; 	    case 0x0B:
; 			 DiskFATInfo.FAT_Style = 32;
	ldi R24,32
	sts _DiskFATInfo+14,R24
	.dbline 27
; 			 FAT_MASK = FAT32_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	.dbline 28
; 			 break;
	xjmp L3
L14:
	.dbline 30
; 		case 0x04:
; 			 DiskFATInfo.FAT_Style = 16;
	ldi R24,16
	sts _DiskFATInfo+14,R24
	.dbline 31
; 			 FAT_MASK = FAT16_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	.dbline 32
; 			 break;
	.dbline 34
; 	}
;   }
	xjmp L3
L2:
	.dbline 36
;   else 
;   {
	.dbline 37
;    DiskFATInfo.DBR_LBA = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _DiskFATInfo+1,R21
	sts _DiskFATInfo,R20
	sts _DiskFATInfo+2+1,R23
	sts _DiskFATInfo+2,R22
	.dbline 38
;    switch(Fat_Buffer[0x55])
	lds R10,_Fat_Buffer+85
	clr R11
	movw R24,R10
	cpi R24,49
	ldi R30,0
	cpc R25,R30
	breq L23
	cpi R24,51
	ldi R30,0
	cpc R25,R30
	breq L21
	xjmp L17
X1:
	.dbline 39
;    {
L21:
	.dbline 41
;    	    case 0x33:
; 	   		 DiskFATInfo.FAT_Style = 32;
	ldi R24,32
	sts _DiskFATInfo+14,R24
	.dbline 42
; 			 FAT_MASK = FAT32_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	.dbline 43
; 			 break;
	xjmp L18
L23:
	.dbline 45
; 		case 0x31:
; 			 DiskFATInfo.FAT_Style = 16;
	ldi R24,16
	sts _DiskFATInfo+14,R24
	.dbline 46
; 			 FAT_MASK = FAT16_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	.dbline 47
; 			 break;
L17:
L18:
	.dbline 50
; 	        
;    }
;   }
L3:
	.dbline 51
;   SD_ReadBlock(DiskFATInfo.DBR_LBA,Fat_Buffer);  
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	std y+1,R25
	std y+0,R24
	lds R18,_DiskFATInfo+2
	lds R19,_DiskFATInfo+2+1
	lds R16,_DiskFATInfo
	lds R17,_DiskFATInfo+1
	xcall _SD_ReadBlock
	.dbline 52
;   DiskFATInfo.BytesPerSector = Fat_Buffer[0x0B] |(Fat_Buffer[0x0C] << 8);
	lds R2,_Fat_Buffer+12
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+11
	clr R5
	or R4,R2
	or R5,R3
	sts _DiskFATInfo+15+1,R5
	sts _DiskFATInfo+15,R4
	.dbline 53
;   DiskFATInfo.SectorsPerClustor = Fat_Buffer[0x0D];
	lds R2,_Fat_Buffer+13
	sts _DiskFATInfo+17,R2
	.dbline 56
;   
; 
;   DiskFATInfo.NumOfFATs = Fat_Buffer[0x10] |(Fat_Buffer[0x11] << 8);
	lds R2,_Fat_Buffer+17
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+16
	clr R5
	or R4,R2
	or R5,R3
	sts _DiskFATInfo+18,R4
	.dbline 59
; 
;   
;   DiskFATInfo.SectorsPerFAT = Fat_Buffer[0x24] |Fat_Buffer[0x25] << 8|(uint32)Fat_Buffer[0x26]<<16|(uint32)Fat_Buffer[0x27]<<24;
	lds R2,_Fat_Buffer+37
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+36
	clr R5
	or R4,R2
	or R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	lds R6,_Fat_Buffer+38
	clr R7
	clr R8
	clr R9
	movw R8,R6
	clr R6
	clr R7
	or R2,R6
	or R3,R7
	or R4,R8
	or R5,R9
	ldi R24,24
	ldi R25,0
	lds R6,_Fat_Buffer+39
	clr R7
	clr R8
	clr R9
	st -y,R24
	movw R16,R6
	movw R18,R8
	xcall lsl32
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	sts _DiskFATInfo+19+1,R3
	sts _DiskFATInfo+19,R2
	sts _DiskFATInfo+19+2+1,R5
	sts _DiskFATInfo+19+2,R4
	.dbline 62
; 
;   
;   DiskFATInfo.FAT_LBA = DiskFATInfo.DBR_LBA + (Fat_Buffer[0x0E]|Fat_Buffer[0x0F]<<8);
	lds R2,_Fat_Buffer+15
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+14
	clr R5
	or R4,R2
	or R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	lds R8,_DiskFATInfo+2
	lds R9,_DiskFATInfo+2+1
	lds R6,_DiskFATInfo
	lds R7,_DiskFATInfo+1
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	sts _DiskFATInfo+8+1,R7
	sts _DiskFATInfo+8,R6
	sts _DiskFATInfo+8+2+1,R9
	sts _DiskFATInfo+8+2,R8
	.dbline 64
; 
;   DiskFATInfo.FDT_LBA = DiskFATInfo.FAT_LBA + DiskFATInfo.SectorsPerFAT*DiskFATInfo.NumOfFATs;
	lds R2,_DiskFATInfo+18
	clr R3
	clr R4
	clr R5
	lds R8,_DiskFATInfo+19+2
	lds R9,_DiskFATInfo+19+2+1
	lds R6,_DiskFATInfo+19
	lds R7,_DiskFATInfo+19+1
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	lds R4,_DiskFATInfo+8+2
	lds R5,_DiskFATInfo+8+2+1
	lds R2,_DiskFATInfo+8
	lds R3,_DiskFATInfo+8+1
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	sts _DiskFATInfo+4+1,R3
	sts _DiskFATInfo+4,R2
	sts _DiskFATInfo+4+2+1,R5
	sts _DiskFATInfo+4+2,R4
	.dbline 68
;  
; 
;   
;   DiskFATInfo.FDT_StartClustor = Fat_Buffer[0x2C] |Fat_Buffer[0x2D] << 8|(uint32)Fat_Buffer[0x2E]<<16|(uint32)Fat_Buffer[0x2F]<<24;
	lds R2,_Fat_Buffer+45
	clr R3
	mov R3,R2
	clr R2
	lds R4,_Fat_Buffer+44
	clr R5
	or R4,R2
	or R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	lds R6,_Fat_Buffer+46
	clr R7
	clr R8
	clr R9
	movw R8,R6
	clr R6
	clr R7
	or R2,R6
	or R3,R7
	or R4,R8
	or R5,R9
	ldi R24,24
	ldi R25,0
	lds R6,_Fat_Buffer+47
	clr R7
	clr R8
	clr R9
	st -y,R24
	movw R16,R6
	movw R18,R8
	xcall lsl32
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	sts _DiskFATInfo+12+1,R3
	sts _DiskFATInfo+12,R2
	.dbline 70
; 
;   return 1;
	ldi R16,1
	.dbline -2
L1:
	adiw R28,2
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e FileExt_Compare _FileExt_Compare fc
;              i -> R20
;        strExt2 -> R18,R19
;        strExt1 -> R16,R17
	.even
_FileExt_Compare::
	xcall push_gset1
	.dbline -1
	.dbline 76
; }
; 
; //****************************************************************************
; //文件扩展名匹配,匹配成功返回真
; uint8 FileExt_Compare(uint8 *strExt1,uint8 *strExt2)
; {
	.dbline 79
;     uint8 i;
; 	
;     for(i=0; i<3; i++)
	clr R20
	xjmp L54
L51:
	.dbline 80
;     {
	.dbline 81
;         if(strExt1[i]!= strExt2[i]) break;
	mov R30,R20
	clr R31
	add R30,R18
	adc R31,R19
	ldd R2,z+0
	mov R30,R20
	clr R31
	add R30,R16
	adc R31,R17
	ldd R3,z+0
	cp R3,R2
	breq L55
	.dbline 81
	xjmp L53
L55:
	.dbline 82
L52:
	.dbline 79
	inc R20
L54:
	.dbline 79
	cpi R20,3
	brlo L51
L53:
	.dbline 83
;     }
;     if(i == 3)    return 1; 
	cpi R20,3
	brne L57
	.dbline 83
	ldi R16,1
	xjmp L50
L57:
	.dbline 85
; 	    
; 	return 0; 
	clr R16
	.dbline -2
L50:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r strExt2 18 pc
	.dbsym r strExt1 16 pc
	.dbend
	.dbfunc e GetMusicFile _GetMusicFile fV
;        FileExt -> y+18
; LocalOfFirstLFN -> y+14
;      Index_tmp -> y+10
;              n -> y+6
;   LocalOfMusic -> y+27
;              k -> y+25
;              i -> y+23
;            tem -> y+2
;              j -> y+21
	.even
_GetMusicFile::
	xcall push_gset5
	sbiw R28,33
	.dbline -1
	.dbline 91
; }	
; 
; //****************************************************************************
; //获取音乐文件
; void GetMusicFile(void)
; {
	.dbline 94
;   uint16  i,j,k;
;   uint32  tem;	//记录目录起始位置
;   uint32  Index_tmp=1;  //记录目录编号,不从0开始,因为第0项是系统占用的
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+10,R20
	std z+11,R21
	std z+12,R22
	std z+13,R23
	.dbline 97
;   uint32  LocalOfFirstLFN;
;   uint32 n;
;   uint16  LocalOfMusic=0;  //音乐文件的编号
	clr R0
	clr R1
	std y+28,R1
	std y+27,R0
	xjmp L61
L60:
	.dbline 102
;   uint8   FileExt[3]; 
; 
; 	
;   while(1)
;   {
	.dbline 103
;     n = DiskFATInfo.FDT_LBA+(Index_tmp/(DiskFATInfo.BytesPerSector/32));
	ldi R18,5
	ldi R19,0
	lds R16,_DiskFATInfo+15
	lds R17,_DiskFATInfo+15+1
	xcall lsr16
	movw R2,R16
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+10
	ldd R7,z+11
	ldd R8,z+12
	ldd R9,z+13
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall div32u
	lds R4,_DiskFATInfo+4+2
	lds R5,_DiskFATInfo+4+2+1
	lds R2,_DiskFATInfo+4
	lds R3,_DiskFATInfo+4+1
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	.dbline 106
; 
;     //读取FDT的相应扇区位置的内容
;     SD_ReadBlock(n,Fat_Buffer);
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	std y+1,R25
	std y+0,R24
	movw R30,R28
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
	xcall _SD_ReadBlock
	.dbline 108
; 	
; 	tem=((Index_tmp)*32)%DiskFATInfo.BytesPerSector;      //获取相应的目录
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	ldi R20,32
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	lds R2,_DiskFATInfo+15
	lds R3,_DiskFATInfo+15+1
	clr R4
	clr R5
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall mod32u
	movw R30,R28
	std z+2,R16
	std z+3,R17
	std z+4,R18
	std z+5,R19
	.dbline 110
; 		
; 	if(Fat_Buffer[tem] == 0)              //后面没有文件了,文件查询完毕
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	movw R30,R28
	push R26
	push R27
	ldd R26,z+2
	ldd R27,z+3
	movw R30,R26
	pop R27
	pop R26
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L66
	.dbline 111
; 	{
	.dbline 112
; 	    Index_tmp = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+10,R20
	std z+11,R21
	std z+12,R22
	std z+13,R23
	.dbline 113
; 		break;
	xjmp L62
L66:
	.dbline 116
; 	}
; 	
; 	if((Fat_Buffer[tem] != 0xe5) && (Fat_Buffer[tem] != 0x05))			   //文件没有删除   
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	movw R30,R28
	push R26
	push R27
	ldd R26,z+2
	ldd R27,z+3
	movw R30,R26
	pop R27
	pop R26
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R24,R2
	cpi R24,229
	brne X5
	xjmp L68
X5:
	cpi R24,5
	brne X6
	xjmp L68
X6:
	.dbline 117
;     {
	.dbline 118
; 		if(Fat_Buffer[tem+11]!= 0x0F)              //文件不为长文件名的一部分
	ldi R20,11
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R2
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,15
	brne X7
	xjmp L70
X7:
	.dbline 119
; 		{
	.dbline 120
; 		 	for(i=0;i<3;i++)                   //读取该文件的扩展名
	clr R0
	clr R1
	std y+24,R1
	std y+23,R0
	xjmp L75
L72:
	.dbline 121
	.dbline 122
	ldi R20,8
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+2
	ldd R3,z+3
	ldd R4,z+4
	ldd R5,z+5
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	ldd R6,y+23
	ldd R7,y+24
	clr R8
	clr R9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	movw R30,R2
	ldi R24,<_Fat_Buffer
	ldi R25,>_Fat_Buffer
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R24,R28
	adiw R24,18
	movw R30,R6
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 124
L73:
	.dbline 120
	ldd R24,y+23
	ldd R25,y+24
	adiw R24,1
	std y+24,R25
	std y+23,R24
L75:
	.dbline 120
	ldd R24,y+23
	ldd R25,y+24
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brlo L72
	.dbline 126
; 			{
; 			  FileExt[i] = Fat_Buffer[tem+8+i];   
; 			  
; 		    }
; 			    
; 			if(FileExt_Compare(FileExt,"MP3"))   //如果该文件是MP3

⌨️ 快捷键说明

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