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