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

📄 fat.s

📁 LED条屏显示程序,但是对初学者
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module FAT.c
	.area data(ram, con, rel)
_CHINALIB_point::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
	.dbsym e CHINALIB_point _CHINALIB_point l
_UNICODE_point::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
	.dbsym e UNICODE_point _UNICODE_point l
	.area text(rom, con, rel)
	.dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\FAT.c
	.dbfunc e FATinit _FATinit fc
; RootDirSectors -> R10,R11
; BPB_RootEntCnt -> R10,R11
;    BPB_FATsz16 -> R12,R13
;    BPB_NumFATs -> R14
; BPB_BytePerSec -> y+4
	.even
_FATinit::
	xcall push_gset5
	sbiw R28,6
	.dbline -1
	.dbline 23
; //ICC-AVR application builder : 2005-11-12 17:11:59
; // Target : M16
; // Crystal: 8.0000Mhz
; // copyright:鲁军波(endylu)
; // www.shop34612283.taobao.com
; // www.adembed.com
; #include <iom16v.h>
; #include <macros.h>
; #include "main.h"
; 
; uint32 CHINALIB_point=0;
; uint32 UNICODE_point=0;
; 
; extern MP3_INFO mp3_info;
; extern FAT_INFO fat_info;
; 
; extern uint8 buffer[512];
; extern uint8 MP3_all_number;
; extern uint8 name_number;
; 
; //=======================================================================
; uint8 FATinit(void)
; {/*SD卡的变量*/
	.dbline 35
;  
;  uint16 BPB_BytePerSec;          //每扇区的字节数     512
;   
;  uint8  BPB_NumFATs;             //此卷中FAT表的份数;
;  uint16 BPB_RootEntCnt;          //fat12/16根目录的目录项数;
;  uint16 BPB_FATsz16;             //FAT12/FAT16一个FAT表占的扇区数(FAT32此项必须为0);
;  
;  uint16 RootDirSectors;          //根目录所占的扇区数
;  
;  /*变量取值*/
;  
;  if(SD_read_sector2(0,&fat_info.Relative,1))
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,<_fat_info
	ldi R25,>_fat_info
	std y+1,R25
	std y+0,R24
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,0
	xcall _SD_read_sector2
	tst R16
	breq L2
	.dbline 36
;  	{
	.dbline 37
; 	return 1;
	ldi R16,1
	xjmp L1
L2:
	.dbline 40
; 	}
;  
;  if(fat_info.Relative==0xEB)                       //判断有没有Relative Sectors
	lds R24,_fat_info
	cpi R24,235
	brne L4
	.dbline 41
;     fat_info.Relative=0;
	clr R2
	sts _fat_info,R2
	xjmp L5
L4:
	.dbline 43
;  else
;     SD_read_sector2(454,&fat_info.Relative,1);        //取Relative Sectors
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,<_fat_info
	ldi R25,>_fat_info
	std y+1,R25
	std y+0,R24
	ldi R16,198
	ldi R17,1
	ldi R18,0
	ldi R19,0
	xcall _SD_read_sector2
L5:
	.dbline 45
;  
;  SD_read_sector2(((long)fat_info.Relative<<9)+11,buffer,13);   //取值
	ldi R24,13
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,<_buffer
	ldi R25,>_buffer
	std y+1,R25
	std y+0,R24
	ldi R24,9
	ldi R25,0
	lds R2,_fat_info
	clr R3
	clr R4
	clr R5
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R2,R16
	movw R4,R18
	ldi R20,11
	ldi R21,0
	ldi R22,0
	ldi R23,0
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R16,R2
	movw R18,R4
	xcall _SD_read_sector2
	.dbline 48
; 
;  
;  BPB_BytePerSec=buffer[0]+((int)buffer[1]<<8);
	lds R2,_buffer+1
	clr R3
	mov R3,R2
	clr R2
	lds R4,_buffer
	clr R5
	add R4,R2
	adc R5,R3
	std y+5,R5
	std y+4,R4
	.dbline 49
;  fat_info.BPB_SecPerClus=buffer[2];
	lds R2,_buffer+2
	sts _fat_info+1,R2
	.dbline 50
;  fat_info.BPB_RsvdSecCnt=buffer[3];
	lds R2,_buffer+3
	sts _fat_info+2,R2
	.dbline 51
;  BPB_NumFATs=buffer[5];
	lds R14,_buffer+5
	.dbline 53
; 
;  BPB_RootEntCnt=buffer[6]+((int)buffer[7]<<8);
	lds R2,_buffer+7
	clr R3
	mov R3,R2
	clr R2
	lds R10,_buffer+6
	clr R11
	add R10,R2
	adc R11,R3
	.dbline 54
;  BPB_FATsz16=buffer[11]+((int)buffer[12]<<8);
	lds R2,_buffer+12
	clr R3
	mov R3,R2
	clr R2
	lds R12,_buffer+11
	clr R13
	add R12,R2
	adc R13,R3
	.dbline 57
;  
;  /*计算根目录的首扇区号*/
;  fat_info.Firstgengmulu=fat_info.Relative+fat_info.BPB_RsvdSecCnt+BPB_FATsz16*BPB_NumFATs;
	mov R18,R14
	clr R19
	movw R16,R12
	xcall empy16s
	lds R2,_fat_info+2
	clr R3
	lds R4,_fat_info
	clr R5
	add R4,R2
	adc R5,R3
	add R4,R16
	adc R5,R17
	sts _fat_info+3+1,R5
	sts _fat_info+3,R4
	.dbline 60
;  
;  /*计算FAT16根目录所占的扇区数*/
;  RootDirSectors=(((long)BPB_RootEntCnt<<5)+(BPB_BytePerSec-1) )/BPB_BytePerSec;
	ldi R24,5
	ldi R25,0
	movw R2,R10
	clr R4
	clr R5
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R2,R16
	movw R4,R18
	ldd R24,y+4
	ldd R25,y+5
	sbiw R24,1
	movw R6,R24
	clr R8
	clr R9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	ldd R6,y+4
	ldd R7,y+5
	clr R8
	clr R9
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R2
	movw R18,R4
	xcall div32s
	movw R10,R16
	.dbline 62
;  /*计算簇2的首扇区*/
;  fat_info.FirstDateSecter=fat_info.Relative+fat_info.BPB_RsvdSecCnt+((long)BPB_FATsz16*BPB_NumFATs)+RootDirSectors;
	mov R2,R14
	clr R3
	clr R4
	clr R5
	movw R6,R12
	clr R8
	clr R9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32s
	lds R2,_fat_info+2
	clr R3
	lds R4,_fat_info
	clr R5
	add R4,R2
	adc R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R6,R10
	clr R8
	clr R9
	add R2,R6
	adc R3,R7
	adc R4,R8
	adc R5,R9
	sts _fat_info+5+1,R3
	sts _fat_info+5,R2
	.dbline 65
; 
; 
;  return 0;
	clr R16
	.dbline -2
L1:
	adiw R28,6
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r RootDirSectors 10 i
	.dbsym r BPB_RootEntCnt 10 i
	.dbsym r BPB_FATsz16 12 i
	.dbsym r BPB_NumFATs 14 c
	.dbsym l BPB_BytePerSec 4 i
	.dbend
	.dbfunc e Mp3_number_Counter _Mp3_number_Counter fV
; mulu_Clus_number -> y+1
;   counter_over -> y+0
;    Read_number -> R10
	.even
_Mp3_number_Counter::
	xcall push_gset5
	sbiw R28,3
	.dbline -1
	.dbline 70
; }
; 
; //=======================================================================
; void Mp3_number_Counter(void)
; {
	.dbline 72
;  uint8 Read_number;
;  uint8 counter_over=0;
	clr R0
	std y+0,R0
	.dbline 75
;  uint16 mulu_Clus_number;
;  
;  mulu_Clus_number=fat_info.Firstgengmulu;
	lds R2,_fat_info+3
	lds R3,_fat_info+3+1
	std y+2,R3
	std y+1,R2
	xjmp L23
L22:
	.dbline 78
; 
;  while(!counter_over)
;   {
	.dbline 80
;    
;    SD_start_read(mulu_Clus_number++);
	ldd R2,y+1
	ldd R3,y+2
	movw R24,R2
	adiw R24,1
	std y+2,R25
	std y+1,R24
	clr R4
	clr R5
	movw R16,R2
	movw R18,R4
	xcall _SD_start_read
	.dbline 81
;    Read_number=16;
	ldi R24,16
	mov R10,R24
	xjmp L26
L25:
	.dbline 83
;    while(Read_number--)
;       {
	.dbline 85
; 	   
; 	   SD_get_date(buffer,32);  
	ldi R18,32
	ldi R19,0
	ldi R16,<_buffer
	ldi R17,>_buffer
	xcall _SD_get_date
	.dbline 86
;        if((buffer[0]!=0XE5)&(buffer[8]==0x4D)&(buffer[9]==0x50)&(buffer[10]==0x33))
	lds R24,_buffer
	cpi R24,229
	breq L33
	ldi R20,1
	ldi R21,0
	xjmp L34
L33:
	clr R20
	clr R21
L34:
	lds R24,_buffer+8
	cpi R24,77
	brne L35
	ldi R22,1
	ldi R23,0
	xjmp L36
L35:
	clr R22
	clr R23
L36:
	lds R24,_buffer+9
	cpi R24,80
	brne L37
	ldi R24,1
	ldi R25,0
	movw R14,R24
	xjmp L38
L37:
	clr R14
	clr R15
L38:
	lds R24,_buffer+10
	cpi R24,51
	brne L39
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L40
L39:
	clr R12
	clr R13
L40:
	movw R2,R20
	and R2,R22
	and R3,R23
	and R2,R14
	and R3,R15
	and R2,R12
	and R3,R13
	tst R2
	brne X0
	tst R3
	breq L28
X0:
	.dbline 87
; 		 {
	.dbline 89
; 		   
; 		  MP3_all_number++;
	lds R24,_MP3_all_number
	subi R24,255    ; addi 1
	sts _MP3_all_number,R24
	.dbline 90
; 		  }
	xjmp L29
L28:
	.dbline 91
; 	   else if(buffer[0]==0)
	lds R2,_buffer
	tst R2
	brne L41
	.dbline 92
; 	     {
	xjmp L44
L43:
	.dbline 94
	.dbline 96
	ldi R18,32
	ldi R19,0
	ldi R16,<_buffer
	ldi R17,>_buffer
	xcall _SD_get_date
	.dbline 97
L44:
	.dbline 93
; 		  while(Read_number--)
	mov R2,R10
	clr R3
	mov R24,R2
	subi R24,1
	mov R10,R24
	tst R2
	brne L43
	.dbline 98
; 		     {
; 			  
; 			  SD_get_date(buffer,32);
; 		      }
; 		  counter_over=1;
	clr R0
	inc R0
	std y+0,R0
	.dbline 99
; 		  }
L41:
L29:
	.dbline 101
L26:
	.dbline 82
	mov R2,R10
	clr R3
	mov R24,R2
	subi R24,1
	mov R10,R24
	tst R2
	breq X1
	xjmp L25
X1:
	.dbline 102
L23:
	.dbline 77
	ldd R0,y+0
	tst R0
	brne X2
	xjmp L22
X2:
	.dbline -2
L20:
	adiw R28,3
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l mulu_Clus_number 1 i
	.dbsym l counter_over 0 c
	.dbsym r Read_number 10 c
	.dbend
	.dbfunc e MP3_Directory _MP3_Directory fV
;        counter -> y+12
; mulu_Clus_number -> y+4
;              i -> y+11
;              j -> y+10
;    Read_number -> y+8
;         number -> R10
	.even
_MP3_Directory::
	xcall push_gset5
	mov R10,R16
	sbiw R28,17
	.dbline -1
	.dbline 108
; 	  
; 	  }    
;   }
; 
; }
; 
; //=======================================================================
; void MP3_Directory(uint8 number)
; {
	.dbline 114
;  uint8 i,j;
;  uint8 counter;
;  uint16 Read_number;
;  uint32 mulu_Clus_number;
;  
;  Read_number=0;
	clr R0
	clr R1
	std y+9,R1
	std y+8,R0
	.dbline 115
;  counter=number;
	std y+12,R10
	.dbline 116
;  mp3_info.Name_number=0;
	clr R2
	sts _mp3_info+52,R2
	.dbline 117
;  mulu_Clus_number=fat_info.Firstgengmulu;
	lds R2,_fat_info+3
	lds R3,_fat_info+3+1
	clr R4
	clr R5
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	.dbline 118
;  mulu_Clus_number=mulu_Clus_number<<9;
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
	xjmp L50
L49:
	.dbline 122
;  
;  
;  while(counter)
;  {
	.dbline 123
;   SD_read_sector2(mulu_Clus_number+((long)(Read_number++)<<5),buffer,32);
	ldi R24,32
	ldi R25,0
	std y+3,R25
	std y+2,R24
	ldi R24,<_buffer
	ldi R25,>_buffer
	std y+1,R25
	std y+0,R24
	ldd R2,y+8
	ldd R3,y+9
	movw R24,R2
	adiw R24,1
	std y+9,R25
	std y+8,R24
	ldi R24,5
	ldi R25,0
	clr R4
	clr R5
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R16,R2
	movw R18,R4
	xcall _SD_read_sector2
	.dbline 125
; 
;   if(counter>1)
	ldi R24,1
	ldd R0,y+12
	cp R24,R0
	brlo X10
	xjmp L52
X10:
	.dbline 126
;     {if((buffer[0]!=0XE5)&(buffer[8]==0x4D)&(buffer[9]==0x50)&(buffer[10]==0x33))
	.dbline 126
	lds R24,_buffer
	cpi R24,229
	breq L59
	ldi R24,1
	ldi R25,0
	std y+14,R25
	std y+13,R24
	xjmp L60
L59:
	clr R0
	clr R1
	std y+14,R1
	std y+13,R0
L60:
	lds R24,_buffer+8
	cpi R24,77
	brne L61
	ldi R24,1
	ldi R25,0
	movw R14,R24
	xjmp L62
L61:
	clr R14
	clr R15
L62:
	lds R24,_buffer+9
	cpi R24,80
	brne L63
	ldi R24,1
	ldi R25,0
	movw R12,R24
	xjmp L64
L63:
	clr R12
	clr R13
L64:
	lds R24,_buffer+10
	cpi R24,51

⌨️ 快捷键说明

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