AT24C512中数据文件的系统化管理

2009年08月18日 13:08    lqm1111
关键词: AT24C512

文件系统程序源代码如下:

. 公用子程序:

RD24C:把DPTR所指的AT24C512单元内容读出,放到(R1,R0)所指的RAM单元,R6为数据长度

WR24C:把(R1,R0)所指的RAM单元内容写入DPTR所指的AT24C512单元,R6为数据长度

WR_ONE:把DPTR所指的RAM单元内容写入DPTR所指的AT24C512单元

 

TZDPTR:       MUL       AB                DPTR=DPTR+A*B

ADD       A,    DPL

                     MOV      DPL,       A

                     MOV      A,    DPH

                     ADDC    A,    B

                     MOV      DPH,      A

                     RET

 

AT24C512系统格式化:把目录区和页面分配区初始化为0EEEEH

AT_INIT: MOV      DPTR,    #AT24C

MOV      R7,  #80H

              MOV      A,    #0EEH

ATINIT1:MOVX    @DPTR, A

              INC        DPTR

              DJNZ      R7,  ATINIT1

              MOV      R7,  #54

ATINIT2:MOV      DPTR,    #AT24C

              MOV      R1,  DPH

              MOV      R0,  DPL

              MOV      R6,  #80H

              MOV      A,    R7

              MOV      B,    #80H

              MOV      DPTR,    #0

              LCALL   TZDPTR

              PUSH     7

              LCALL   WR24C

              POP        7

              DJNZ      R7,  ATINIT2

              RET

 

为方便操作,每次开机把目录区和页面分配区的内容读入到RAM的相同地址中,程序如下:

R_HEAD:CLR       IE.7

              MOV      R5,  #0

RHEAD1:MOV     A,    R5

              MOV      B,    #80H

              MOV      DPTR,    #0

              LCALL   TZDPTR

              MOV      R1,  DPH

              MOV      R0,  DPL

              MOV      R6,  #80H

PUSH     5

              LCALL   RD24C

              POP        5

              INC        R5

              CJNE      R5,  #54, RHEAD1

              SETB      IE.7

              RET

 

添加文件程序如下:

YB_SAVE:     MOV      PAGE_NO,#0               AGES=需要的页数

                     MOV      DPTR,    #AT_FAT        AGE_NO为空闲页数计数

YBSAVE1:     MOVX    A,    @DPTR                ; AT_FAT 为页面分配表开始地址

                     CJNE      A,    #0EEH,   YBSAVE2

                     INC        PAGE_NO

YBSAVE2:     INC        DPTR

                     INC        DPTR

                     MOV      A,    PAGE_NO

                     CLR        C

                     SUBB     A,    PAGES

                     JZ           YBSAVE4

                     MOV      A,    DPH

                     CJNE      A,    #1BH,     YBSAVE1      ;1B00H为页面分配表的结束地址

YBSAVE3:     LCALL   ERRDSP                      ;显示错误信息

                     RET

 

YBSAVE4:     MOV      R7,  #0

YBSAVE5:     MOV      DPTR,    #YB_BEG             ; YB_BEG为目录区开始地址

                     MOV      A,    R7

                     MOV      B,    #10

                     LCALL   TZDPTR

       MOVX    A,    @DPTR

              CJNE      A,    #0EEH,   YBSAVE16

              SJMP      YBSAVE6

YBSAVE16:   INC        R7

              CJNE      R7,  #153,      YBSAVE5      ;最多可存153个文件

              SJMP      YBSAVE3                           ;已经存满

      

YBSAVE6:     CLR        IE.7

PUSH     7                          ;保存找到的空闲目录区序号

LCALL   DO_DSP               ;显示“正在存储”

       MOV      DPTR,    #AT_FAT

YBSAVE7:     MOVX    A,    @DPTR

                     CJNE      A,    #0EEH,   YBSAVE8

       SJMP      YBSAVE9

YBSAVE8:     INC        DPTR

       INC        DPTR

       SJMP      YBSAVE7

YBSAVE9:     PUSH     DPH              ;找到第一个空闲页,把地址保护起来

       PUSH     DPL

       MOV      R1,  DPH

       MOV      R0,  DPL

       MOV      A,    #0FFH

       MOVX    @DPTR, A

       INC        DPTR

       MOVX    @DPTR, A     ;暂时把它看做是文件的最后一页

       PUSH     DPH

       PUSH     DPL

       PUSH     0

       PUSH     1

       LCALL   WR_ONE

       POP        1

       POP        0

       POP        DPL

       POP        DPH

       INC        DPTR

      

                     MOV      R7,  PAGES

       DEC       R7

       MOV      A,    R7

       JZ           YBSAVE13    ;如果只需要一页,则页面分配表修改结束

YBSAVE10:   MOVX    A,    @DPTR

       CJNE      A,    #0EEH,   YBSAVE11

       PUSH     DPH

       PUSH     DPL

       MOV      DPH,      R1          R1R0为前一页的页面分配表地址

       MOV      DPL,       R0

       POP        0

       POP        1

       MOV      A,    R1

       MOVX    @DPTR, A

       INC        DPTR

       MOV      A,    R0

       MOVX    @DPTR, A            ;新地址写入前一页的地址单元

       PUSH     0

       PUSH     1

       PUSH     7

       LCALL   WR_ONE              ;把修改信息写入AT24C512

       POP        7

       POP        1

       POP        0

       MOV      DPH,      R1

       MOV      DPL,       R0

       INC        DPTR

       INC        DPTR

       SJMP      YBSAVE12

YBSAVE11:   INC        DPTR

       INC        DPTR

YBSAVE12:   DJNZ      R7,  YBSAVE10

       MOV      DPH,      R1

       MOV      DPL,       R0

       MOV      A,    #0FFH

       MOVX    @DPTR, A

       INC        DPTR

       MOVX    @DPTR, A     ;写入0FFFFH,表示文件分配结束

       LCALL   WR_ONE

YBSAVE13:   POP        0

                     POP        1

      

       POP        0

       POP        1            R1R0=DPTR=找到的第一个空闲页

POP        ACC       ACC=R7=空闲目录区序号

       PUSH     ACC

MOV      DPTR,    #YB_BEG+8

       MOV      B,    #10

       LCALL   TZDPTR        ;确定目录空闲区地址

       MOV      A R1

欢迎分享本文,转载请保留出处:http://www.eechina.com/thread-2971-1-1.html     【打印本页】
您需要登录后才可以发表评论 登录 | 立即注册

相关文章

厂商推荐


关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备11013910号 | 京公网安备11010502021702
回顶部