?? ch375hmp.asm
字號(hào):
; /* 2004.06.05
; ****************************************
; ** Copyright (C) W.ch 1999-2004 **
; ** Web: http://www.winchiphead.com **
; ****************************************
; ** USB Host File Module @CH375 **
; ****************************************
; */
; /* U盤(pán)文件讀寫(xiě)模塊, 連接方式: 并口+查詢 */
; /* MCS-51單片機(jī)ASM語(yǔ)言示例程序, 僅適用于V2.5及以上版本的模塊 */
; /* 因?yàn)槭褂肬盤(pán)文件讀寫(xiě)模塊而不是使用U盤(pán)文件級(jí)子程序庫(kù),所以占用較少的單片機(jī)資源,可以使用89C51單片機(jī)測(cè)試 */
;
;$include (REG51.INC)
$include (..\CH375HM.INC)
; 電路連接方式
; 單片機(jī) 模塊
; P0 = D0-D7
; RD = RD#
; WR = WR#
; ? = CS# 如果沒(méi)有外部RAM,那么CS#=P26,如果有超過(guò)16KB的外部RAM,那么CS#=P27 & ! P26 & ...,所以CS#的片選地址為BXXXH
; P20 = A0
; P15 = STA#
; INT0 = INT# 雖然連接到INT0,但是本程序只是查詢模塊的INT#的狀態(tài),所以可以用P1口等普通I/O引腳代替INT0
CH375HM_INDEX XDATA 0BCF0H ;CH375模塊的索引端口的I/O地址
CH375HM_DATA XDATA 0BDF1H ;CH375模塊的數(shù)據(jù)端口的I/O地址
CH375HM_INT BIT INT0 ;假定CH375模塊的INT#引腳連接到單片機(jī)的INT0引腳
CH375HM_STA BIT P1.5 ;假定CH375模塊的STA#引腳連接到單片機(jī)的P15引腳
LED_OUT BIT P1.4 ;P1.4 低電平驅(qū)動(dòng)LED顯示,用于監(jiān)控演示程序的進(jìn)度
; 假定文件數(shù)據(jù)緩沖區(qū): ExtRAM: 0000H-7FFFH
DATA_BUF XDATA 00000H ;外部RAM的文件數(shù)據(jù)緩沖區(qū),從該單元開(kāi)始的緩沖區(qū)長(zhǎng)度不小于一次讀寫(xiě)的數(shù)據(jù)長(zhǎng)度,最少為512字節(jié)
; 命令參數(shù)結(jié)構(gòu), 長(zhǎng)度為20到60字節(jié)
mCmdParam DATA 20H ;默認(rèn)情況下該結(jié)構(gòu)將占用64字節(jié)的RAM,可以修改MAX_PATH_LEN常量,當(dāng)修改為32時(shí),只占用32字節(jié)的RAM,并口最大值62
SECTOR_COUNT DATA 1DH ;文件占用扇區(qū)數(shù)
NEW_SIZE_HIGH DATA 1EH ;文件長(zhǎng)度的高字節(jié)
NEW_SIZE_LOW DATA 1FH ;文件長(zhǎng)度的低字節(jié)
ORG 0000H
LJMP MAIN
;
; 程序數(shù)據(jù)起始地址
ORG 0100H
STR_FILE_NAME1: DB '\C51\CH375HFT.C',00H ;文件名,該文件在C51子目錄下
STR_FILE_DATA: DB 'Note: ',0DH,0AH
DB '原本是打算將/C51/CH375HFT.C文件中的小寫(xiě)字母轉(zhuǎn)成大寫(xiě)后寫(xiě)入新的文件,但是找不到這個(gè)文件',0DH,0AH,00H
STR_FILE_NAME2: DB '\雙擊我吧.TXT',00H ;新文件名,在根目錄下
; 從程序空間復(fù)制字符串到內(nèi)部RAM緩沖區(qū),源字符串必須以00H作為結(jié)束標(biāo)志,長(zhǎng)度不能超過(guò)255
; 入口: DPTR 指向源字符串的起始地址, R0 目標(biāo)緩沖區(qū)的起始地址
; 出口: R7 返回字符串的長(zhǎng)度(含字符串結(jié)束符00H)
; 使用: DPTR, R0, R7
CopyString: MOV R7,#00H
CopyStringChar: MOV A,R7
INC R7
MOVC A,@A+DPTR
MOV @R0,A
INC R0
JNZ CopyStringChar ;不是字符串結(jié)束符00H,繼續(xù)復(fù)制
RET
;
; 延時(shí)100毫秒,不精確
; 使用: R6, R7
mDelay100mS: MOV R7,#0C8H
mDelay100mS_1: MOV R6,#0C8H
mDelay100mS_2: NOP
NOP
NOP
DJNZ R6,mDelay100mS_2
DJNZ R7,mDelay100mS_1
RET
; 執(zhí)行命令
; 輸入命令碼和輸入?yún)?shù)長(zhǎng)度,返回操作狀態(tài)碼,輸入?yún)?shù)和返回參數(shù)都在CMD_PARAM結(jié)構(gòu)中
; 入口: R7 命令碼, R5 參數(shù)長(zhǎng)度, 對(duì)于讀寫(xiě)文件數(shù)據(jù)命令, DPTR 為外部RAM緩沖區(qū)起始地址
; 出口: R7 狀態(tài)碼, 對(duì)于讀寫(xiě)文件數(shù)據(jù)命令, DPTR 為數(shù)據(jù)終止地址
; 使用: R0, R4, R5, R6, R7
ExecCommand: MOV R6,DPH ;對(duì)于讀寫(xiě)文件數(shù)據(jù)命令,保存外部RAM緩沖區(qū)起始地址
MOV R4,DPL
MOV DPTR,#CH375HM_INDEX
CLR A
MOVX @DPTR,A ;索引地址為0
MOV DPTR,#CH375HM_DATA
MOV A,R7
MOVX @DPTR,A ;向索引地址0寫(xiě)入命令碼
; MOV DPTR,#CH375HM_DATA
MOV A,R5
MOVX @DPTR,A ;向索引地址1寫(xiě)入后續(xù)參數(shù)的長(zhǎng)度
JZ ExecCommand_W0 ;沒(méi)有參數(shù)
MOV R0,#mCmdParam; ;指向輸入?yún)?shù)的起始地址
; MOV DPTR,#CH375HM_DATA
ExecCommand_WP: MOV A,@R0
MOVX @DPTR,A ;從索引地址2開(kāi)始,寫(xiě)入?yún)?shù)
INC R0
DJNZ R5,ExecCommand_WP
ExecCommand_W0: CLR CH375HM_STA ;產(chǎn)生下降沿通知模塊,說(shuō)明命令包已經(jīng)寫(xiě)入,請(qǐng)求開(kāi)始執(zhí)行命令
ExecCommand_Wait:
JB CH375HM_INT,$ ;等待模塊完成操作產(chǎn)生低電平中斷,并返回操作狀態(tài)
;最佳檢測(cè)方式是對(duì)模塊的INT#信號(hào)進(jìn)行下降沿邊沿檢測(cè)
MOV DPTR,#CH375HM_INDEX
MOV A,#03FH
MOVX @DPTR,A ;寫(xiě)入索引地址63
MOV DPTR,#CH375HM_DATA
MOVX A,@DPTR ;從索引地址63讀取中斷狀態(tài)
MOV R7,A ;操作狀態(tài)碼
SETB CH375HM_STA ;中斷應(yīng)答,取消來(lái)自模塊的中斷請(qǐng)求
;因?yàn)槟K在收到中斷應(yīng)答后3uS之內(nèi)才撤消中斷請(qǐng)求,所以,如果是查詢INT#信號(hào)的低電平,那么在發(fā)出中斷應(yīng)答后3uS之內(nèi)不應(yīng)該再查詢INT#信號(hào)的狀態(tài)
;但是由于51單片機(jī)較慢,下面的處理時(shí)間已經(jīng)超過(guò)3uS,所以不必另加延時(shí)等待模塊撤消中斷請(qǐng)求
CJNE R7,#ERR_SUCCESS,ExecCommand_J0 ;不是操作成功的狀態(tài)碼
MOV DPTR,#CH375HM_INDEX ;操作成功
MOV A,#01H
MOVX @DPTR,A ;索引地址為1
MOV DPTR,#CH375HM_DATA
MOVX A,@DPTR ;從索引地址1讀取返回結(jié)果數(shù)據(jù)的長(zhǎng)度
MOV R7,A
JZ ExecCommand_R0 ;沒(méi)有結(jié)果數(shù)據(jù)
MOV R0,#mCmdParam; ;指向輸出參數(shù)的起始地址
MOV R5,#02H ;從索引地址2開(kāi)始,讀取結(jié)果
ExecCommand_RP: MOV DPTR,#CH375HM_INDEX
MOV A,R5
MOVX @DPTR,A ;索引地址
INC R5
MOV DPTR,#CH375HM_DATA
MOVX A,@DPTR
MOV @R0,A
INC R0
DJNZ R7,ExecCommand_RP
ExecCommand_R0: LJMP ExecCommand_Ret
ExecCommand_J0: CJNE R7,#USB_INT_DISK_READ,ExecCommand_J1
MOV R5,#00H ;正在從U盤(pán)讀數(shù)據(jù)塊,請(qǐng)求數(shù)據(jù)讀出
MOV R7,#040H ;一次讀取64個(gè)字節(jié)
MOV P2,#HIGH (CH375HM_DATA)
MOV R0,#LOW (CH375HM_DATA)
MOV DPH,R6
MOV DPL,R4 ;緩沖區(qū)地址
RD_SEC_BYTE: PUSH DPH
PUSH DPL
MOV DPTR,#CH375HM_INDEX
MOV A,R5
MOVX @DPTR,A ;索引地址
POP DPL
POP DPH
MOVX A,@R0 ;依次輸入64字節(jié)的數(shù)據(jù)
INC R5
MOVX @DPTR,A ;讀取的數(shù)據(jù)保存到外部緩沖區(qū)
INC DPTR
DJNZ R7,RD_SEC_BYTE ;從索引地址0到63依次讀出64字節(jié)的數(shù)據(jù)
MOV P2,#0FFH
MOV R6,DPH
MOV R4,DPL
CLR CH375HM_STA ;產(chǎn)生下降沿通知模塊繼續(xù),說(shuō)明64字節(jié)數(shù)據(jù)已經(jīng)讀取完成
LJMP ExecCommand_Wait
ExecCommand_J1: CJNE R7,#USB_INT_DISK_WRITE,ExecCommand_J2
MOV DPTR,#CH375HM_INDEX ;正在向U盤(pán)寫(xiě)數(shù)據(jù)塊,請(qǐng)求數(shù)據(jù)寫(xiě)入
CLR A
MOVX @DPTR,A ;索引地址為0
MOV R7,#040H ;一次寫(xiě)入64個(gè)字節(jié)
MOV P2,#HIGH (CH375HM_DATA)
MOV R0,#LOW (CH375HM_DATA)
MOV DPH,R6
MOV DPL,R4 ;緩沖區(qū)地址
WR_SEC_BYTE: MOVX A,@DPTR ;寫(xiě)入的數(shù)據(jù)來(lái)自外部緩沖區(qū)
INC DPTR
MOVX @R0,A ;依次輸出64字節(jié)的數(shù)據(jù)
DJNZ R7,WR_SEC_BYTE ;向索引地址0到63依次寫(xiě)入64字節(jié)的數(shù)據(jù)
MOV P2,#0FFH
MOV R6,DPH
MOV R4,DPL
CLR CH375HM_STA ;產(chǎn)生下降沿通知模塊繼續(xù),說(shuō)明64字節(jié)數(shù)據(jù)已經(jīng)寫(xiě)入完成
LJMP ExecCommand_Wait
ExecCommand_J2: CJNE R7,#USB_INT_DISK_RETRY,ExecCommand_J3
MOV DPTR,#CH375HM_INDEX ;讀寫(xiě)數(shù)據(jù)塊失敗重試,應(yīng)該向回修改緩沖區(qū)指針
CLR A
MOVX @DPTR,A ;索引地址為0
MOV DPTR,#CH375HM_DATA
MOVX A,@DPTR ;大端模式下為回改指針字節(jié)數(shù)的高8位,如果是小端模式那么接收到的是回改指針字節(jié)數(shù)的低8位
MOV R7,A
MOV DPTR,#CH375HM_INDEX
MOV A,#01H
MOVX @DPTR,A ;索引地址為1
MOV DPTR,#CH375HM_DATA
MOVX A,@DPTR ;大端模式下為回改指針字節(jié)數(shù)的低8位,如果是小端模式那么接收到的是回改指針字節(jié)數(shù)的高8位
CLR C
XCH A,R4
SUBB A,R4
MOV R4,A ;這是大端模式下的回改指針
MOV A,R6
SUBB A,R7
MOV R6,A
CLR CH375HM_STA ;產(chǎn)生下降沿通知模塊繼續(xù),說(shuō)明重試狀態(tài)碼已經(jīng)處理完成
LJMP ExecCommand_Wait
ExecCommand_J3: ;R7為操作完成狀態(tài),操作出現(xiàn)錯(cuò)誤
NOP ;等待模塊將INT#引腳恢復(fù)為高電平,撤消中斷
NOP
ExecCommand_Ret:
; JNB CH375HM_INT,$ ;等待模塊的中斷撤消
MOV DPH,R6 ;對(duì)于讀寫(xiě)文件數(shù)據(jù)命令
MOV DPL,R4 ;從DPTR返回新的緩沖區(qū)地址
RET
; END OF ExecCommand
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -