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

📄 shf1.asm

📁 usb接口和msc51通信
💻 ASM
📖 第 1 页 / 共 5 页
字号:
               mov      r7,#067h
               lcall    execcommand
               lcall    mstopiferror
               setb     led_out
               ret
;*****************************************
sshijian:      mov      r3,#10
               mov      dptr,#801eh               ;把8155数据倒入30h-31h
               mov      r0,#30h
ssjloop1:      movx     a,@dptr
               mov      @r0,a
               inc      dptr
               inc      r0
               djnz     r3,ssjloop1
               mov      r0,#5dh
               mov      @r0,#5fh                ;把"-"送到u盘
               mov      r0,#5ah
               mov      @r0,#5fh
               mov      r0,#57h
               mov      @r0,#20h
               mov      r0,#54h
               mov      @r0,#3ah
               mov      r0,#51h
               mov      @r0,#20h
               mov      r0,#50h
               mov      @r0,#0ah
               mov      r0,#30h                ;年58h,59h
               mov      r1,#5fh
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#31h
               mov      r1,#5eh
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#32h
               mov      r1,#5ch
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#33h
               mov      r1,#5bh
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#34h
               mov      r1,#59h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#35h
               mov      r1,#58h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#36h
               mov      r1,#56h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#37h
               mov      r1,#55h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#38h
               mov      r1,#53h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r0,#39h
               mov      r1,#52h
               mov      a,@r0
               add      a,#30h
               mov      @r1,a
               mov      r3,#15
               mov      r0,#41h
               mov      r1,#5fh
ssjloop2:      mov      a,@r1
               mov      @r0,a
               inc      r0
               dec      r1
               djnz     r3,ssjloop2
               MOV       mCmdParam,#15
               MOV       R5,#16
               MOV       R7,#07CH
               LCALL     ExecCommand2  ;向文件写入年-月-日数据,
               LCALL     mStopIfError
               mov       r0,#41h
               mov        @r0,#5fh
               mov        r0,#42h
               mov        @r0,#5fh
               mov        r0,#43h
               mov        @r0,#5fh
               mov        mcmdparam,#3
               mov        r5,#4
               mov        r7,#07ch
               lcall      execcommand2
               lcall      mstopiferror
	       ret
;*****************************************
hexascii:                 ;把r0,r0-1指向的数据转化后放r2指向的地址
hexasc3:            mov    a,@r0
                    anl    a,#0fh
                    add    a,#90h
                    da     a
                    addc   a,#40h
                    da     a
                    mov    @r1,a
                    inc    r1
                    mov    a,@r0
                    swap   a
                    anl    a,#0fh
                    add    a,#90h
                    da     a
                    addc   a,#40h
                    da     a
                    mov    @r1,a
                    inc    r1
                    dec    r0              ;hex-ascii低字节先转换
                    djnz   r2,hexasc3
                    ret
;*****************************************
dakaiu:         MOV		DPTR,#STR_FILE_NAME1
		MOV		R0,#mCmdParam		;Open.mPathName
		LCALL	CopyString			;复制文件名
		MOV		A,R7
		MOV		R5,A				;参数长度为文件名长度
		MOV      R7,#064H
                ;	MOV		R7,#CMD_FileOpen	;打开文件
		LCALL	ExecCommand			;执行打开文件操作
	;	MOV     A,R7
              ;  XRL     A,#042H
		;	XRL     A,#ERR_MISS_FILE
;		JZ      FILE_NOT_FOUND		;ERR_MISS_FILE说明没有找到文件
		LCALL	mStopIfError
                MOV     40H,#0FFH
                MOV     41H,#0FFH
                MOV     42H,#0FFH
                MOV     43H,#0FFH
		;	MOV     mCmdParam+0,#0FFH	;Locate.mSectorOffset
		;	MOV     mCmdParam+1,#0FFH	;Locate.mSectorOffset
		;	MOV     mCmdParam+2,#0FFH	;Locate.mSectorOffset
		;	MOV     mCmdParam+3,#0FFH	;Locate.mSectorOffset
		MOV		R5,#04H				;参数长度
		MOV      R7,#06AH
                ;	MOV		R7,#CMD_FileLocate	;移动文件指针
		LCALL	ExecCommand			;指向文件末尾
		LCALL	mStopIfError
                ret
;*****************************************
CopyString:		MOV		R7,#00H
CopyStringChar:	MOV		A,R7
				INC		R7
				MOVC	A,@A+DPTR
				MOV		@R0,A
				INC		R0
				JNZ		CopyStringChar		;不是字符串结束符00H,继续复制
				RET
