以下是我改写的例程,可是运行时能建立文件,数据也写入了U盘,就是在计算机上读不出来,提示文件系统出错,用磁盘修复系统整理后,就能读取文件了.请指教是怎么回事呢?另外我写的产生文件创建时间的程序不能产生创建时间那两个公式是什么呢? 谢谢回复!
;--------------------------------------------------------------------------- ;-----------------------打开文件 MOV R0,#LOW (mCmdParam);命令参数,mCmdParam.Open.mPathName;;指向联合体的最低单元 MOV DPTR,#FILE_NAME;指向原文件名,该文件在根目录下;该地址以后存放文件名,长度为16个字节 LCALL _mCopyStringToIRAMX;复制文件名作为调用子程序的参数 LCALL CH375FileOpen;打开文件 MOV A,R7 XRL A,#ERR_MISS_FILE;查相应的文件是否存在 JZ FILE_NOT_FOUND;文件不存在 LCALL _mStopIfError;返回值出错处理 ;-------文件存在则关闭文件 MOV R0,#LOW (mCmdParam);命令参数, mCmdParam.Close.mUpdateLen MOV @R0,#00H;不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数;因为前面已经设置好了文件长度,所以在这里不用进行文件长度的自动设置 LCALL CH375FileClose;关闭文件 LCALL _mStopIfError;返回值出错处理 SJMP SETDISP ;-------生成新文件 FILE_NOT_FOUND: MOV R0,#LOW (mCmdParam);命令参数,mCmdParam.Create.mPathName MOV DPTR,#FILE_NAME;NEW_NAME;指向新文件名,长度为16个字节 LCALL _mCopyStringToIRAMX;复制文件名作为调用子程序的参数 LCALL CH375FileCreate;新建文件并打开,如果文件已经存在则先删除后再新建 LCALL _mStopIfError;返回值出错处理 ;-------------以扇区方式往文件里写入数据 MOV R0,#LOW (mCmdParam);写操作要指定写入数据的长度,以扇区为单位,mCmdParam.Write.mSectorCount MOV SECCOUNT,#8 MOV @R0,SecCount;写入所有扇区的数据 LCALL CH375FileWrite;向文件写入数据 LCALL _mStopIfError;返回值出错处理; 如果文件数据的复制方式为"外部子程序",那么由_xReadFromExtBuf子程序写入数据,否则自动将FILE_DATA_BUF中的数据写入 ;-----------------------设置所建立文件的属性,准备关闭文件 FILESET: MOV A,#01H;;;;;;默认文件属性 MOV R0,#LOW (mCmdParam+08H);输入参数mCmdParam.Modify.mFileAttr:设置新文件的属性,为0FFH则不修改 MOV @R0,A ;-------------设置文件建立时间 MOV R0,#LOW (mCmdParam+06H);输入参数mCmdParam.Modify.mFileTime:设置新文件的时间,为0FFFFH则不修改,使用新建文件产生的默认时间 MOV A,XBUF2 LCALL BCDHEX RL A RL A RL A MOV R3,A MOV A,XBUF1 LCALL BCDHEX RL A RL A RL A RL A RL A MOV R4,A MOV A,XBUF0 LCALL BCDHEX RR A CLR C ADD A,R4 MOV R4,A CLR A ADDC A,R3 MOV @R0,A INC R0 MOV A,R4 MOV @R0,A ; MOV @R0,A;;;;;;;默认文件建立时间 ; INC R0 ; MOV @R0,A ;-------------设置文件的建立日期为指定日期"2004.05.18" MOV R0,#LOW (mCmdParam+04H);输入参数mCmdParam.Modify.mFileDate: 新的文件日期: 2004.05.18 */ MOV A,XBUF5 LCALL BCDHEX ADD A,#14H;(加100减80) RL A;直接送至高位字节,少循环8次 MOV B,A;年高位暂存 MOV A,XBUF4 LCALL BCDHEX RL A RL A RL A RL A RL A MOV @R0,A;月循环5次低位暂存 MOV A,XBUF3 LCALL BCDHEX CLR C ADD A,@R0 INC R0 MOV @R0,A MOV A,#0 ADDC A,B DEC R0 MOV @R0,A ; MOV @R0,#030H;日期产生方法是 Date = ((Year-1980)<<9) + (Month<<5) + Day;在左移时是两个字节在移动也就是说(2004-1980)=24=18H,实际是0018H,左移后成为3000H,,.转下一行 ; INC R0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;而月份中是0005H左移后成为00A0H,和日期(0012H)相加后成为了30B2H. ; MOV @R0,#0B2H;该值由上面的公式产生 ;-------------设置文件实际长度大小,以字节为单位,实际大小在Newsize-2,Newsize-1,Newsize,Newsize+1里面,共占用四个单元,如果文件长度小于64K字节,则只使用Newsize,Newsize+1两个字节就可以了 MOV R0,#LOW (mCmdParam); 输入参数mCmdParam.Modify.mFileSize: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限 MOV @R0,#00H;-----长度计数字节1 INC R0 MOV @R0,#00H;-----长度计数字节2如果文件长度大于64KB,那么该单元应该写入文件长度的高23-16位 INC R0 MOV @R0,#0FFH;NewSize;--长度计数字节3 INC R0 MOV @R0,#0FFH;NewSize+01H;---长度计数字节4指定新的文件长度 ;-----------调用子程序将设置值写入U盘 LCALL CH375FileModify;修改当前文件的信息,修改日期和长度 LCALL _mStopIfError;返回值出错处理 ;-------设置关闭文件参数,关闭文件 MOV R0,#LOW (mCmdParam);命令参数, mCmdParam.Close.mUpdateLen MOV @R0,#00H;不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数;因为前面已经设置好了文件长度,所以在这里不用进行文件长度的自动设置 LCALL CH375FileClose;关闭文件 LCALL _mStopIfError;返回值出错处理 ;-----------------------设置参数显示和修改 SETDISP: NOP LCALL DPRT