AT93C46的匯編讀寫軟件程序
掃描二維碼
隨時隨地手機看文章
;*==========================================================================*
;名稱:AT93C46的匯編讀寫軟件包
;文件名:93C46_8.ASM
;程序模塊已通過硬件仿真調(diào)試,方便實用.
;*==========================================================================*
;說明:軟件包僅適用于93C468位存儲器結(jié)構(gòu)狀態(tài),軟件包可嵌入到80C51ROM中任一空間。
;fosc=12MHz
;----------------------------------------------------------
R31EQU1FH
CSEQUP1.0;片選端
SKEQUP1.1;模擬時鐘信號輸出端
DIEQUP1.2;串行數(shù)據(jù)輸出端
DOEQUP1.3;串行數(shù)據(jù)輸入端
;----------------------------------------------------------
ORG0000H
JMPMAIN
ORG0100H
MAIN:
MOV R0,#7FH
CLRA
MOV @R0,A
DJNZR0,$-2
MOV SP,#60H
MAIN1:
MOV R0,#30H
MOV R7,#16
MOV A,#1
MOV @R0,A
INCR0
INCA
DJNZR7,$-3
CALLEWNE;擦寫允許
MOV A,#01100000B;地址"11xxxxx"
CALLINADR;輸出地址
CALLEWNE;片擦除(將整個存儲器置為"1")
MOV A,#01000000B;片擦除地址
CALLINADREW;輸出地址
CALLDLY10ms
CALLRD16;讀指定地址單元的數(shù)據(jù)
CALLWRITE;將數(shù)據(jù)寫入指定地址單元
CALLERASE;擦除(將指定地址單元置為"1")
MOV A,#01H;地址
CALLINADREW;輸出地址
CALLDLY10ms
CALLRD16;讀
CALLEWNE;擦/寫禁止
MOV A,#0;地址"00xxxxx"
CALLINADR;輸出地址
JMPMAIN1
;==========================================================
;----------------------------------------------------------
;將存在80C51內(nèi)RAM30H為首地址的16字節(jié)數(shù)據(jù)依次寫入93C46首址00H的EEPROM
;注意:93C46上電復(fù)位后,芯片處于寫保護(hù)狀態(tài),所以在擦寫操作前,應(yīng)開啟"寫允許".
;否則無法寫入數(shù)據(jù).
WRITE:
MOV A,#01100000B;地址"11xxxxx"
CALLINADR;輸出地址
MOV R0,#30H;置源數(shù)據(jù)區(qū)首址
MOV R1,#00H;置93C46寫入單元首址
MOV R7,#16;字節(jié)數(shù)
CALLWRIT6
RET
;----------------------------------------------------------
;將AT93C46首址為00H的16字節(jié)數(shù)據(jù)讀出并存入80C51以30H為首址的內(nèi)RAM中
RD16: MOV R0,#20H;置數(shù)據(jù)存儲區(qū)首址
MOV A,#00H;置93C46讀出單元首地址
MOV R7,#16;字節(jié)數(shù)送R7
LCALLSTATRD;啟動讀
LCALLINADR;輸出93C46讀出單元首址
RD160:
LCALLREAD;讀出一個字節(jié)數(shù)據(jù)
MOV @R0,A;存一個字節(jié)數(shù)據(jù)
INCR0;指向下一存儲單元地址
DJNZR7,RD160;判16字節(jié)數(shù)據(jù)讀完否?未完繼續(xù)
CLRCS;16字節(jié)數(shù)據(jù)讀完,置93C46低功耗備用狀態(tài)
CALLDLY10ms;延時10ms,以便進(jìn)行芯片的其它功能操作
RET
;----------------------------------------------------------
;入口:數(shù)據(jù)區(qū)首址在R0,93C46單元地址在R1,寫入的字節(jié)數(shù)在R7中
WRIT6:
LCALLSTATWR;啟動寫
MOV A,R1;置93C46寫入單元地址
LCALLINADR;輸出93C46寫入地址單元
MOV A,@R0;讀寫入數(shù)據(jù)
LCALLWRIT;寫入一個字節(jié)
LCALLDLY1ms;延時1ms
INCR0;指向8051下一個數(shù)據(jù)地址
INCR1;指向93C46下一個寫入單元地址
DJNZR7,WR61;判6字節(jié)數(shù)據(jù)寫完否?未完繼續(xù)
CLRCS;93C46進(jìn)入備用狀態(tài),降低功耗
CALLDLY10ms
RET
WR61:JBDO,WRIT6;判REDAY/BUSY,DO=1,寫入下一字節(jié)
SJMPWR61;DO=0,轉(zhuǎn)等待
;==========================================================
;啟動讀子程序
;說明:STATRD子程序輸出啟動和讀操作代碼"110"
;----------------------------------------------------------
STATRD:
CLRCS;片選置低
CLRSK;時鐘置低
SETBCS
SETBDI;置啟動"1"
SETBSK;時鐘上升沿輸出啟動信號"1"
CLRSK
SETBSK;時鐘上升沿輸出"1"
CLRSK
CLRDI;置輸出"0"
SETBSK;時鐘上升沿輸出"0"
CLRSK;時鐘置低
RET
;----------------------------------------------------------
;啟動寫子程序
;說明:STATWR子程序輸出啟動和寫操作代碼"101"
;----------------------------------------------------------
STATWR:
CLRCS;片選置低
CLRSK;時鐘置低
SETBCS;置片選
SETBDI;置啟動"1"
SETBSK;時鐘上升沿輸出啟動信號"1"
CLRSK
CLRDI;置輸出"0"
SETBSK;時鐘上升沿輸出"0"
CLRSK
SETBDI;置輸出"1"
SETBSK;時鐘上升沿輸出"1"
CLRSK;時鐘置低
RET
;----------------------------------------------------------
;擦寫允許/禁止啟動和操作代碼"100"
;該子程序可用于:擦寫允許(EWEN)、寫禁止(EWDS)、片寫(WRAL)、片擦除(ERAL),
;只是各自的地址不同而也.
;擦寫允許/禁止操作代碼"100",地址"11xxxxx"/"00xxxxx"
;----------------------------------------------------------
EWNE:
CLRCS;片選置低
CLRSK;時鐘置低
SETBCS;置片選
SETBDI;置啟動"1"
SETBSK;時鐘上升沿輸出啟動信號"1"
CLRSK
CLRDI;置輸出"0"
SETBSK;時鐘上升沿輸出"0"
CLRSK
CLRDI;置輸出"0"
SETBSK;時鐘上升沿輸出"1"
CLRSK;時鐘置低
RET
;----------------------------------------------------------
;擦指令ERASE啟動和操作代碼"111"
;----------------------------------------------------------
ERASE:
CLRCS;片選置低
CLRSK;時鐘置低
SETBCS;置片選
SETBDI;置啟動"1"
SETBSK;時鐘上升沿輸出啟動信號"1"
CLRSK
SETBDI;置輸出"1"
SETBSK;時鐘上升沿輸出"0"
CLRSK
SETBDI;置輸出"1"
SETBSK;時鐘上升沿輸出"1"
CLRSK;時鐘置低
RET
;----------------------------------------------------------
;輸出讀寫單元地址子程序
;入口:7位地址已存在A中D6~D0
;----------------------------------------------------------
INADR:
MOV R2,#7;置寫入地址位數(shù)(存儲單元8位結(jié)構(gòu)時,地址為7位)
RLCA;先左移一位,地址移至D7~D1,D0無效
IR1:CLRSK;時鐘置低
RLCA;左移一位
MOV DI,C;存入DI端口
SETBSK;時鐘上升沿輸出至93C46DI端
DJNZR2,IR1;判斷7位地址寫完否,未完繼續(xù)
RET
;----------------------------------------------------------
;輸出擦單元地址子程序
INADREW:
CALLINADR
CLRCS
NOP
SETBCS
JNBDO,$;DO=0,表示編程正在進(jìn)行;
;DO=1,表示該指定地址的寄存器單元已擦完,可以執(zhí)行下一條指令。
RET
;----------------------------------------------------------
;讀一個字節(jié)子程序
;出口:8位數(shù)據(jù)存在A中
;----------------------------------------------------------
READ:CLRSK;時鐘置低
MOV R2,#8;置讀入位數(shù)8
RD1:SETBSK;時鐘上升沿讀入一位數(shù)據(jù)
NOP
MOV C,DO;存入Cy
RLCA;左移入A中
CLRSK;時鐘置低
DJNZR2,RD1;判8位數(shù)據(jù)讀完否?未完繼續(xù)
RET
;----------------------------------------------------------
;確良寫一個字節(jié)子程序
;入口:寫入數(shù)據(jù)須事先存入A中.
;若需寫入多個字節(jié)數(shù)據(jù),須在1ms后,93C46DO端出現(xiàn)高電平后才能重新啟動寫入.
;----------------------------------------------------------
WRIT:
MOV R2,#8;置寫入位數(shù)8
WR1:CLRSK;時鐘置低
RLCA;A中數(shù)據(jù)移一位至Cy中
MOV DI,C;數(shù)據(jù)傳送至DI端
nop
SETBSK;時鐘上升沿輸出至93C46
DJNZR2,WR1;判8位數(shù)據(jù)寫完否?未完繼續(xù)
CLRCS;8位數(shù)據(jù)寫完,CS下降沿啟動93C46擦寫
SETBCS;CS次高位,以使DO端REDAY/BUSY狀態(tài)位號有效
RET
;----------------------------------------------------------
DLY1ms:;延時1ms子程序
MOV R31,#29;
L2:PUSHR31
L3:DJNZR31,L3
POPR31
DJNZR31,L2
RET
DLY10ms:;延時10ms子程序
MOV R31,#100
L20:PUSHR31
L30:DJNZR31,L30
POPR31
DJNZR31,L20
RET
;==========================================================
END