?? ch375hft.asm
字號:
JZ COPY_INFO_END
INC R7
CJNE R7,#0FFH,COPY_INFO_CHAR ; 文件字符計數
COPY_INFO_END: MOV NewSize,#00H
MOV NewSize+01H,R7 ; 新文件的長度
MOV SecCount,#01H ; 新文件只占用1個扇區, (NewSize+511)/512
LJMP CREATE_NEW_FILE
; 找到原文件
FOUND_SOURCE_FILE: ;LCALL CH375FileQuery ; 查詢其信息,包括長度,日期時間,屬性等
;LCALL _mStopIfError
MOV A,CH375vFileSize ; 原文件的長度
JNZ SOURCE_FILE_LONG ; 由于演示板用的62256只有32K字節,其中CH375子程序用512字節,所以只讀取不超過63個扇區
MOV A,CH375vFileSize+01H
JNZ SOURCE_FILE_LONG ; 由于RAM緩沖區有限,所以限制一次讀寫操作的長度不超過32256字節
MOV A,CH375vFileSize+02H
CLR C
SUBB A,#HIGH (FILE_DATA_BUF_LEN)
JC SOURCE_FILE_SHORT ; 小于RAM緩沖區的長度
JNZ SOURCE_FILE_LONG ; 大于RAM緩沖區的長度
MOV A,CH375vFileSize+03H
CLR C
SUBB A,#LOW (FILE_DATA_BUF_LEN)
JC SOURCE_FILE_SHORT ; 一次讀寫操作的長度未操作RAM緩沖區的長度
SOURCE_FILE_LONG: MOV SecCount,#(FILE_DATA_BUF_LEN/512) ; 限制為RAM文件讀寫緩沖區的長度
MOV NewSize,#HIGH (FILE_DATA_BUF_LEN)
MOV NewSize+01H,#LOW (FILE_DATA_BUF_LEN)
SJMP READ_SOURCE_FILE
SOURCE_FILE_SHORT: MOV A,CH375vFileSize+03H ; 如果原文件較小,那么使用原長度
MOV NewSize+01H,A ; NewSize=CH375vFileSize
ADD A,#0FFH
MOV A,CH375vFileSize+02H
MOV NewSize,A ; SecCount = (NewSize+511)/512
ADDC A,#01H
MOV R6,A
CLR A
ADDC A,CH375vFileSize+01H
RRC A
MOV A,R6
RRC A
MOV SecCount,A ; 計算新文件的長度對應的扇區數,因為讀寫是以扇區為單位的
; 從原文件中讀取數據到FILE_DATA_BUF中,以扇區為單位進行讀寫,所以速度較快,適用于數據量較大的情況
READ_SOURCE_FILE: MOV R0,#LOW (mCmdParam) ; 讀操作要指定讀出數據的長度,以扇區為單位,mCmdParam.Read.mSectorCount
MOV @R0,SecCount ; 指定讀取扇區數, 本例子中是讀取全部數據,如果超過63個扇區則只讀取63個扇區
PUSH CH375vFileSize+03H
PUSH CH375vFileSize+02H
PUSH CH375vFileSize+01H
PUSH CH375vFileSize
MOV A,CH375vFileSize+03H ;默認情況下,以扇區方式讀取數據時,無法讀出文件尾部不足1個扇區的部分,所以必須臨時加大文件長度以讀取尾部零頭
ADD A,#0FFH ;CH375vFileSize+511
MOV CH375vFileSize+03H,A
MOV A,CH375vFileSize+02H
ADDC A,#01H
MOV CH375vFileSize+02H,A
MOV A,CH375vFileSize+01H
ADDC A,#00H
MOV CH375vFileSize+01H,A
MOV A,CH375vFileSize
ADDC A,#00H
MOV CH375vFileSize,A
LCALL CH375FileRead ; 從文件讀取數據
LCALL _mStopIfError ; 如果文件數據的復制方式為"外部子程序",那么由_xWriteToExtBuf子程序讀出數據,否則自動讀到FILE_DATA_BUF中
POP CH375vFileSize ; 恢復原文件長度
POP CH375vFileSize+01H
POP CH375vFileSize+02H
POP CH375vFileSize+03H
MOV R0,#LOW (mCmdParam) ; mCmdParam.Close.mUpdateLen
MOV @R0,#00H
LCALL CH375FileClose ; 關閉文件, 用完后需要關閉文件
LCALL _mStopIfError
; 將FILE_DATA_BUF中的原文件字符轉換為大寫
MOV DPTR,#FILE_DATA_BUF
MOV R6,#00H
MOV R7,#00H ; 計數
CONVERT_CHAR_NEXT: CLR C
MOV A,R7
SUBB A,NewSize+01H
MOV A,R6
SUBB A,NewSize
JNC CONVERT_CHAR_END ; 原文件字符已經處理完畢
MOVX A,@DPTR
MOV R5,A
CLR C
SUBB A,#061H
JC CONVERT_CHAR_SKIP ; 不是小寫字符
MOV A,R5
SETB C
SUBB A,#07AH
JNC CONVERT_CHAR_SKIP ; 不是小寫字符
MOV A,R5
ANL A,#0DFH
MOVX @DPTR,A ; 將原小寫字符轉換為大寫后寫回FILE_DATA_BUF中
CONVERT_CHAR_SKIP: INC DPTR ; 指向緩沖區中的下一個字符
INC R7
CJNE R7,#00H,CONVERT_CHAR_NEXT ; 計數
INC R6
SJMP CONVERT_CHAR_NEXT
CONVERT_CHAR_END:
; 在根目錄下創建新文件NEWFILE.TXT,以扇區為單位進行讀寫,所以速度較快,適用于數據量較大的情況
CREATE_NEW_FILE: CLR LED_WR ; 寫操作
MOV R0,#LOW (mCmdParam) ; 命令參數,mCmdParam.Create.mPathName
MOV DPTR,#NEW_NAME ; 指向新文件名
LCALL _mCopyStringToIRAM ; 復制文件名作為調用子程序的參數
LCALL CH375FileCreate ; 新建文件并打開,如果文件已經存在則先刪除后再新建
LCALL _mStopIfError
MOV R0,#LOW (mCmdParam) ; 寫操作要指定寫入數據的長度,以扇區為單位,mCmdParam.Write.mSectorCount
MOV @R0,SecCount ; 寫入所有扇區的數據
LCALL CH375FileWrite ; 向文件寫入數據
LCALL _mStopIfError ; 如果文件數據的復制方式為"外部子程序",那么由_xReadFromExtBuf子程序寫入數據,否則自動將FILE_DATA_BUF中的數據寫入
MOV A,#0FFH
MOV R0,#LOW (mCmdParam+08H) ; 輸入參數mCmdParam.Modify.mFileAttr: 新的文件屬性,為0FFH則不修改
MOV @R0,A
MOV R0,#LOW (mCmdParam+06H) ; 輸入參數mCmdParam.Modify.mFileTime: 新的文件時間,為0FFFFH則不修改,使用新建文件產生的默認時間
MOV @R0,A
INC R0
MOV @R0,A
MOV R0,#LOW (mCmdParam+04H) ; 輸入參數mCmdParam.Modify.mFileDate: 新的文件日期: 2004.05.18 */
MOV @R0,#030H ; 日期產生方法是 Date = ((Year-1980)<<9) + (Month<<5) + Day
INC R0
MOV @R0,#0B2H
MOV R0,#LOW (mCmdParam) ; 輸入參數mCmdParam.Modify.mFileSize: 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限
MOV @R0,#00H
INC R0
MOV @R0,#00H ; 如果文件長度大于64KB,那么該單元應該寫入文件長度的高23-16位
INC R0
MOV @R0,NewSize
INC R0
MOV @R0,NewSize+01H ; 指定新的文件長度
LCALL CH375FileModify ; 修改當前文件的信息,修改日期和長度
LCALL _mStopIfError
MOV R0,#LOW (mCmdParam) ; 命令參數, mCmdParam.Close.mUpdateLen
MOV @R0,#00H ; 不要自動計算文件長度,如果自動計算,那么該長度總是512的倍數
LCALL CH375FileClose ; 關閉文件
LCALL _mStopIfError
; 在根目錄下創建第二個新文件MY_FILE2.TXT,以字節為單位進行讀寫,所以速度較慢,適用于RAM較少、數據量較小的情況
MOV R0,#LOW (mCmdParam) ; 命令參數,mCmdParam.Create.mPathName
MOV DPTR,#NEW_NAME_2 ; 指向新文件名
LCALL _mCopyStringToIRAM ; 復制文件名作為調用子程序的參數
LCALL CH375FileCreate ; 新建文件并打開,如果文件已經存在則先刪除后再新建
LCALL _mStopIfError
; 以字節為單位寫入幾十個字節的數據
MOV R0,#LOW (mCmdParam+01H) ; 命令參數,mCmdParam.ByteWrite.mByteBuffer
MOV DPTR,#DATA_FOR_FILE2 ; 指向準備寫入新文件中的數據
LCALL _mCopyStringToIRAM ; 將準備寫入新文件中的數據復制到參數結構中
MOV R0,#LOW (mCmdParam) ; 寫操作要指定寫入數據的長度,以扇區為單位,mCmdParam.ByteWrite.mByteCount
MOV @R0,#18H ; 本次寫入的字節數24,不能大于MAX_BYTE_IO
LCALL CH375ByteWrite ; 向文件寫入數據,如果還有數據需要繼續寫入,那么可以再調用CH375ByteWrite,接著剛才的寫入
LCALL _mStopIfError ; 以字節為單位寫文件不需要使用FILE_DATA_BUF緩沖區,所以與復制方式無關
MOV R0,#LOW (mCmdParam) ; 命令參數, mCmdParam.Close.mUpdateLen
MOV @R0,#01H ; 以字節為單位寫入文件后,應該自動計算文件長度
LCALL CH375FileClose ; 關閉文件
LCALL _mStopIfError
SETB LED_WR
; 演示處理完畢, 等待U盤拔出
SETB LED_RUN
WAIT_DISK_OUT: MOV A,CH375DiskStatus ; 查詢CH375中斷并更新中斷狀態,等待U盤拔出
XRL A,#01H
JZ DISK_OUT_NOW
LCALL xQueryInterrupt
SJMP WAIT_DISK_OUT
DISK_OUT_NOW: SETB LED_OUT ; LED滅
LCALL mDelay100mS
LCALL mDelay100mS
LJMP WAIT_DISK_IN ; 主循環
;
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -