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

📄 28f640test.asm

📁 用51单片机控制flash28f640的程序
💻 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 + -