AT93C46汇编读写示例程序
扫描二维码
随时随地手机看文章
AT93C46汇编读写示例程序;说明:软件包仅适用于93C468位存储器结构状态,软件包可嵌入到80C51ROM中任一空间。
;fosc=12MHz
;----------------------------------------------------------
R31EQU1FH
CSEQUP1.0;片选端
SKEQUP1.1;模拟时钟信号输出端
DIEQUP1.2;串行数据输出端
DOEQUP1.3;串行数据输入端
;----------------------------------------------------------
ORG0000H
JMPMAIN
ORG0100H
MAIN:
MOVR0,#7FH
CLRA
MOV@R0,A
DJNZR0,$-2
MOVSP,#60H
MAIN1:
MOVR0,#30H
MOVR7,#16
MOVA,#1
MOV@R0,A
INCR0
INCA
DJNZR7,$-3
CALLEWNE;擦写允许
MOVA,#01100000B;地址"11xxxxx"
CALLINADR;输出地址
CALLEWNE;片擦除(将整个存储器置为"1")
MOVA,#01000000B;片擦除地址
CALLINADREW;输出地址
CALLDLY10ms
CALLRD16;读指定地址单元的数据
CALLWRITE;将数据写入指定地址单元
CALLERASE;擦除(将指定地址单元置为"1")
MOVA,#01H;地址
CALLINADREW;输出地址
CALLDLY10ms
CALLRD16;读
CALLEWNE;擦/写禁止
MOVA,#0;地址"00xxxxx"
CALLINADR;输出地址
JMPMAIN1
;==========================================================
;----------------------------------------------------------
;将存在80C51内RAM30H为首地址的16字节数据依次写入93C46首址00H的EEPROM
;注意:93C46上电复位后,芯片处于写保护状态,所以在擦写操作前,应开启"写允许".
;否则无法写入数据.
WRITE:
MOVA,#01100000B;地址"11xxxxx"
CALLINADR;输出地址
MOVR0,#30H;置源数据区首址
MOVR1,#00H;置93C46写入单元首址
MOVR7,#16;字节数
CALLWRIT6
RET
;----------------------------------------------------------
;将AT93C46首址为00H的16字节数据读出并存入80C51以30H为首址的内RAM中
RD16:MOVR0,#20H;置数据存储区首址
MOVA,#00H;置93C46读出单元首地址
MOVR7,#16;字节数送R7
LCALLSTATRD;启动读
LCALLINADR;输出93C46读出单元首址
RD160:
LCALLREAD;读出一个字节数据
MOV@R0,A;存一个字节数据
INCR0;指向下一存储单元地址
DJNZR7,RD160;判16字节数据读完否?未完继续
CLRCS;16字节数据读完,置93C46低功耗备用状态
CALLDLY10ms;延时10ms,以便进行芯片的其它功能操作
RET
;----------------------------------------------------------
;入口:数据区首址在R0,93C46单元地址在R1,写入的字节数在R7中
WRIT6:
LCALLSTATWR;启动写
MOVA,R1;置93C46写入单元地址
LCALLINADR;输出93C46写入地址单元
MOVA,@R0;读写入数据
LCALLWRIT;写入一个字节
LCALLDLY1ms;延时1ms
INCR0;指向8051下一个数据地址
INCR1;指向93C46下一个写入单元地址
DJNZR7,WR61;判6字节数据写完否?未完继续
CLRCS;93C46进入备用状态,降低功耗
CALLDLY10ms
RET
WR61:JBDO,WRIT6;判REDAY/BUSY,DO=1,写入下一字节
SJMPWR61;DO=0,转等待
;==========================================================
;启动读子程序
;说明: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:
MOVR2,#7;置写入地址位数(存储单元8位结构时,地址为7位)
RLCA;先左移一位,地址移至D7~D1,D0无效
IR1:CLRSK;时钟置低
RLCA;左移一位
MOVDI,C;存入DI端口
SETBSK;时钟上升沿输出至93C46DI端
DJNZR2,IR1;判断7位地址写完否,未完继续
RET
;----------------------------------------------------------
;输出擦单元地址子程序
INADREW:
CALLINADR
CLRCS
NOP
SETBCS
JNBDO,$;DO=0,表示编程正在进行;
;DO=1,表示该指定地址的寄存器单元已擦完,可以执行下一条指令。
RET
;----------------------------------------------------------
;读一个字节子程序
;出口:8位数据存在A中
;----------------------------------------------------------
READ:CLRSK;时钟置低
MOVR2,#8;置读入位数8
RD1:SETBSK;时钟上升沿读入一位数据
NOP
MOVC,DO;存入Cy
RLCA;左移入A中
CLRSK;时钟置低
DJNZR2,RD1;判8位数据读完否?未完继续
RET
;----------------------------------------------------------
;确良写一个字节子程序
;入口:写入数据须事先存入A中.
;若需写入多个字节数据,须在1ms后,93C46DO端出现高电平后才能重新启动写入.
;----------------------------------------------------------
WRIT:
MOVR2,#8;置写入位数8
WR1:CLRSK;时钟置低
RLCA;A中数据移一位至Cy中
MOVDI,C;数据传送至DI端
nop
SETBSK;时钟上升沿输出至93C46
DJNZR2,WR1;判8位数据写完否?未完继续
CLRCS;8位数据写完,CS下降沿启动93C46擦写
SETBCS;CS次高位,以使DO端REDAY/BUSY状态位号有效
RET
;----------------------------------------------------------
DLY1ms:;延时1ms子程序
MOVR31,#29;
L2:PUSHR31
L3:DJNZR31,L3
POPR31
DJNZR31,L2
RET
DLY10ms:;延时10ms子程序
MOVR31,#100
L20:PUSHR31
L30:DJNZR31,L30
POPR31
DJNZR31,L20
RET
;==========================================================
END