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

📄 file.s

📁 Atmega64单片机程序(完整工程)
💻 S
📖 第 1 页 / 共 5 页
字号:
	.module file.c
	.area text(rom, con, rel)
;              i -> R20
	.even
_FileInit::
	xcall push_gset1
; /****************************************Copyright (c)**************************************************
; **                               广州周立功单片机发展有限公司
; **                                     研    究    所
; **                                        产品一部
; **
; **                                 http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: file.c
; **创   建   人: 陈明计
; **最后修改日期: 2004年4月1日
; **描        述: 文件系统的文件基本操作程序
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #define   IN_FILE 
; 
; #include "SYS_Config.h" 
; #include "SD_Drive.h" 
; #include "fat.h" 
; #include "time.h" 
; 
; 
; extern INT32U _GetFDTInfo(char *FDTName,char *DirFileName);
; extern void strupr(INT8U *Path);
; 
; static MY_FILE FileInfo[MAX_OPEN_FILES];/* 打开文件信息表 */
; 
; 
; /*********************************************************************************************************
; ** 函数名称: FileInit
; ** 功能描述: 初始化文件指针系统
; ** 输   入: 无
; ** 输   出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; void FileInit(void)
; {
;     HANDLE i ;
;     
;     for(i=0;i<MAX_OPEN_FILES;i++)
	clr R20
	xjmp L5
L2:
	ldi R16,33
	mov R17,R20
	muls R16,R17
	movw R30,R0
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
L3:
	inc R20
L5:
	cpi R20,3
	brlt L2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
;             Rt -> R10
;             fp -> R12,R13
;       FileName -> R18,R19
;        DirClus -> y+8
;          Drive -> R16
	.even
_FindOpenFile::
	st -y,r19
	st -y,r18
	xcall push_gset4
	ldd R18,y+12
	ldd R19,y+13
;     {
;         FileInfo[i].Flags=0 ;
;     }
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FindOpenFile
; ** 功能描述: 查找已打开的指定文件的文件句柄,内部使用
; ** 输   入: Drive:文件所在的逻辑盘号
; **           DirClus:文件所在目录的开始簇号
; **           FileName:内部文件名
; ** 输   出: 文件句柄,Not_Open_FILE为没有打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FindOpenFile(INT8U Drive,INT32U DirClus,char FileName[11])
; {
;     HANDLE   Rt ;
;     MY_FILE  *fp ;
;     
;     fp=FileInfo ;
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	movw R12,R24
;     for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
	clr R10
	xjmp L10
L7:
;     {
;         if(fp->Flags!=0)
	movw R30,R12
	ldd R2,z+0
	tst R2
	brne X0
	xjmp L11
X0:
;         if(fp->Drive==Drive)
	ldd R2,z+12
	cp R2,R16
	breq X1
	xjmp L13
X1:
;         if(fp->DirClus==DirClus)
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	movw R30,R12
	ldd R6,z+13
	ldd R7,z+14
	ldd R8,z+15
	ldd R9,z+16
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	breq X2
	xjmp L15
X2:
;         if(fp->Name[0]==FileName[0])
	movw R30,R18
	ldd R2,z+0
	movw R30,R12
	ldd R3,z+1
	cp R3,R2
	breq X3
	xjmp L17
X3:
;         if(fp->Name[1]==FileName[1])
	movw R30,R18
	ldd R2,z+1
	movw R30,R12
	ldd R3,z+2
	cp R3,R2
	breq X4
	xjmp L19
X4:
;         if(fp->Name[2]==FileName[2])
	movw R30,R18
	ldd R2,z+2
	movw R30,R12
	ldd R3,z+3
	cp R3,R2
	breq X5
	xjmp L21
X5:
;         if(fp->Name[3]==FileName[3])
	movw R30,R18
	ldd R2,z+3
	movw R30,R12
	ldd R3,z+4
	cp R3,R2
	breq X6
	xjmp L23
X6:
;         if(fp->Name[4]==FileName[4])
	movw R30,R18
	ldd R2,z+4
	movw R30,R12
	ldd R3,z+5
	cp R3,R2
	breq X7
	xjmp L25
X7:
;         if(fp->Name[5]==FileName[5])
	movw R30,R18
	ldd R2,z+5
	movw R30,R12
	ldd R3,z+6
	cp R3,R2
	breq X8
	xjmp L27
X8:
;         if(fp->Name[6]==FileName[6])
	movw R30,R18
	ldd R2,z+6
	movw R30,R12
	ldd R3,z+7
	cp R3,R2
	breq X9
	xjmp L29
X9:
;         if(fp->Name[7]==FileName[7])
	movw R30,R18
	ldd R2,z+7
	movw R30,R12
	ldd R3,z+8
	cp R3,R2
	brne L31
;         if(fp->Name[8]==FileName[8])
	movw R30,R18
	ldd R2,z+8
	movw R30,R12
	ldd R3,z+9
	cp R3,R2
	brne L33
;         if(fp->Name[9]==FileName[9])
	movw R30,R18
	ldd R2,z+9
	movw R30,R12
	ldd R3,z+10
	cp R3,R2
	brne L35
;         if(fp->Name[10]==FileName[10])
	movw R30,R18
	ldd R2,z+10
	movw R30,R12
	ldd R3,z+11
	cp R3,R2
	brne L37
;         {
;             break ;
	xjmp L9
L37:
L35:
L33:
L31:
L29:
L27:
L25:
L23:
L21:
L19:
L17:
L15:
L13:
L11:
	movw R24,R12
	adiw R24,33
	movw R12,R24
L8:
	inc R10
L10:
	mov R24,R10
	cpi R24,3
	brge X10
	xjmp L7
X10:
L9:
;         }
;         fp++;
;     }
;     if(Rt>=MAX_OPEN_FILES)
	mov R24,R10
	cpi R24,3
	brlt L39
;     {
;         Rt=Not_Open_FILE ;
	ldi R24,255
	mov R10,R24
;     }
L39:
;     return Rt ;
	mov R16,R10
L6:
	xcall pop_gset4
	adiw R28,2
	.dbline 0 ; func end
	ret
;     ClusIndex1 -> y+54
;           temp -> y+22
;          Drive -> R12
;        DirName -> y+10
;      ClusIndex -> y+6
;             Rt -> R10
;    DirFileName -> R12,R13
	.even
_RemoveFile::
	xcall push_gset4
	movw R12,R16
	sbiw R28,58
; }
; 
; /*********************************************************************************************************
; ** 函数名称: RemoveFile
; ** 功能描述: 删除文件
; ** 输   入: DirFileName:用户使用的文件名
; ** 输   出: RETURN_OK:成功
; **           其它参考fat.h中关于返回值的说明
; ** 全局变量: 无
; ** 调用模块: strupr,_GetFDTInfo,GetDrive,FindFDTInfo,FATDelClusChain,DelFDT
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人: 陈明计
; ** 日   期: 2004年4月10日
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT8U RemoveFile(char *DirFileName)
; {
;     INT32U ClusIndex,ClusIndex1 ;
;     INT8U  Drive,Rt ;
;     char   DirName[12];
;     FDT    temp ;
;     
;     strupr(DirFileName);
	movw R16,R12
	xcall _strupr
;     /* 变为大写 */
;     ClusIndex=_GetFDTInfo(DirName,DirFileName);
	movw R18,R12
	movw R16,R28
	subi R16,246  ; offset = 10
	sbci R17,255
	xcall __GetFDTInfo
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
;     Rt=PATH_NOT_FIND ;
	ldi R24,14
	mov R10,R24