;****************************************
ExecCommand:                    MOV     R6,DPH                           ;对于读写文件数据命令,保存縍RAM缓冲区起始地址
                                MOV     R4,DPL
                                MOV  	DPTR,#CH375HM_INDEX
				CLR  	A
				MOVX 	@DPTR,A				;索引地址为0
				MOV  	DPTR,#CH375HM_DATA
				MOV  	A,R7
				MOVX 	@DPTR,A				;向索引地址0写入命令码
				MOV  	DPTR,#CH375HM_DATA
				MOV  	A,R5
				MOVX 	@DPTR,A				;向索引地址1写入后续参数的长度
				JZ      ExecCommand_W0		;没有参数
				MOV     R0,#mCmdParam		;指向输入参数的起始地址
				MOV  	DPTR,#CH375HM_DATA
ExecCommand_WP:	                MOV		A,@R0
				MOVX	@DPTR,A				;从索引地址2开始,写入参数
				INC     R0
				DJNZ    R5,ExecCommand_WP
ExecCommand_W0: 	        CLR  	CH375HM_STA			;产生下降沿通知模块,说明命令包已经写入,请求开始执行命令
				CLR  	CH375HM_STA			;仅作延时,低电平宽度不小于1uS
				CLR  	CH375HM_STA
				SETB 	CH375HM_STA
ExecCommand_Wait:             ;  lcall   time
                                 ;lcall   time
                                 jb      CH375HM_INT,$
;最佳检测方式是对模块的INT#信号进行下降沿边沿检测
				MOV  	DPTR,#CH375HM_INDEX
				MOV  	A,#03FH
				MOVX 	@DPTR,A				;写入索引地址63
				MOV  	DPTR,#CH375HM_DATA
				MOVX 	A,@DPTR				;从索引地址63读取中断状态
				MOV	R7,A				;操作状态码
				MOV  	DPTR,#CH375HM_INDEX
				CLR  	A
				MOVX 	@DPTR,A				;索引地址为0,中断应答
				MOV  	DPTR,#CH375HM_DATA
				CLR		A
				MOVX 	@DPTR,A				;向索引地址0写入无效命令码0,取消中断请求
;因为模块在收到中断应答后5uS之内才撤消中断请求,所以,如果是查询INT#信号的低电平,那么在发出中断应答后5uS之内不应该再查询INT#信号的状态
;但是由于51单片机较慢,下面的处理时间已经超过5uS,所以不必另加延时等待模块撤消中断请求
                                CJNE    R7,#000H,ExecCommand_J0 ;不是操作成功的状态码
				MOV  	DPTR,#CH375HM_DATA	;操作成功
				MOVX 	A,@DPTR				;从索引地址1读取返回结果数据的长度
				MOV  	R5,A
				JZ      ExecCommand_R0		;没有结果数据
				MOV     R0,#mCmdParam		;指向输出参数的起始地址
				MOV  	DPTR,#CH375HM_DATA
ExecCommand_RP:	MOVX	A,@DPTR				;从索引地址2开始,读取结果
				MOV		@R0,A
				INC		R0
				DJNZ 	R5,ExecCommand_RP
ExecCommand_R0:	LJMP	ExecCommand_Ret
ExecCommand_J0: CJNE    R7,#01dh,ExecCommand_J1
				MOV  	DPTR,#CH375HM_INDEX	;正在从U盘读数据块,请求数据读出
				CLR		A
				MOVX 	@DPTR,A				;索引地址为0
				MOV  	R7,#040H			;一次读取64个字节
				MOV     R5,P2				;保存原P2
				MOV  	P2,#HIGH(CH375HM_DATA)
				MOV  	R0,#LOW(CH375HM_DATA)
                                MOV     DPH,R6
                                MOV     DPL,R4
			;缓冲区地址
RD_SEC_BYTE:	MOVX    A,@R0				;依次输入64字节的数据
				MOVX    @DPTR,A				;读取的数据保存到外部缓冲区
				INC     DPTR
				DJNZ    R7,RD_SEC_BYTE		;从索引地址0到63依次读出64字节的数据
				MOV     P2,R5
			        MOV     R6,DPH
                                MOV     R4,DPL
				MOV  	DPTR,#CH375HM_INDEX
				CLR		A
				MOVX 	@DPTR,A				;索引地址为0
				MOV  	DPTR,#CH375HM_DATA
				MOV  	A,#0FFH
				MOVX 	@DPTR,A				;向索引地址0写入无效命令码0FFH,说明64字节数据已经读取完成
				LJMP    ExecCommand_Wait
