文件系统程序源代码如下:
关键字:AT24C512 数据文件 系统化管理
引用地址: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 ;R1,R0为前一页的页面分配表地址
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
上一篇:NAND FLASH扇区管理
下一篇:利用基于闪存的MCU实现用户数据存储
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
厂商技术中心