?? ch375hf4.inc
字號:
#ifdef CH375HF_NO_CODE
EXTRN IDATA (mCmdParam) ; 命令參數 */
EXTRN XDATA (CH375_CMD_PORT) ; CH375命令端口的I/O地址 */
EXTRN XDATA (CH375_DAT_PORT) ; CH375數據端口的I/O地址 */
EXTRN XDATA (DISK_BASE_BUF) ; 外部RAM的磁盤數據緩沖區,緩沖區長度為一個扇區的長度 */
#ifdef FILE_DATA_BUF_LEN
EXTRN XDATA (FILE_DATA_BUF) ; 外部RAM的文件數據緩沖區,緩沖區長度不小于一次讀寫的數據長度 */
EXTRN CODE (CH375FileRead) ; 從當前文件讀取數據 */
#ifdef EN_DISK_WRITE
EXTRN CODE (CH375FileWrite) ; 向當前文件寫入數據 */
#endif
#endif
EXTRN CODE (xQueryInterrupt) ; 外部定義的被CH375程序庫調用的子程序,查詢CH375中斷并更新中斷狀態 */
EXTRN CODE (CH375LibInit) ; 初始化CH375程序庫和CH375芯片
#else
; ********************************************************************************************************************* */
; 外部定義的被CH375程序庫調用的變量
PUBLIC mCmdParam ; 命令參數 */
PUBLIC CH375_CMD_PORT ; CH375命令端口的I/O地址 */
PUBLIC CH375_DAT_PORT ; CH375數據端口的I/O地址 */
PUBLIC DISK_BASE_BUF ; 外部RAM的磁盤數據緩沖區,緩沖區長度為一個扇區的長度 */
#ifdef FILE_DATA_BUF_LEN
PUBLIC FILE_DATA_BUF ; 外部RAM的文件數據緩沖區,緩沖區長度不小于一次讀寫的數據長度 */
PUBLIC CH375FileRead ; 從當前文件讀取數據 */
#ifdef EN_DISK_WRITE
PUBLIC CH375FileWrite ; 向當前文件寫入數據 */
#endif
#endif
; ********************************************************************************************************************* */
; 變量定義
RSEG CH375LIB_IDATA
mCmdParam: DS MAX_PATH_LEN ; 命令參數 */
XSEG AT CH375_CMD_PORT_ADDR
CH375_CMD_PORT: DS 1 ; CH375命令端口的I/O地址 */
XSEG AT CH375_DAT_PORT_ADDR
CH375_DAT_PORT: DS 1 ; CH375數據端口的I/O地址 */
XSEG AT DISK_BASE_BUF_ADDR
DISK_BASE_BUF: DS 512 ; 外部RAM的磁盤數據緩沖區,緩沖區長度為一個扇區的長度 */
#ifdef FILE_DATA_BUF_LEN
XSEG AT FILE_DATA_BUF_ADDR
FILE_DATA_BUF: DS FILE_DATA_BUF_LEN ; 外部RAM的文件數據緩沖區,緩沖區長度不小于一次讀寫的數據長度 */
#endif
; ********************************************************************************************************************* */
; 外部定義的被CH375程序庫調用的子程序
PUBLIC xQueryInterrupt ; 外部定義的被CH375程序庫調用的子程序,查詢CH375中斷并更新中斷狀態 */
PUBLIC _xWriteToExtBuf ; 外部定義的被CH375程序庫調用的子程序,從CH375讀取文件數據到外部緩沖區 */
#ifdef EN_DISK_WRITE
PUBLIC _xReadFromExtBuf ; 外部定義的被CH375程序庫調用的子程序,從外部緩沖區讀取文件數據到CH375 */
#endif
; ********************************************************************************************************************* */
; 默認的被CH375程序庫調用的子程序定義
; 以下程序可以根據需要修改, 相關詳細內容可以參考C程序頭文件CH375HF4.H
RSEG CH375LIB_CODE
#ifdef FILE_DATA_BUF_LEN
; 從當前文件讀取數據
CH375FileRead: MOV R0,#mCmdParam+8 ;mCmdParam.ReadX.mDataBuffer
MOV @R0,#HIGH FILE_DATA_BUF ;指向文件數據緩沖區
INC R0
MOV @R0,#LOW FILE_DATA_BUF
JMP CH375FileReadX
#ifdef EN_DISK_WRITE
; 向當前文件寫入數據
CH375FileWrite: MOV R0,#mCmdParam+8 ;mCmdParam.WriteX.mDataBuffer
MOV @R0,#HIGH FILE_DATA_BUF ;指向文件數據緩沖區
INC R0
MOV @R0,#LOW FILE_DATA_BUF
JMP CH375FileWriteX
#endif
#endif
;
; CH375中斷服務程序,由CH375的INT#的低電平或者下降沿觸發單片機中斷
;xQueryInterrupt: MOV A,CH375IntStatus ; 該子程序用于"中斷方式",查詢中斷狀態,等待硬件中斷
; JZ xQueryInterrupt ; 子程序庫調用該子程序之前CH375IntStatus=0,硬件中斷后,由中斷服務程序置為非0的實際中斷狀態后返回
; RET
InterruptHandle: PUSH PSW ; 中斷服務程序,如果使用"中斷方式",請在中斷向量處執行一個跳轉到此
PUSH ACC
PUSH DPL
PUSH DPH
CALL xQueryInterrupt_1
POP DPH
POP DPL
POP ACC
POP PSW
RETI
; 查詢CH375中斷并更新中斷狀態
xQueryInterrupt: JB CH375_INT_WIRE,$ ; 該子程序用于"查詢方式",查詢CH375的INT#引腳,如果CH375的中斷引腳輸出高電平則等待
xQueryInterrupt_1: MOV DPTR,#CH375_CMD_PORT
MOV A,#CMD_GET_STATUS
MOVX @DPTR,A ; 獲取當前中斷狀態 */
INC DPTR
INC DPTR ; 操作無意義,用于至少延時2uS */
INC DPTR
MOV DPTR,#CH375_DAT_PORT
MOVX A,@DPTR ; 獲取中斷狀態 */
MOV CH375IntStatus,A
CJNE A,#ERR_USB_DISCON,QUERY_INT_DISCON
MOV CH375DiskStatus,#DISK_DISCONNECT ; 檢測到USB設備斷開事件 */
RET
QUERY_INT_DISCON: CJNE A,#ERR_USB_CONNECT,QUERY_INT_CONNECT
MOV CH375DiskStatus,#DISK_CONNECT ; 檢測到USB設備連接事件 */
RET
QUERY_INT_CONNECT: RET
;
; 該子程序由CH375的子程序庫調用,用于從CH375讀取文件數據到外部緩沖區,被CH375FileRead調用 */
_xWriteToExtBuf: RET ;如果文件讀寫的數據的復制方式不是"外部子程序",則不會調用該子程序
;
; 該子程序由CH375的子程序庫調用,用于從外部緩沖區讀取文件數據到CH375,被CH375FileWrite調用 */
_xReadFromExtBuf: RET ;如果文件讀寫的數據的復制方式不是"外部子程序",則不會調用該子程序
;
; ********************************************************************************************************************* */
; 供主程序調用的子程序
PUBLIC CH375LibInit
; 初始化CH375程序庫和CH375芯片, 操作完成后返回狀態碼在R7中, 操作成功返回0
CH375LibInit: MOV A,SP
SETB C
SUBB A,#0F0H ; CH375子程序庫最多可能有7級子程序,查詢方式最多需要14字節的堆棧空間,建議提供余量
JC CH375LibInit_SP ; 單片機的堆棧空間不夠
MOV R7,#0FCH ; 當前子程序庫的版本號太低則返回錯誤
RET
CH375LibInit_SP: MOV CH375LibConfig,#LIB_CFG_VALUE ; CH375程序庫配置值
MOV DPTR,#DISK_BASE_BUF
MOVX A,@DPTR ; 該操作無意義,只是為了防止編譯器優化時不產生DISK_BASE_BUF緩沖區
LCALL CH375GetVer ; 獲取當前子程序庫的版本號
MOV A,R7
CLR C
SUBB A,#CH375_LIB_VER
JNC CH375LibInit_GOON
MOV R7,#0FFH ; 當前子程序庫的版本號太低則返回錯誤
RET
CH375LibInit_GOON: LCALL CH375Init ; 初始化CH375
RET
;
; ********************************************************************************************************************* */
; 以下被CH375程序庫用到的子程序,來自C51的程序庫C51S.LIB
; 如果沒有下面這些子程序(將其注釋掉), 那么鏈接方法是: LX51 CH375HFT.OBJ , CH375HF4.LIB, C51S.LIB
; 如果有下面這些子程序, 那么鏈接方法是: LX51 CH375HFT.OBJ , CH375HF4.LIB
; 建議, 如果應用程序也用到C51S.LIB中的子程序, 那么將下面這些內容注釋掉, 防止鏈接時出現同名沖突
PUBLIC ?C?ULCMP
?C?ULCMP: MOV A,R3
SUBB A,R7
MOV B,A
MOV A,R2
SUBB A,R6
ORL B,A
MOV A,R1
SUBB A,R5
ORL B,A
MOV A,R0
SUBB A,R4
ORL A,B
RET
PUBLIC ?C?ULSHR
?C?ULSHR: MOV A,R0
JZ ?C?ULSHR_RET
?C?ULSHR_LOOP: MOV A,R4
CLR C
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
DJNZ R0,?C?ULSHR_LOOP
?C?ULSHR_RET: RET
PUBLIC ?C?LSHL
?C?LSHL: MOV A,R0
JZ ?C?LSHL_RET
?C?LSHL_LOOP: MOV A,R7
CLR C
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
DJNZ R0,?C?LSHL_LOOP
?C?LSHL_RET: RET
PUBLIC ?C?LLDIDATA
?C?LLDIDATA: MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
RET
PUBLIC ?C?LLDIDATA0
?C?LLDIDATA0: MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R1,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
XCH A,R3
MOV R0,A
RET
PUBLIC ?C?LSTIDATA
?C?LSTIDATA: MOV A,R4
MOV @R0,A
INC R0
MOV A,R5
MOV @R0,A
INC R0
MOV A,R6
MOV @R0,A
INC R0
MOV A,R7
MOV @R0,A
RET
PUBLIC ?C?LSTXDATA
?C?LSTXDATA: MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
INC DPTR
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
RET
PUBLIC ?C?LSTKIDATA
?C?LSTKIDATA: POP DPH
POP DPL
CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,#01H
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,#02H
MOVC A,@A+DPTR
MOV @R0,A
INC R0
MOV A,#03H
MOVC A,@A+DPTR
MOV @R0,A
MOV A,#04H
JMP @A+DPTR
; 以上是被CH375程序庫用到的子程序,來自C51的程序庫C51S.LIB,如果去掉這些子程序,那么鏈接時要加上C51S.LIB
;
#endif
;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -