AT24C512中數(shù)據(jù)文件的系統(tǒng)化管理
. 公用子程序:
RD24C:把DPTR所指的AT24C512單元內(nèi)容讀出,放到(R1,R0)所指的RAM單元,R6為數(shù)據(jù)長度
WR24C:把(R1,R0)所指的RAM單元內(nèi)容寫入DPTR所指的AT24C512單元,R6為數(shù)據(jù)長度
WR_ONE:把DPTR所指的RAM單元內(nèi)容寫入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系統(tǒng)格式化:把目錄區(qū)和頁面分配區(qū)初始化為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
為方便操作,每次開機(jī)把目錄區(qū)和頁面分配區(qū)的內(nèi)容讀入到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=需要的頁數(shù)
MOV DPTR, #AT_FAT AGE_NO為空閑頁數(shù)計(jì)數(shù)
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為頁面分配表的結(jié)束地址
YBSAVE3: LCALL ERRDSP ;顯示錯誤信息
RET
YBSAVE4: MOV R7, #0
YBSAVE5: MOV DPTR, #YB_BEG ; YB_BEG為目錄區(qū)開始地址
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 ;已經(jīng)存滿
YBSAVE6: CLR IE.7
PUSH 7 ;保存找到的空閑目錄區(qū)序號
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 ;找到第一個空閑頁,把地址保護(hù)起來
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 ;如果只需要一頁,則頁面分配表修改結(jié)束
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,表示文件分配結(jié)束
LCALL WR_ONE
YBSAVE13: POP 0
POP 1
POP 0
POP 1 ;R1R0=DPTR=找到的第一個空閑頁
POP ACC ;ACC=R7=空閑目錄區(qū)序號
PUSH ACC
MOV DPTR, #YB_BEG+8
MOV B, #10
LCALL TZDPTR ;確定目錄空閑區(qū)地址
MOV A, R1
評論