ExecCommand_J1:	CJNE    R7,#01eh,ExecCommand_J2
				MOV  	DPTR,#CH375HM_INDEX	;正在向U盘写数据块,请求数据写入
				CLR		A
				MOVX 	@DPTR,A				;索引地址为0
				MOV  	R7,#040H			;一次写入64个字节
				MOV     R5,P2				;保存原P2
				MOV  	P2,#HIGH(CH375HM_DATA)
				MOV  	R0,#LOW(CH375HM_DATA)
                                MOV     DPH,R6
                                MOV     DPL,R4
	;缓冲区地址
WR_SEC_BYTE:              	MOVX    A,@DPTR				;写入的数据来自外部缓冲区
				INC     DPTR
				MOVX    @R0,A				;依次输出64字节的数据
				DJNZ    R7,WR_SEC_BYTE		;向索引地址0到63依次写入64字节的数据
				MOV     P2,R5
				MOV     R6,DPH
                                MOV     R4,DPL
				CLR		CH375HM_STA			;产生下降沿通知模块,说明64字节数据已经写入完成
				CLR		CH375HM_STA			;仅作延时,低电平宽度不小于1uS
				CLR		CH375HM_STA
				SETB	CH375HM_STA
				NOP							;对于状态USB_INT_DISK_WRITE,模块是在检测到STA#引脚的下降沿后5uS内撤消中断
				NOP							;等待模块将INT#引脚恢复为高电平,撤消中断
				NOP							;如果本机的单片机时钟超过25MHz,那么应该再加延时
				NOP
				NOP
				LJMP	ExecCommand_Wait
ExecCommand_J2:								;R7为操作完成状态,操作出现错误
				NOP							;等待模块将INT#引脚恢复为高电平,撤消中断
				NOP
ExecCommand_Ret:           
                                JNB             CH375HM_INT,$           ;等待模块的中断撤消
				MOV     DPH,R6
                                MOV     DPL,r4
                                RET
;******************************************
mStopIfError:	                MOV		A,R7
				JNZ		mStopIfError_LED	;状态码是错误
				RET
mStopIfError_LED:							;LED闪烁
				CLR		A
				MOV		C,LED_OUT
				MOV		ACC.0,C
				XRL		A,#01H
				MOV		C,ACC.0
				MOV		LED_OUT,C
				LCALL	mDelay100mS
                                ljmp    main0
;******************************************
ExecCommand1:
                                MOV  	DPTR,#CH375HM_INDEX
				CLR  	A
				MOVX 	@DPTR,A				;索引地址为0
				MOV  	DPTR,#CH375HM_DATA
				MOV  	A,R7
				MOVX 	@DPTR,A				;向索引地址0写入命令码
				MOV  	DPTR,#CH375HM_DATA
				MOV  	A,R5
				MOVX 	@DPTR,A				;向索引地址1写入后续参数的长度
				JZ      ExecCommand_W01		;没有参数
				MOV     R0,#mCmdParam		;指向输入参数的起始地址
				MOV  	DPTR,#CH375HM_DATA
ExecCommand_WP1:                MOV             A,@R0
				MOVX	@DPTR,A				;从索引地址2开始,写入参数
				INC     R0
				DJNZ    R5,ExecCommand_WP1
ExecCommand_W01: 	        CLR  	CH375HM_STA			;产生下降沿通知模块,说明命令包已经写入,请求开始执行命令
				CLR  	CH375HM_STA			;仅作延时,低电平宽度不小于1uS
				CLR  	CH375HM_STA
				SETB 	CH375HM_STA
ExecCommand_Wait1:

                                 lcall   dell
  ;                               lcall   dell
 ;                                lcall   dell
;                                 lcall   dell
                             ;    jb      CH375HM_INT,$
;最佳检测方式是对模块的INT#信号进行下降沿边沿检测
				MOV  	DPTR,#CH375HM_INDEX
				MOV  	A,#03FH
				MOVX 	@DPTR,A				;写入索引地址63
				MOV  	DPTR,#CH375HM_DATA
				MOVX 	A,@DPTR				;从索引地址63读取中断状态
				MOV	R7,A				;操作状态码
				MOV  	DPTR,#CH375HM_INDEX
				CLR  	A
				MOVX 	@DPTR,A				;索引地址为0,中断应答
				MOV  	DPTR,#CH375HM_DATA
				CLR		A
				MOVX 	@DPTR,A				;向索引地址0写入无效命令码0,取消中断请求
                                      
;JNB             CH375HM_INT,$           ;等待模块的中断撤消
                                lcall   dell
                                RET
;*******************************************
execcommand2:  mov      dptr,#ch375hm_index
               clr      a
               movx     @dptr,a
               mov      dptr,#ch375hm_data
               mov      a,r7
               movx     @dptr,a
               mov      dptr,#ch375hm_data
               mov      a,r5
               movx     @dptr,a
               jz       execcommand_w02
               mov      r0,#mcmdparam
               mov      dptr,#ch375hm_data

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -