📄 ch375hf4.inc
字号:
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
#endif
#ifndef NO_DEFAULT_DELAY_100US
; 在应用程序中定义NO_DEFAULT_DELAY_100US可以禁止默认的延时100uS子程序,然后用自行编写的程序代替它 */
PUBLIC xDelay100uS ; 外部定义的被CH375程序库调用的子程序,延时100uS */
; 延时100uS
xDelay100uS: MOV R7,#150
xDelay100uS_1: DJNZ R7,xDelay100uS_1 ; 延时100uS,2x333nS@36MHz&12T */
RET
#endif
;
#ifdef EN_DISK_WRITE
#ifndef NO_DEFAULT_DELAY_WRITE
; 在应用程序中定义NO_DEFAULT_DELAY_WRITE可以禁止默认的写操作后延时程序,然后用自行编写的程序代替它 */
PUBLIC xDelayAfterWrite ; 外部定义的被CH375程序库调用的子程序,写操作后延时 */
; 写操作后延时
xDelayAfterWrite: MOV R7,#250
xDelayAfterWrite_1: DJNZ R7,xDelayAfterWrite_1 ; 延时200uS左右 */
RET
#endif
#endif
;
#ifndef NO_DEFAULT_FILE_ENUMER
; 在应用程序中定义NO_DEFAULT_FILE_ENUMER可以禁止默认的文件名枚举回调程序,然后用自行编写的程序代替它 */
PUBLIC xFileNameEnumer ; 外部定义的被CH375程序库调用的子程序,文件名枚举回调子程序 */
; 文件名枚举回调子程序
; 如果指定枚举序号CH375vFileSize为0xFFFFFFFF后调用FileOpen,那么每搜索到一个文件FileOpen都会调用本回调程序,
; 回调程序xFileNameEnumer返回后,FileOpen递减CH375vFileSize并继续枚举直到搜索不到文件或者目录。建议做法是,
; 在调用FileOpen之前定义一个全局变量为0,当FileOpen回调本程序后,本程序由CH375vFdtOffset得到结构FAT_DIR_INFO,
; 分析结构中的DIR_Attr以及DIR_Name判断是否为所需文件名或者目录名,记录相关信息,并将全局变量计数增量,
; 当FileOpen返回后,判断返回值如果是ERR_MISS_FILE或ERR_FOUND_NAME都视为操作成功,全局变量为搜索到的有效文件数。
; 如果在本回调程序xFileNameEnumer中将CH375vFileSize置为1,那么可以通知FileOpen提前结束搜索。以下是回调程序例子
xFileNameEnumer: MOV A,pDISK_BASE_BUF+1 ; 参考CH375HF6.H中的程序
#if 0
ADD A,CH375vFdtOffset+1
MOV DPL,A
MOV R7,A
MOV A,pDISK_BASE_BUF
ADDC A,CH375vFdtOffset ; 当前FDT的起始地址
MOV DPH,A ; DPTR指向文件名,pFileDir -> DIR_Name[0]
MOV R6,A
MOVX A,@DPTR
MOV R4,A ; 文件名首字符
INC DPTR
MOVX A,@DPTR
MOV R5,A ; 文件名次字符
; ......
MOV A,R7
ADD A,#11
MOV DPL,A
MOV A,R6
ADDC A,#0
MOV DPH,A ; DPTR指向文件属性,pFileDir -> DIR_Attr
MOVX A,@DPTR
; JB ACC.4,是目录
; JNB ACC.4,是文件
#endif
RET
#endif
;
#ifdef EXT_BLK_INTERFACE
#ifdef FILE_DATA_BUF_LEN
PUBLIC _xWriteToExtBuf ; 外部定义的被CH375程序库调用的子程序,从CH375读取文件数据到外部缓冲区 */
; 该子程序由CH375的子程序库调用,用于从CH375读取文件数据到外部缓冲区,被CH375FileRead调用 */
_xWriteToExtBuf: RET ;如果文件读写的数据的复制方式不是"外部子程序",则不会调用该子程序
;
#ifdef EN_DISK_WRITE
PUBLIC _xReadFromExtBuf ; 外部定义的被CH375程序库调用的子程序,从外部缓冲区读取文件数据到CH375 */
; 该子程序由CH375的子程序库调用,用于从外部缓冲区读取文件数据到CH375,被CH375FileWrite调用 */
_xReadFromExtBuf: RET ;如果文件读写的数据的复制方式不是"外部子程序",则不会调用该子程序
#endif
#endif
#endif
;
; ********************************************************************************************************************* */
; 供主程序调用的子程序
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程序库配置值
LCALL CH375GetVer ; 获取当前子程序库的版本号
MOV A,R7
CLR C
SUBB A,#CH375_LIB_VER
JNC CH375LibInit_GOON
MOV R7,#0FFH ; 当前子程序库的版本号太低则返回错误
RET
CH375LibInit_GOON:
#ifdef DISK_BASE_BUF_LEN
MOV pDISK_BASE_BUF,#HIGH DISK_BASE_BUF ; 指向外部RAM的磁盘数据缓冲区
MOV pDISK_BASE_BUF+1,#LOW DISK_BASE_BUF
#endif
LCALL CH375Init ; 初始化CH375
RET
;
; ********************************************************************************************************************* */
; 以下被CH375程序库用到的子程序,来自C51的程序库C51S.LIB
; 如果没有下面这些子程序(将其注释掉), 那么链接方法是: LX51 CH375HFT.OBJ , CH375HF6.LIB, C51S.LIB
; 如果有下面这些子程序, 那么链接方法是: LX51 CH375HFT.OBJ , CH375HF6.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 + -