;     if(ClusIndex!=BAD_CLUS)
	ldi R20,247
	ldi R21,255
	ldi R22,255
	ldi R23,15
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne X11
	xjmp L42
X11:
;     {
;         Drive=GetDrive(DirFileName);
	movw R16,R12
	xcall _GetDrive
	mov R12,R16
;         /* 获取文件所在逻辑盘号 */
;         Rt=FindFDTInfo(&temp,Drive,ClusIndex,DirName);
	movw R24,R28
	adiw R24,10
	std y+5,R25
	std y+4,R24
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	mov R18,R12
	movw R16,R28
	subi R16,234  ; offset = 22
	sbci R17,255
	xcall _FindFDTInfo
	mov R10,R16
;         if(Rt==RETURN_OK)
	tst R16
	breq X12
	xjmp L44
X12:
;         {
;             Rt=NOT_FIND_FILE ;
	ldi R24,19
	mov R10,R24
;             /* 是文件才删除 */
;             if((temp.Attr&ATTR_DIRECTORY)==0)
	ldd R2,y+33
	sbrc R2,4
	rjmp L46
;             {
;                 Rt=FILE_LOCK ;
	ldi R24,18
	mov R10,R24
;                 if(FindOpenFile(Drive,ClusIndex,DirName)<MAX_OPEN_FILES)
	movw R24,R28
	adiw R24,10
	std y+3,R25
	std y+2,R24
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	xcall _FindOpenFile
	cpi R16,3
	brlt X13
	xjmp L49
X13:
;                 {
;                     /* 文件没有打开才删除 */
;                     ClusIndex1=temp.FstClusLO+((INT32U)(temp.FstClusHI)<<16);
	ldd R2,y+42
	ldd R3,y+43
	clr R4
	clr R5
	movw R4,R2
	clr R2
	clr R3
	ldd R6,y+48
	ldd R7,y+49
	clr R8
	clr R9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+54,R6
	std z+55,R7
	std z+56,R8
	std z+57,R9
;                     FATDelClusChain(Drive,ClusIndex1);
	movw R30,R28
	ldd R2,z+54
	ldd R3,z+55
	ldd R4,z+56
	ldd R5,z+57
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	xcall _FATDelClusChain
;                     Rt=DelFDT(Drive,ClusIndex,DirName);
	movw R24,R28
	adiw R24,10
	std y+3,R25
	std y+2,R24
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	std y+0,R4
	std y+1,R5
	movw R18,R2
	mov R16,R12
	xcall _DelFDT
	mov R10,R16
;                 }
L49:
;             }
L46:
;         }
L44:
;     }
L42:
;     return Rt ;
	mov R16,R10
L41:
	adiw R28,58
	xcall pop_gset4
	.dbline 0 ; func end
	ret
;             Rt -> R10
;             fp -> R12,R13
;       FileName -> R18,R19
;        DirClus -> y+8
;          Drive -> R16
	.even
_FindOpenFileW::
	st -y,r19
	st -y,r18
	xcall push_gset4
	ldd R18,y+12
	ldd R19,y+13
; }
; 
; /*********************************************************************************************************
; ** 函数名称: FindOpenFileW
; ** 功能描述: 查找以读写方式打开的指定文件的文件句柄,内部使用
; ** 输   入: Drive:文件所在的逻辑盘号
; **           DirClus:文件所在目录的开始簇号
; **           FileName:内部文件名
; ** 输   出: 文件句柄,Not_Open_FILE为没有打开
; ** 全局变量: FileInfo
; ** 调用模块: _GetFDTInfo,GetDrive,FindFDTInfo,
; ** 作   者: 陈明计
; ** 日   期: 2003年6月5日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; HANDLE FindOpenFileW(INT8U Drive,INT32U DirClus,char FileName[11])
; {
;     HANDLE Rt ;
;     MY_FILE *fp ;
;     
;     fp=FileInfo ;
	ldi R24,<_FileInfo
	ldi R25,>_FileInfo
	movw R12,R24
;     for(Rt=0;Rt<MAX_OPEN_FILES;Rt++)
	clr R10
	xjmp L57
L54:
;     {
;         if((fp->Flags&FILE_FLAGS_WRITE)!=0)
	movw R30,R12
	ldd R2,z+0
	sbrs R2,1
	rjmp L58
;         if(fp->Drive==Drive)
	ldd R2,z+12
	cp R2,R16
	breq X14
	xjmp L60
X14:
;         if(fp->DirClus==DirClus)
	movw R30,R28
	ldd R2,z+8
	ldd R3,z+9
	ldd R4,z+10
	ldd R5,z+11
	movw R30,R12
	ldd R6,z+13
	ldd R7,z+14
	ldd R8,z+15
	ldd R9,z+16
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	breq X15
	xjmp L62
X15:
;         if(fp->Name[0]==FileName[0])
	movw R30,R18
	ldd R2,z+0
	movw R30,R12
	ldd R3,z+1
	cp R3,R2
	breq X16
	xjmp L64
X16:
;         if(fp->Name[1]==FileName[1])
	movw R30,R18
	ldd R2,z+1
	movw R30,R12
	ldd R3,z+2
	cp R3,R2
	breq X17
	xjmp L66
X17:
;         if(fp->Name[2]==FileName[2])
	movw R30,R18
	ldd R2,z+2
	movw R30,R12
	ldd R3,z+3
	cp R3,R2
	breq X18
	xjmp L68
X18:
;         if(fp->Name[3]==FileName[3])
	movw R30,R18
	ldd R2,z+3
	movw R30,R12
	ldd R3,z+4
	cp R3,R2
	breq X19
	xjmp L70
X19:
;         if(fp->Name[4]==FileName[4])
	movw R30,R18
	ldd R2,z+4
	movw R30,R12
	ldd R3,z+5
	cp R3,R2
	breq X20
	xjmp L72
X20:
;         if(fp->Name[5]==FileName[5])
	movw R30,R18
	ldd R2,z+5
	movw R30,R12
	ldd R3,z+6
	cp R3,R2
	breq X21
	xjmp L74
X21:
;         if(fp->Name[6]==FileName[6])
	movw R30,R18
	ldd R2,z+6
	movw R30,R12
	ldd R3,z+7
	cp R3,R2
	breq X22
	xjmp L76
X22:
;         if(fp->Name[7]==FileName[7])
	movw R30,R18
	ldd R2,z+7
	movw R30,R12
	ldd R3,z+8
	cp R3,R2
	brne L78
;         if(fp->Name[8]==FileName[8])
	movw R30,R18
	ldd R2,z+8
	movw R30,R12
	ldd R3,z+9
	cp R3,R2
	brne L80
;         if(fp->Name[9]==FileName[9])
	movw R30,R18
	ldd R2,z+9
	movw R30,R12
	ldd R3,z+10
	cp R3,R2
	brne L82
;         if(fp->Name[10]==FileName[10])
	movw R30,R18
	ldd R2,z+10
	movw R30,R12
	ldd R3,z+11
	cp R3,R2
	brne L84
;         {
;             break ;
	xjmp L56
L84:
L82:
L80:
L78:
L76:
L74:
L72:
L70:
L68:
L66:
L64:
L62:
L60:
L58:
	movw R24,R12
	adiw R24,33

⌨️ 快捷键说明

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