⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch375hf4.inc

📁 STC89C55+STA013+CH375设计读U盘(已经通过)/硬盘(还没调试
💻 INC
📖 第 1 页 / 共 3 页
字号:
#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 + -