当前位置:首页 > 单片机 > 单片机
[导读] ;============================================================================;*************************Fiel=AT93CXX.ASM******************************;模块包含:READ(读),WRITE(写),WRAL(片写

;============================================================================
;*************************Fiel=AT93CXX.ASM******************************


;模块包含:READ(读),WRITE(写),WRAL(片写),ERASE(擦除),ERAL(片擦除),
;EWEN(擦写允许),EWDS(擦写禁止).
;此模块适用于:AT93C46/56/57/66EEPROM芯片,8位(ORG=0)或16位(ORG=1)的读、写、
;擦除等操作。
;8位或16操作,只需置标志位SIZE为"0"或为"1"和设置NADDR的位即可,非常方便实用。
;此程序模块已通过硬件仿真调试。
;============================================================================
;
;93C4693C5693C5793C66
;----------------------------------------------------------------------------
;Databits:816816816816
;Addressbits:76988798
;----------------------------------------------------------------------------

NADDREQU7;8-bitdata,地址为7位
;NADDREQU6;16-bitdata,地址为6位


SIZEEQUF0;0=8-bitdata,1=16-bitdata标志位

DATA_LOEQU2AH;数据低字节
DATA_HIEQU2BH;数据高字节
ADDR_LOEQU2CH;地址低字节
ADDR_HIEQU2DH;地址高字节

DATA01EQU30H;数据缓存区首址

CSBITP1.0;AT93Cxx片选端
SKBITP1.1;时钟信号输入端
DIBITP1.2;串行数据输入端
DOBITP1.3;串行数据输出端

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:
MOV SP,#(STACK-1)

CLRCS;LOW
CLRSK;LOW
SETBDI;HIGH
SETBDO;HIGH

CLRSIZE;SPECIFY8-BITDATA
;SETBSIZE;SPECIFY16-BITDATA

JBSIZE,DATA16;SIZE=1时,为16-bit操作
AJMPDATA8
;==========================================================
;8-bitByte(SIZE/ORG=0)程序操作演示

DATA8:
CALLByte_read;读出数据,以便观察

CALLEWEN;擦写允许

MOV ADDR_LO,#0;地址
MOV DATA_LO,#33H;数据
CALLWRITE;指定地址写

CALLByte_read

CALLERAL;片擦除(全部单元置"1")

CALLByte_read

;8-bit片写,将芯存储器全部写入55H的数据

;CALLEWDS;擦写禁止

MOV DATA_LO,#55H;片写数据(片写之前最好片擦除)
CALLWRAL;片写

AJMPDATA8
;==========================================================
;==========================================================
;16-bitWord(SIZE/ORG=1)程序操作演示

DATA16:
CALLWord_read;读8个单元数据,观察

CALLEWEN;擦写允许

CALLERAL;片擦除(全部单元置"1")

CALLWord_read

MOV ADDR_LO,#0;向指定地址写数据
MOV DATA_LO,#55H;DATA,数据低字节
MOV DATA_HI,#0AAH;DATA,数据高字节
CALLWRITE;指定地址写

CALLWord_read

;将芯片存储器全部写入0AAH(高)和55H(低)的数据

MOV DATA_LO,#55H;DATA
MOV DATA_HI,#0AAH;DATA
CALLWRAL;

CALLWord_read

;CALLEWDS;擦写禁止

;将指定单元的内容擦除(置为"1")
MOV ADDR_LO,#0;
CALLERASE;将指定单元(00H01H)擦为"1"

AJMPDATA16
;==========================================================
;读Read(byteifSIZE/ORG=0,wordifSIZE/ORG=1).
Byte_read:
MOV R0,#DATA01;缓存区首址
MOV ADDR_HI,#0
MOV ADDR_LO,#0;指向AT93CXX首址
MOV R7,#8;字节数
READ01:
CALLREAD
MOV A,DATA_LO
MOV @R0,A
INCR0
INCADDR_LO
DJNZR7,READ01
RET
;==========================================================
;读Read(wordifSIZE/ORG=1).低地址为低字节单元,高地址为高字节单元
Word_read:
MOV R0,#DATA01;缓存区首址
MOV ADDR_LO,#0
MOV R7,#8;字节数
WORD01:
CALLREAD;读数据
MOV A,DATA_LO;低字节内容
MOV @R0,A
INCR0
MOV A,DATA_HI;高字节内容
MOV @R0,A
INCR0
INCADDR_LO
DJNZR7,WORD01
RET
;----------------------------------------------------------
;==========================================================
;名称:读指令(READ指令)
;功能:从指定的地址单元中把数据读出
;----------------------------------------------------------
READ:
SETBCS;片选置1
MOV DPL,#110B;起始位和操作码"110"
MOV B,#3
CALLOUTDATA
MOV DPL,ADDR_LO;低字节地址
MOV DPH,ADDR_HI;高字节地址
MOV B,#NADDR;地址位数(8-bitdata,NADDR=7)
CALLOUTDATA;输出读/写单元地址
CALLINDATA
CLRCS
RET
;==========================================================
;名称:写指令(WRITE指令)
;功能:将数据写入到指定的地址单元中
;----------------------------------------------------------
WRITE:
SETBCS;
MOV DPL,#101B;起始位和操作码"101B"
MOV B,#3;位数
CALLOUTDATA;输出数据
MOV DPL,ADDR_LO
MOV DPH,ADDR_HI
MOV B,#NADDR
CALLOUTDATA
MOV DPL,DATA_LO
JBSIZE,EE61;SIZE=0时,8bit;SIZE=1时,16bit;
MOV B,#8
JMPEE62
EE61:
MOV DPH,DATA_HI
MOV B,#16
EE62:
CALLOUTDATA
CLRCS
CALLSTATUS;延时10ms
RET
;==========================================================
;名称:片写指令(WRAL指令)
;功能:将命令中指定的数据写入整个存贮器阵列
;----------------------------------------------------------
WRAL:
SETBCS;片选置1,选中芯片
MOV DPTR,#(10001BSHL(NADDR-2))
MOV B,#(NADDR+3)
CALLOUTDATA
MOV DPL,DATA_LO
JBSIZE,EE71;SIZE=0时,8bit;SIZE=1时,16bit;
MOV B,#8
JMPEE72
EE71:
MOV DPH,DATA_HI
MOV B,#16
EE72:
CALLOUTDATA
CLRCS
CALLSTATUS;延时10ms
RET
;==========================================================
;名称:地址擦指令(ERASE指令)
;功能:将指定地址中所有数据位都为置为"1"
;----------------------------------------------------------
ERASE:
SETBCS
MOV DPTR,#111B;擦除指令操作码"111B"
MOV B,#3
CALLOUTDATA
MOV DPL,ADDR_LO;地址低位
MOV DPH,ADDR_HI;地址高位
MOV B,#NADDR;
CALLOUTDATA
CLRCS
CALLSTATUS;延时10ms
RET
;==========================================================
;名称:片擦指令(ERAL指令),
;功能:将整个存储器阵列置为"1"
;----------------------------------------------------------
ERAL:
SETBCS
MOV DPTR,#(10010BSHL(NADDR-2));左移
;ERAL指令操作码和地址为:10010B
MOV B,#(NADDR+3)
CALLOUTDATA
CLRCS
CALLSTATUS;延时子程序
RET
;==========================================================
;名称:擦/写允许(EWEN指令)
;功能:AT93CXX在上电复位后,芯片处于擦/写不允许状态,
;EWEN指令将芯片置为可编程状态,即可擦/写
;----------------------------------------------------------
EWEN:
SETBCS
MOV DPTR,#(10011BSHL(NADDR-2));将10011B向左移((NADDR-2)位
;EWEN指令:操作码的地址为:10011B
MOV B,#(NADDR+3)
CALLOUTDATA
CLRCS
RET
;==========================================================
;名称:擦/写禁止(EWDS指令)
;功能:使用该指令可对写入的数据进行保护,操作步骤与擦/写允许指令相同.
;----------------------------------------------------------
EWDS:
SETBCS
MOV DPTR,#(10000BSHL(NADDR-2))
MOV B,#(NADDR+3)
CALLOUTDATA
CLRCS
RET
;==========================================================
;延时子程序
;----------------------------------------------------------
STATUS:
PUSHB
SETBDO;FLOATPIN
SETBCS
MOV B,#220;220*50us=11ms
EE40:
PUSHB;2us
MOV B,#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时,8bit;SIZE=1时,16bit
MOV DATA_HI,A;SAVEHIGHBYTE
;SIZE=1时,16bit
CALLSHIN
EE21:;SIZE=0时,8bit
MOV DATA_LO,A;SAVELOWBYTE
RET
;==========================================================
;读一个字节子程序,读回的数据在A中
;----------------------------------------------------------
SHIN:
PUSHB
CLRSK
MOV B,#8
EE30:
SETBSK
NOP
MOV C,DO
RLCA
CLRSK
DJNZB,EE30
POPB
RET
;==========================================================
;向AT93CXX写入地址
;----------------------------------------------------------
OUTDATA:
PUSHB
MOV A,B
CLRC
SUBBA,#8
JCEE6
JZEE5
MOV B,A
CLRC
SUBBA,#8
JCEE2
JNZEE9
MOV A,DPH
JMPEE4
EE2:
PUSHB
MOV A,DPH
EE3:
RRA
DJNZB,EE3
POPB
EE4:
CALLSHOUT
MOV B,#8
EE5:
MOV A,DPL
JMPEE8
EE6:
PUSHB
MOV A,DPL
EE7:
RRA
DJNZB,EE7
POPB
EE8:
CALLSHOUT
EE9:
SETBDO
POPB
RET
;==========================================================
;写一个字节子程序
;入口:写入数据须事先存入A中.
;----------------------------------------------------------
SHOUT:
EE50:
CLRSK
RLCA
MOV DI,C
NOP;DELAYMIN400ns
SETBSK
DJNZB,EE50
CLRSK
RET
;==========================================================
;==========================================================

END

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