?? ch375hmp.asm
字號:
; 檢查操作狀態,如果錯誤則停機,應該替換為實際的處理措施
; 輸入: R7 為操作狀態碼
mStopIfError: MOV A,R7
JNZ mStopIfError_LED ;狀態碼是錯誤
RET
mStopIfError_LED: ;LED閃爍
CLR A
MOV C,LED_OUT
MOV ACC.0,C
XRL A,#01H
MOV C,ACC.0
MOV LED_OUT,C
LCALL mDelay100mS
SJMP mStopIfError_LED
;
; 主程序
MAIN: CLR A
MOV PSW,A
MOV IE,A
MOV SP,#60H
MOV A,#0FFH
MOV P0,A
MOV P1,A
MOV P2,A
MOV P3,A
CLR LED_OUT ;開機后LED亮一下以示工作
LCALL mDelay100mS ;延時100毫秒,CH375模塊上電后需要100毫秒左右的復位時間
LCALL mDelay100mS
SETB LED_OUT
;其它電路初始化
;初始化完成
NOP
MAIN_LOOP: ;主循環
;可以在打算讀寫U盤時再查詢,沒有必要一直連續不停地查詢,可以讓單片機做其它事,沒事可做就延時等待一會再查詢
MOV R5,#00H ;沒有命令參數
MOV R7,#CMD_QueryStatus ;使用查詢方式看U盤是否連接
LCALL ExecCommand ;查詢當前模塊的狀態
LCALL mStopIfError ;錯誤則停機
MOV A,mCmdParam+1 ;Status.mDiskStatus
XRL A,#DISK_CONNECT
JZ MAIN_CONNECT ;U盤已經連接
LCALL mDelay100mS ;可以讓單片機做其它事,沒事可做就延時等待一會再查詢
LCALL mDelay100mS
SJMP MAIN_LOOP
MAIN_CONNECT: LCALL mDelay100mS ;U盤已經連接,延時,可選操作,有的USB存儲器需要幾十毫秒的延時
LCALL mDelay100mS
CLR LED_OUT ;LED亮說明U盤連接
; 檢查U盤是否準備好,大多數U盤不需要這一步,但是某些U盤必須要執行這一步才能工作
MOV R3,#05H
WAIT_READY: LCALL mDelay100mS
MOV R5,#00H
MOV R7,#CMD_DiskReady
LCALL ExecCommand ;查詢磁盤是否準備好
MOV A,R7
JZ DISK_IS_READY
DJNZ R3,WAIT_READY ;U盤尚未準備好
DISK_IS_READY:
;讀取原文件
MOV DPTR,#STR_FILE_NAME1
MOV R0,#mCmdParam ;Open.mPathName
LCALL CopyString ;復制文件名
MOV A,R7
MOV R5,A ;參數長度為文件名長度
MOV R7,#CMD_FileOpen ;打開文件
LCALL ExecCommand ;執行打開文件操作
CJNE R7,#ERR_MISS_DIR,MAIN_OPEN_J1
SJMP MAIN_OPEN_MISS ;ERR_MISS_DIR說明沒有找到C51子目錄
MAIN_OPEN_J1: CJNE R7,#ERR_MISS_FILE,MAIN_OPEN_J2
MAIN_OPEN_MISS: ;ERR_MISS_FILE說明沒有找到文件
;沒有原文件則自行產生數據
MOV DPTR,#DATA_BUF ;因為沒有找到源文件,所以自行產生數據寫入新文件
MOV R5,#00H
MAIN_COPY_STR: PUSH DPH
PUSH DPL
MOV DPTR,#STR_FILE_DATA
MOV A,R5
INC R5
MOVC A,@A+DPTR ;從程序空間復制字符串作為新文件的內容
POP DPL
POP DPH
MOVX @DPTR,A
INC DPTR
JNZ MAIN_COPY_STR ;未到字符串結束符00H
MAIN_FILL_STR: MOV A,#24H ;'$'
MOVX @DPTR,A
INC DPTR
MOV A,DPH
CJNE A,#HIGH (DATA_BUF) + 2,MAIN_FILL_STR ;填充滿512字節(一個扇區)
MOV NEW_SIZE_HIGH,#02H
MOV NEW_SIZE_LOW,#00H ;新文件的長度,512字節
MOV SECTOR_COUNT,#01H ;新文件的長度只有一個扇區,計算文件的扇區數,因為讀寫是以扇區為單位的
LJMP MAIN_CREATE_NEW ;創建新文件
MAIN_OPEN_J2: LCALL mStopIfError ;源文件成功打開
;查詢當前文件的信息并計算長度
MOV R5,#00H
MOV R7,#CMD_FileQuery ;查詢當前文件的信息,沒有輸入參數
LCALL ExecCommand
LCALL mStopIfError
MOV NEW_SIZE_HIGH,#10H
MOV NEW_SIZE_LOW,#00H ;新文件的長度不超過4096,實際上模塊本身不限制長度
MOV R0,#mCmdParam
MOV A,@R0 ;Modify.mFileSize.31-24,高字節在前
JNZ MAIN_QUERY_J1 ;文件太大
INC R0
MOV A,@R0 ;Modify.mFileSize.23-16
JNZ MAIN_QUERY_J1 ;文件太大
INC R0
MOV A,@R0 ;Modify.mFileSize.15-8
CLR C
SUBB A,#10H ;本示例程序將文件長度限制在4096
JNC MAIN_QUERY_J1 ;文件長度超過4096
MOV A,@R0 ;Modify.mFileSize.15-8
MOV NEW_SIZE_HIGH,A
INC R0
MOV A,@R0 ;Modify.mFileSize.7-0
MOV NEW_SIZE_LOW,A ;新文件的長度
MAIN_QUERY_J1: MOV A,NEW_SIZE_LOW
ADD A,#0FFH
MOV A,NEW_SIZE_HIGH
ADDC A,#01H
CLR C
RRC A ;每個扇區是512字節,所以高8位除以2
MOV SECTOR_COUNT,A ;計算文件的扇區數,因為讀寫是以扇區為單位的
JNZ MAIN_QUERY_J3
INC SECTOR_COUNT ;至少一個扇區
MAIN_QUERY_J3:
;讀取原文件
MOV A,SECTOR_COUNT
MOV mCmdParam+0,A ;Read.mSectorCount
MOV R5,#01H ;只有一個輸入參數
MOV R7,#CMD_FileRead ;從文件讀取數據
MOV DPTR,#DATA_BUF ;對于讀寫文件數據的操作,指定外部RAM緩沖區,存放數據的緩沖區的起始地址
LCALL ExecCommand ;從文件讀取數據,如果文件比較大,一次讀不完,可以再用命令CMD_FileRead繼續讀取,文件指針自動向后移動
LCALL mStopIfError
MOV A,#00H
MOV mCmdParam+0,A ;Close.mUpdateLen
MOV R5,#01H ;只有一個輸入參數
MOV R7,#CMD_FileClose ;關閉文件
LCALL ExecCommand ;關閉文件
LCALL mStopIfError
;將源文件中的小寫字符轉換為大寫,準備寫入新文件
MOV DPTR,#DATA_BUF
MOV R7,NEW_SIZE_HIGH
MOV R6,NEW_SIZE_LOW
MAIN_CHAR_CASE: CJNE R6,#00H,MAIN_CHAR_CNT1
CJNE R7,#00H,MAIN_CHAR_CNT2
SJMP MAIN_CHAR_END
MAIN_CHAR_CNT2: DEC R7
MAIN_CHAR_CNT1: DEC R6 ;計數
MOVX A,@DPTR
MOV R5,A
CLR C
SUBB A,#61H ;'a'
JC MAIN_CHAR_SKIP ;不是小寫字母
MOV A,R5
CLR C
SUBB A,#7BH ;'z'+1
JNC MAIN_CHAR_SKIP ;不是小寫字母
MOV A,R5
ANL A,#0DFH ;小寫轉大寫字母
MOVX @DPTR,A
MAIN_CHAR_SKIP: INC DPTR
SJMP MAIN_CHAR_CASE
MAIN_CHAR_END: NOP ;已經將小寫字母轉大寫
;產生新文件
MAIN_CREATE_NEW:
MOV DPTR,#STR_FILE_NAME2
MOV R0,#mCmdParam ;Create.mPathName
LCALL CopyString ;復制文件名
MOV A,R7
MOV R5,A ;參數長度為文件名長度
MOV R7,#CMD_FileCreate
LCALL ExecCommand ;新建文件并打開,如果文件已經存在則先刪除后再新建
LCALL mStopIfError
MOV A,SECTOR_COUNT
MOV mCmdParam+0,A ;Write.mSectorCount
MOV R5,#01H ;只有一個輸入參數
MOV R7,#CMD_FileWrite ;向文件寫入數據
MOV DPTR,#DATA_BUF ;對于讀寫文件數據的操作,指定外部RAM緩沖區,存放數據的緩沖區的起始地址
LCALL ExecCommand ;向文件寫入數據,如果文件比較大,一次寫不完,可以再用命令CMD_FileWrite繼續寫入,文件指針自動向后移動
LCALL mStopIfError
MOV A,#01H ;自動計算文件長度,長度總是512的倍數
MOV mCmdParam+0,A ;Close.mUpdateLen
MOV R5,#01H ;只有一個輸入參數
MOV R7,#CMD_FileClose ;關閉文件
LCALL ExecCommand ;關閉文件
LCALL mStopIfError
;等待U盤斷開,僅作演示,實際應用中不必考慮U盤是否斷開
MAIN_TAKE_OUT: MOV R5,#00H ;沒有命令參數
MOV R7,#CMD_QueryStatus ;使用查詢方式看U盤是否斷開
LCALL ExecCommand ;查詢當前模塊的狀態
LCALL mStopIfError ;錯誤則停機
MOV A,mCmdParam+1 ;Status.mDiskStatus
XRL A,#DISK_DISCONNECT
JZ MAIN_DISCONNECT ;U盤已經斷開
LCALL mDelay100mS ;延時等待一會再查詢
LCALL mDelay100mS
SJMP MAIN_TAKE_OUT
MAIN_DISCONNECT: SETB LED_OUT ;LED滅
LJMP MAIN_LOOP ;等待下一個U盤連接
; END main
;
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -