📄 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 + -