📄 28f640test.asm
字号:
;*********************************************************
;******************28F640 PROGRAMM***********************************
;**********************************************************
;PROGRAMIF EQU 00H ; 指示是否有16字节待编程
BLKERS_IF EQU 01H ; 指示是否有一存储块擦除
FLAG EQU 02H ; 标志
ERASING EQU 03H ;指示块擦除过程是否结束
;SUSPENDED EQU 04H ;指示块擦除过程是否已被挂起
BUFPROFLAG EQU 05H ;
RIGHT_FLAG EQU 06H ;
BUFCONT DATA 30H ;编程缓冲区写长度
BUFSTART DATA 31H ;缓存区首地址
;SAVER4 DATA 14H ;R4,R3,R2
;SAVER3 DATA 13H
;SAVER2 DATA 12H
CLKEN EQU P1.1
CSR_F EQU P1.2
A15_1 EQU P1.0
;******************************MAIN INIT*****************************
MAIN:
MOV SP,#60H
CLR A15_1
CLR CSR_F
SETB BLKERS_IF
JNB BLKERS_IF,SEND
CLR BLKERS_IF
LCALL BLKERS_PRO ;擦除前一个已读完的存储
SEND:
;SETB BUFPROFLAG
;JNB BUFPROFLAG,ENDPRO ;是否要进行缓冲编程
;LCALL WR_BUF
LCALL RD_FLASH
LCALL WR_FLASH
;LCALL WRITE ;已读出的信息首单元清零
MAINLOOP:
NOP
LJMP MAINLOOP
;*****************ERASING PROCEDE*********************************************
BLKERS_PRO:
CLR CLKEN
MOV DPTR,#0100H
MOVX A,@DPTR
SETB CLKEN
MOV DPTR,#0001H
MOV A,#50H
MOVX @DPTR,A
MOV A,#10H ;发布块擦除命令(器件地址)
MOVX @DPTR,A
MOV A,#0D0H ;确认擦除操作(块内地址)
MOVX @DPTR,A
SETB ERASING ;设置正在进行块擦除指示标志
;;CLR CLKEN
;;MOV P2,#05H ;否,发布读SR命令
MOV A,#70H
MOVX @DPTR,A
;;SETB CLKEN
RPT_RD:
MOVX A,@DPTR
;LCALL WR_FLASH ;必要时可挂起擦除,实现编程
;;JNB ERASING,END_ERS ;擦除过程已完成
NOP
NOP
;;JNB ACC.7,RPT_RD ;擦除过程己完成?
CLR ERASING ;清除设置正在进行块擦除指示标志
JNB ACC.5,ERSOK
;CLR ERASING ;清除设置正在进行块擦除指示标志
SETB FLAG
;;LCALL WR_FLASH ;必要时可挂起擦除,实现编程
ERSOK:
;LCALL FULLCHK ;做完全状态检查
MOV A,#0FFH
MOVX @DPTR,A
RET
;********************READ AND WRITE FLASH*******************************************************
WR_FLASH:
;MOV P1,SAVER4
CLR CLKEN
;MOV DPH,A ;the HIGH ADDRESS
;MOVX A,@DPTR
MOV DPTR,#0100H
MOVX A,@DPTR
SETB CLKEN
MOV DPTR,#0080H
MOV A,#50H ;CLEAR RS MARK
MOVX @DPTR,A
;MOV DPH,SAVER3
;MOV DPL,SAVER2
MOV A,#40H
MOVX @DPTR,A
NOP
NOP
NOP
;CLR A ;OR MOV A,R1
MOV A,#04H
MOVX @DPTR,A
MOV A,#70H
MOVX @DPTR,A
;;SETB CLKEN
WRFL_END:
MOVX A,@DPTR
JNB ACC.7,WRFL_END ;WRITE过程己完成?
;MOV R1,A
MOV A,#50H ;CLEAR RS MARK
MOVX @DPTR,A
MOV A,#0FFH ;READ ARRY
MOVX @DPTR,A
;LCALL FULLCHK
RET
;*******************************READ FLASH************************
RD_FLASH:
CLR CLKEN
;MOV P2,#01H ;the HIGH ADDRESS
;MOVX A,@DPTR
MOV DPTR,#0100H
MOVX A,@DPTR
SETB CLKEN
MOV DPTR,#1300H
MOV A,#50H ;CLEAR RS MARK
MOVX @DPTR,A
;MOV DPH,SAVER3
;MOV DPL,SAVER2
;MOV DPTR,#0080H
MOV A,#0FFH
MOVX @DPTR,A
LOOP:
MOVX A,@DPTR
MOV R0,#30H
MOV @R0,A
INC DPTR
INC R0
CJNE R0,#50H,LOOP
MOV A,#70H
MOVX @DPTR,A
REFL_END:
;;SETB CLKEN
MOVX A,@DPTR
JNB ACC.7,REFL_END ;READ过程己完成?
MOV A,#50H ;CLEAR RS MARK
MOVX @DPTR,A
RET
;**************************************************************************
FULLCHK:
MOV A,#70H
MOVX @DPTR,A
MOVX A,@DPTR
JNB ACC.1,FULLCHK
JNB ACC.2,FULLCHK
JNB ACC.3,FULLCHK
JNB ACC.4,FULLCHK
JNB ACC.5,FULLCHK
JNB ACC.6,FULLCHK
SETB RIGHT_FLAG
RET
;***********************READ AND WRITE BUFFER***************************************************
WR_BUF:
MOV TH0,#0A0H ; r7,r6,r5为写地址指针
MOV TL0,#00H
CLR TF0 ;设置Timeout= 16ms
REP_WC:
;;MOV P1,R7 ;发布缓冲区编程命令(块内地址)
CLR CLKEN
MOV DPTR,#0100H
MOVX A,@DPTR
SETB CLKEN
MOV A,#0E8H
MOVX @DPTR,A
MOVX A,@DPTR ;读扩展状态寄存器(XSR)
JB ACC.7,STARTWR ;缓冲区有效.转去编程
;JNB TF0,REP_WC ;否,但Timeout未发生,继续发布命令
;.................. ;发生Timeout,不能进行缓冲区编程
READ_RS:
MOV A,#70H ;发布读sR命夸
MOVX @DPTR,A
SJMP RD_SR
STARTWR:
MOV A,#10H
MOV BUFCONT,A ;设置循环写入次数为16
DEC A
MOVX @DPTR,A ;写入(缓冲区长度一1)
MOV R0,BUFSTART ;指定当前源数据缓存区起始地址
MOV DPH,R6 ;设置当前具体编程目标起始地址
MOV DPL,R5
DO_WR:
MOV A,@R0 ;循环从源读数据,然后写入目标单元地址
MOVX @DPTR,A
INC DPL
INC R0
DJNZ R4,DO_WR
CONFIRM:
MOV A,#0D0H ;确认缓冲区编程
MOVX @DPTR,A
RD_SR:
MOV A,#70H
MOVX @DPTR,A
;;SETB CLKEN
MOVX A,@DPTR ;读SR,检查编程是否结束
JNB ACC.7,RD_SR
;LCALL FULLCHK ;已结束.对结果做完全状态检查
EXITPRO:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -