AT93C46/56/57/66 EEPROM 芯片通用讀寫程序
AT93C46/56/57/66 EEPROM 芯片通用讀寫程序
;模塊包含:READ(讀),WRITE(寫),WRAL(片寫),ERASE(擦除),ERAL(片擦除),
;EWEN(擦寫允許),EWDS(擦寫禁止).
;此模塊適用于:AT93C46/56/57/66EEPROM芯片,8位(ORG=0)或16位(ORG=1)的讀、寫、
;擦除等操作。
;8位或16操作,只需置標(biāo)志位SIZE為"0"或?yàn)?1"和設(shè)置NADDR的位即可,非常方便實(shí)用。
;93C4693C5693C5793C66
;----------------------------------------------------------------------------
;Databits:816816816816
;Addressbits:76988798
;----------------------------------------------------------------------------
NADDREQU7;8-bitdata,地址為7位
;NADDREQU6;16-bitdata,地址為6位
SIZEEQUF0;0=8-bitdata,1=16-bitdata標(biāo)志位
DATA_LOEQU2AH;數(shù)據(jù)低字節(jié)
DATA_HIEQU2BH;數(shù)據(jù)高字節(jié)
ADDR_LOEQU2CH;地址低字節(jié)
ADDR_HIEQU2DH;地址高字節(jié)
DATA01EQU30H;數(shù)據(jù)緩存區(qū)首址
CSBITP1.0;AT93Cxx片選端
SKBITP1.1;時(shí)鐘信號輸入端
DIBITP1.2;串行數(shù)據(jù)輸入端
DOBITP1.3;串行數(shù)據(jù)輸出端
DSEGAT20H
ORG60H;stackorigin
STACK:DS20H;stackdepth
CSEG
ORG0000H;
JMPON_RESET
ORG0003H
reti
ORG000BH
reti
ORG0013H
reti
ORG001BH
reti
ORG0023H
reti
ORG0080H
USING0;選擇工作寄存器0
ON_RESET:
MOVSP,#(STACK-1)
CLRCS;LOW
CLRSK;LOW
SETBDI;HIGH
SETBDO;HIGH
CLRSIZE;SPECIFY8-BITDATA
;SETBSIZE;SPECIFY16-BITDATA
JBSIZE,DATA16;SIZE=1時(shí),為16-bit操作
AJMPDATA8
;==========================================================
;8-bitByte(SIZE/ORG=0)程序操作演示
DATA8:
CALLByte_read;讀出數(shù)據(jù),以便觀察
CALLEWEN;擦寫允許
MOVADDR_LO,#0;地址
MOVDATA_LO,#33H;數(shù)據(jù)
CALLWRITE;指定地址寫
CALLByte_read
CALLERAL;片擦除(全部單元置"1")
CALLByte_read
;8-bit片寫,將芯存儲器全部寫入55H的數(shù)據(jù)
;CALLEWDS;擦寫禁止
MOVDATA_LO,#55H;片寫數(shù)據(jù)(片寫之前最好片擦除)
CALLWRAL;片寫
AJMPDATA8
;==========================================================
;==========================================================
;16-bitWord(SIZE/ORG=1)程序操作演示
DATA16:
CALLWord_read;讀8個(gè)單元數(shù)據(jù),觀察
CALLEWEN;擦寫允許
CALLERAL;片擦除(全部單元置"1")
CALLWord_read
MOVADDR_LO,#0;向指定地址寫數(shù)據(jù)
MOVDATA_LO,#55H;DATA,數(shù)據(jù)低字節(jié)
MOVDATA_HI,#0AAH;DATA,數(shù)據(jù)高字節(jié)
CALLWRITE;指定地址寫
CALLWord_read
;將芯片存儲器全部寫入0AAH(高)和55H(低)的數(shù)據(jù)
MOVDATA_LO,#55H;DATA
MOVDATA_HI,#0AAH;DATA
CALLWRAL;
CALLWord_read
;CALLEWDS;擦寫禁止
;將指定單元的內(nèi)容擦除(置為"1")
MOVADDR_LO,#0;
CALLERASE;將指定單元(00H01H)擦為"1"
AJMPDATA16
;==========================================================
;讀Read(byteifSIZE/ORG=0,wordifSIZE/ORG=1).
Byte_read:
MOVR0,#DATA01;緩存區(qū)首址
MOVADDR_HI,#0
MOVADDR_LO,#0;指向AT93CXX首址
MOVR7,#8;字節(jié)數(shù)
READ01:
CALLREAD
MOVA,DATA_LO
MOV@R0,A
INCR0
INCADDR_LO
DJNZR7,READ01
RET
;==========================================================
;讀Read(wordifSIZE/ORG=1).低地址為低字節(jié)單元,高地址為高字節(jié)單元
Word_read:
MOVR0,#DATA01;緩存區(qū)首址
MOVADDR_LO,#0
MOVR7,#8;字節(jié)數(shù)
WORD01:
CALLREAD;讀數(shù)據(jù)
MOVA,DATA_LO;低字節(jié)內(nèi)容
MOV@R0,A
INCR0
MOVA,DATA_HI;高字節(jié)內(nèi)容
MOV@R0,A
INCR0
INCADDR_LO
DJNZR7,WORD01
RET
;----------------------------------------------------------
;==========================================================
;名稱:讀指令(READ指令)
;功能:從指定的地址單元中把數(shù)據(jù)讀出
;----------------------------------------------------------
READ:
SETBCS;片選置1
MOVDPL,#110B;起始位和操作碼"110"
MOVB,#3
CALLOUTDATA
MOVDPL,ADDR_LO;低字節(jié)地址
MOVDPH,ADDR_HI;高字節(jié)地址
MOVB,#NADDR;地址位數(shù)(8-bitdata,NADDR=7)
CALLOUTDATA;輸出讀/寫單元地址
CALLINDATA
CLRCS
RET
;==========================================================
;名稱:寫指令(WRITE指令)
;功能:將數(shù)據(jù)寫入到指定的地址單元中
;----------------------------------------------------------
WRITE:
SETBCS;
MOVDPL,#101B;起始位和操作碼"101B"
MOVB,#3;位數(shù)
CALLOUTDATA;輸出數(shù)據(jù)
MOVDPL,ADDR_LO
MOVDPH,ADDR_HI
MOVB,#NADDR
CALLOUTDATA
MOVDPL,DATA_LO
JBSIZE,EE61;SIZE=0時(shí),8bit;SIZE=1時(shí),16bit;
MOVB,#8
JMPEE62
EE61:
MOVDPH,DATA_HI
MOVB,#16
EE62:
CALLOUTDATA
CLRCS
CALLSTATUS;延時(shí)10ms
RET
;==========================================================
;名稱:片寫指令(WRAL指令)
;功能:將命令中指定的數(shù)據(jù)寫入整個(gè)存貯器陣列
;----------------------------------------------------------
WRAL:
SETBCS;片選置1,選中芯片
MOVDPTR,#(10001BSHL(NADDR-2))
MOVB,#(NADDR+3)
CALLOUTDATA
MOVDPL,DATA_LO
JBSIZE,EE71;SIZE=0時(shí),8bit;SIZE=1時(shí),16bit;
MOVB,#8
JMPEE72
EE71:
MOVDPH,DATA_HI
MOVB,#16
EE72:
CALLOUTDATA
CLRCS
CALLSTATUS;延時(shí)10ms
RET
;==========================================================
;名稱:地址擦指令(ERASE指令)
;功能:將指定地址中所有數(shù)據(jù)位都為置為"1"
;----------------------------------------------------------
ERASE:
SETBCS
MOVDPTR,#111B;擦除指令操作碼"111B"
MOVB,#3
CALLOUTDATA
MOVDPL,ADDR_LO;地址低位
MOVDPH,ADDR_HI;地址高位
MOVB,#NADDR;
CALLOUTDATA
CLRCS
CALLSTATUS;延時(shí)10ms
RET
;==========================================================
;名稱:片擦指令(ERAL指令),
;功能:將整個(gè)存儲器陣列置為"1"
;----------------------------------------------------------
ERAL:
SETBCS
MOVDPTR,#(10010BSHL(NADDR-2));左移
;ERAL指令操作碼和地址為:10010B
MOVB,#(NADDR+3)
CALLOUTDATA
CLRCS
CALLSTATUS;延時(shí)子程序
RET
;==========================================================
;名稱:擦/寫允許(EWEN指令)
;功能:AT93CXX在上電復(fù)位后,芯片處于擦/寫不允許狀態(tài),
;EWEN指令將芯片置為可編程狀態(tài),即可擦/寫
;----------------------------------------------------------
EWEN:
SETBCS
MOVDPTR,#(10011BSHL(NADDR-2));將10011B向左移((NADDR-2)位
;EWEN指令:操作碼的地址為:10011B
MOVB,#(NADDR+3)
CALLOUTDATA
CLRCS
RET
;==========================================================
;名稱:擦/寫禁止(EWDS指令)
;功能:使用該指令可對寫入的數(shù)據(jù)進(jìn)行保護(hù),操作步驟與擦/寫允許指令相同.
;----------------------------------------------------------
EWDS:
SETBCS
MOVDPTR,#(10000BSHL(NADDR-2))
MOVB,#(NADDR+3)
CALLOUTDATA
CLRCS
RET
;==========================================================
;延時(shí)子程序
;----------------------------------------------------------
STATUS:
PUSHB
SETBDO;FLOATPIN
SETBCS
MOVB,#220;220*50us=11ms
EE40:
PUSHB;2us
MOVB,#22;2us
DJNZB,$;2us*22
POPB;2us
JBDO,EE41
DJNZB,EE40
SETBC
JMPEE42
EE41:
CLRC
EE42:
CLRCS
POPB
RET
;==========================================================
INDATA:
SETBDO
CALLSHIN
JNBSIZE,EE21;SIZE=0時(shí),8bit;SIZE=1時(shí),16bit
MOVDATA_HI,A;SAVEHIGHBYTE
;SIZE=1時(shí),16bit
CALLSHIN
EE21:;SIZE=0時(shí),8bit
MOVDATA_LO,A;SAVELOWBYTE
RET
;==========================================================
;讀一個(gè)字節(jié)子程序,讀回的數(shù)據(jù)在A中
;----------------------------------------------------------
SHIN:
PUSHB
CLRSK
MOVB,#8
EE30:
SETBSK
NOP
MOVC,DO
RLCA
CLRSK
DJNZB,EE30
POPB
RET
;==========================================================
;向AT93CXX寫入地址
;----------------------------------------------------------
OUTDATA:
PUSHB
MOVA,B
CLRC
SUBBA,#8
JCEE6
JZEE5
MOVB,A
CLRC
SUBBA,#8
JCEE2
JNZEE9
MOVA,DPH
JMPEE4
EE2:
PUSHB
MOVA,DPH
EE3:
RRA
DJNZB,EE3
POPB
EE4:
CALLSHOUT
MOVB,#8
EE5:
MOVA,DPL
JMPEE8
EE6:
PUSHB
MOVA,DPL
EE7:
RRA
DJNZB,EE7
POPB
EE8:
CALLSHOUT
EE9:
SETBDO
POPB
RET
;==========================================================
;寫一個(gè)字節(jié)子程序
;入口:寫入數(shù)據(jù)須事先存入A中.
;----------------------------------------------------------
SHOUT:
EE50:
CLRSK
RLCA
MOVDI,C
NOP;DELAYMIN400ns
SETBSK
DJNZB,EE50
CLRSK
RET
;==========================================================
;==========================================================
END