📄 shf1.asm
字号:
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 + -