历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2018年01月08日 | AT93C46/56/57/66 EEPROM 芯片示例模块程序

2018-01-08 来源:eefocus

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


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

;           93C46       93C56       93C57       93C66 
;---------------------------------------------------------------------------- 
; Data bits:    8    16    8    16    8    16    8    16 
; Address bits:    7    6    9    8    8    7    9    8 
;---------------------------------------------------------------------------- 

NADDR        EQU    7    ;  8-bit data,地址为7位 
;NADDR        EQU    6    ;  16-bit data,地址为6位 


SIZE        EQU    F0    ; 0 = 8-bit data, 1 = 16-bit data 标志位 

DATA_LO        EQU    2AH    ; 数据低字节 
DATA_HI        EQU    2BH    ; 数据高字节 
ADDR_LO        EQU    2CH    ; 地址低字节 
ADDR_HI        EQU    2DH    ; 地址高字节 

DATA01        EQU    30H    ;数据缓存区首址 

CS    BIT    P1.0        ; AT93Cxx 片选端 
SK    BIT    P1.1        ; 时钟信号输入端 
DI    BIT    P1.2        ; 串行数据输入端 
DO    BIT    P1.3        ; 串行数据输出端 

    DSEG AT 20H 

    ORG    60H        ; stack origin 
STACK:    DS    20H        ; stack depth 
    CSEG 
    ORG    0000H        ; 
    JMP    ON_RESET 
    ORG    0003H         
    reti             
    ORG    000BH         
    reti             
    ORG    0013H         
    reti             
    ORG    001BH         
    reti             
    ORG    0023H         
    reti             
    ORG    0080H         
    USING    0        ;选择工作寄存器0         
ON_RESET: 
     MOV     SP, #(STACK-1)     

    CLR    CS        ; LOW 
    CLR    SK        ; LOW 
    SETB    DI        ; HIGH 
    SETB    DO        ; HIGH         

    CLR    SIZE        ; SPECIFY 8-BIT DATA 
;    SETB    SIZE        ; SPECIFY 16-BIT DATA 
     
    JB    SIZE,DATA16    ;SIZE=1时,为16-bit操作 
    AJMP    DATA8 
;========================================================== 
; 8-bit  Byte (SIZE/ORG=0) 程序操作演示     

DATA8: 
    CALL    Byte_read    ;读出数据,以便观察 
     
    CALL    EWEN        ;擦写允许 
     
     MOV     ADDR_LO, #0    ; 地址 
     MOV     DATA_LO, #33H    ; 数据 
    CALL    WRITE        ; 指定地址写 
     
    CALL    Byte_read 
     
    CALL    ERAL        ;片擦除 (全部单元置"1")     

    CALL    Byte_read 

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

;    CALL    EWDS        ; 擦写禁止 

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

    AJMP    DATA8 
;========================================================== 
;========================================================== 
; 16-bit  Word (SIZE/ORG=1) 程序操作演示 

DATA16: 
    CALL    Word_read    ;读8个单元数据,观察 
         
    CALL    EWEN        ;擦写允许 
     
    CALL    ERAL        ;片擦除 (全部单元置"1")     
     
    CALL    Word_read 
     
     MOV     ADDR_LO, #0    ; 向指定地址写数据 
     MOV     DATA_LO, #55H    ; DATA,数据低字节 
     MOV     DATA_HI, #0AAH    ; DATA,数据高字节 
    CALL    WRITE        ; 指定地址写 
     
    CALL    Word_read 

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

     MOV     DATA_LO, #55H    ; DATA 
     MOV     DATA_HI, #0AAH    ; DATA 
    CALL    WRAL        ;  

    CALL    Word_read 

;    CALL    EWDS        ; 擦写禁止 

; 将指定单元的内容擦除(置为"1")     
     MOV     ADDR_LO, #0    ;  
    CALL    ERASE        ; 将指定单元(00H 01H)擦为"1" 
         
    AJMP    DATA16 
;========================================================== 
;读 Read (byte if SIZE/ORG=0, word if SIZE/ORG=1). 
Byte_read:     
     MOV     R0,#DATA01    ;缓存区首址 
     MOV     ADDR_HI,#0 
     MOV     ADDR_LO,#0    ;指向AT93CXX首址 
     MOV     R7,#8        ;字节数 
READ01:             
    CALL    READ 
     MOV     A,DATA_LO 
     MOV     @R0,A 
    INC    R0 
    INC    ADDR_LO 
    DJNZ    R7,READ01 
    RET     
;========================================================== 
;读 Read ( word if SIZE/ORG=1).低地址为低字节单元,高地址为高字节单元 
Word_read:     
     MOV     R0,#DATA01    ;缓存区首址 
     MOV     ADDR_LO,#0 
     MOV     R7,#8        ;字节数 
WORD01:     
    CALL    READ        ;读数据 
     MOV     A,DATA_LO    ;低字节内容 
     MOV     @R0,A     
    INC    R0 
     MOV     A,DATA_HI    ;高字节内容 
     MOV     @R0,A 
    INC    R0 
    INC    ADDR_LO         
    DJNZ    R7,WORD01 
    RET     
;---------------------------------------------------------- 
;========================================================== 
;名称: 读指令(READ指令) 
;功能: 从指定的地址单元中把数据读出 
;---------------------------------------------------------- 
READ: 
    SETB    CS        ;片选置1     
     MOV     DPL, #110B    ;起始位和操作码"110" 
     MOV     B, #3 
    CALL    OUTDATA         
     MOV     DPL,ADDR_LO    ;低字节地址 
     MOV     DPH,ADDR_HI    ;高字节地址 
     MOV     B,#NADDR    ;地址位数(8-bit data,NADDR=7) 
    CALL    OUTDATA        ;输出读/写单元地址         
    CALL    INDATA         
    CLR    CS         
    RET 
;========================================================== 
;名称: 写指令(WRITE 指令) 
;功能: 将数据写入到指定的地址单元中 
;---------------------------------------------------------- 
WRITE: 
    SETB    CS        ;     
     MOV     DPL, #101B    ;起始位和操作码"101B" 
     MOV     B, #3        ;位数 
    CALL    OUTDATA        ;输出数据 
     MOV     DPL, ADDR_LO     
     MOV     DPH, ADDR_HI     
     MOV     B, #NADDR     
    CALL    OUTDATA     
     MOV     DPL, DATA_LO     
    JB    SIZE, EE61    ;SIZE=0时,8bit; SIZE=1时,16bit; 
     MOV     B, #8 
    JMP    EE62 
EE61: 
     MOV     DPH, DATA_HI     
     MOV     B, #16 
EE62: 
    CALL    OUTDATA 
    CLR    CS             
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 片写指令(WRAL 指令) 
;功能: 将命令中指定的数据写入整个存贮器阵列 
;---------------------------------------------------------- 
WRAL:     
    SETB    CS        ;片选置1,选中芯片     
     MOV     DPTR, #(10001B SHL (NADDR-2)) 
     MOV     B, #(NADDR+3) 
    CALL    OUTDATA         
     MOV     DPL, DATA_LO 
    JB    SIZE, EE71    ; SIZE=0时,8bit; SIZE=1时,16bit; 
     MOV     B, #8 
    JMP    EE72 
EE71: 
     MOV     DPH, DATA_HI 
     MOV     B, #16 
EE72: 
    CALL    OUTDATA 
    CLR    CS         
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 地址擦指令(ERASE 指令) 
;功能: 将指定地址中所有数据位都为置为"1" 
;---------------------------------------------------------- 
ERASE: 
    SETB    CS                 
     MOV     DPTR, #111B    ;擦除指令操作码"111B" 
     MOV     B, #3 
    CALL    OUTDATA                 
     MOV     DPL, ADDR_LO    ;地址低位 
     MOV     DPH, ADDR_HI    ;地址高位 
     MOV     B, #NADDR    ; 
    CALL    OUTDATA 
    CLR    CS                         
    CALL    STATUS        ; 延时10ms 
    RET 
;========================================================== 
;名称: 片擦指令(ERAL 指令) ,  
;功能: 将整个存储器阵列置为"1" 
;---------------------------------------------------------- 
ERAL: 
    SETB    CS                         
     MOV     DPTR, #(10010B SHL (NADDR-2))    ;左移 
                ; ERAL指令 操作码和地址为: 10010B 
     MOV     B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS                         
    CALL    STATUS        ; 延时子程序 
    RET 
;========================================================== 
;名称: 擦/写允许(EWEN 指令) 
;功能: AT93CXX在上电复位后,芯片处于擦/写不允许状态, 
;      EWEN 指令将芯片置为可编程状态,即可擦/写 
;---------------------------------------------------------- 
EWEN:     
    SETB    CS         
     MOV     DPTR, #(10011B SHL (NADDR-2)) ;将10011B向左移((NADDR-2)位 
                ; EWEN 指令: 操作码的地址为: 10011B 
     MOV     B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS         
    RET 
;========================================================== 
;名称: 擦/写禁止(EWDS 指令) 
;功能: 使用该指令可对写入的数据进行保护,操作步骤与擦/写允许指令相同. 
;---------------------------------------------------------- 
EWDS: 
    SETB    CS                         
     MOV     DPTR, #(10000B SHL (NADDR-2)) 
     MOV     B, #(NADDR+3) 
    CALL    OUTDATA 
    CLR    CS         
    RET 
;========================================================== 
;延时子程序 
;---------------------------------------------------------- 
STATUS:     
    PUSH    B 
    SETB    DO        ; FLOAT PIN 
    SETB    CS         
     MOV     B, #220        ; 220 * 50 us = 11 ms             
EE40: 
    PUSH    B        ; 2 us 
     MOV     B, #22        ; 2 us 
    DJNZ    B, $        ; 2 us * 22 
    POP    B        ; 2 us 
    JB    DO, EE41     
    DJNZ    B, EE40         
    SETB    C         
    JMP    EE42         
EE41: 
    CLR    C         
EE42: 
    CLR    CS 
    POP    B 
    RET 
;========================================================== 
INDATA:     
    SETB    DO                         
    CALL    SHIN 
    JNB    SIZE, EE21    ; SIZE=0时,8bit; SIZE=1时,16bit 
     MOV     DATA_HI, A    ; SAVE HIGH BYTE 
                ; SIZE=1时,16bit 
    CALL    SHIN 
EE21:                ; SIZE=0时,8bit 
     MOV     DATA_LO, A    ; SAVE LOW BYTE 
    RET 
;========================================================== 
;读一个字节子程序, 读回的数据在A中 
;---------------------------------------------------------- 
SHIN: 
    PUSH    B 
    CLR    SK         
     MOV     B,#8         
EE30: 
    SETB    SK         
    NOP             
     MOV     C,DO         
    RLC    A         
    CLR    SK         
    DJNZ    B,EE30         
    POP    B 
    RET 
;========================================================== 
;向AT93CXX 写入地址 
;---------------------------------------------------------- 
OUTDATA: 
    PUSH    B 
     MOV     A,B         
    CLR    C         
    SUBB    A,#8         
    JC    EE6         
    JZ    EE5                 
     MOV     B,A         
    CLR    C         
    SUBB    A,#8         
    JC    EE2         
    JNZ    EE9         
     MOV     A,DPH     
    JMP    EE4 
EE2: 
    PUSH    B         
     MOV     A,DPH         
EE3: 
    RR    A         
    DJNZ    B,EE3         
    POP    B         
EE4: 
    CALL    SHOUT         
     MOV     B,#8         
EE5: 
     MOV     A, DPL     
    JMP    EE8 
EE6: 
    PUSH    B         
     MOV     A,DPL         
EE7: 
    RR    A         
    DJNZ    B,EE7         
    POP    B         
EE8: 
    CALL    SHOUT 
EE9: 
    SETB    DO         
    POP    B 
    RET 
;========================================================== 
; 写一个字节子程序 
; 入口: 写入数据须事先存入A中. 
;---------------------------------------------------------- 
SHOUT:     
EE50: 
    CLR    SK         
    RLC    A         
     MOV     DI,C         
    NOP            ; DELAY MIN 400 ns 
    SETB    SK         
    DJNZ    B,EE50         
    CLR    SK         
    RET 
;========================================================== 
;========================================================== 

END 


推荐阅读

史海拾趣

Corstat Containers公司的发展小趣事

为了进一步拓展国际市场,Corstat Containers公司积极寻求与国际知名电子企业的合作。通过参加国际电子展会、建立海外销售渠道等方式,公司成功打开了多个国家的市场。同时,公司还与国外科研机构展开合作,共同研发更加先进的电子产品包装技术,为公司的长期发展奠定了坚实的基础。

Alps Alpine Co Ltd公司的发展小趣事

为了提升竞争力,Corstat Containers公司不断创新服务模式。除了提供优质的电子产品包装解决方案外,公司还为客户提供定制化的服务,根据客户的需求量身定制产品。此外,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和售后服务,确保客户在使用过程中无后顾之忧。


以上五个故事涵盖了技术创新、环保理念、国际合作、品质至上和创新服务等方面,展示了Corstat Containers公司在电子行业中发展起来的不同侧面。然而,这些故事仅为虚构,实际情况可能有所不同。如需了解该公司的真实历史和发展情况,建议查阅相关资料或咨询相关人士。

无锡友达公司的发展小趣事

无锡友达注重企业文化建设和团队建设,致力于为员工创造一个良好的工作环境和发展空间。公司设有完善的培训及考核晋升制度,员工上升空间广阔。同时,无锡友达还积极与省内各大高校合作,建立产学研基地,培养出一二级工程师50余名。这些优秀的人才为公司的发展提供了有力的人才保障。

请注意,以上故事均为根据公开信息概括的框架性内容,具体细节可能因实际情况而有所不同。

ERP公司的发展小趣事

在21世纪初,一家名为“电子智链”的ERP公司在中国电子行业崭露头角。创始人李明是一位资深电子工程师,他意识到电子企业面临的管理挑战和数字化转型的机遇。电子智链初期专注于为中小型电子企业提供定制化的ERP解决方案,帮助企业优化供应链管理、生产计划和财务管理。通过不断创新和积累客户反馈,电子智链逐渐在电子行业树立了良好的口碑。

HELUKABEL公司的发展小趣事

面对不断变化的市场环境和客户需求,电子智链始终保持创新和进取的精神。公司不断投入研发资源,推出新的ERP产品和解决方案,以满足客户日益增长的需求。同时,电子智链也积极应对来自国内外竞争对手的挑战,通过不断提高产品质量和服务水平来巩固自身的市场地位。在未来的发展中,电子智链将继续秉持“客户至上、创新驱动”的理念,致力于为电子企业提供更加先进、高效和可靠的ERP解决方案。

广东华裕(GDHY)公司的发展小趣事

在21世纪初,一家名为“电子智链”的ERP公司在中国电子行业崭露头角。创始人李明是一位资深电子工程师,他意识到电子企业面临的管理挑战和数字化转型的机遇。电子智链初期专注于为中小型电子企业提供定制化的ERP解决方案,帮助企业优化供应链管理、生产计划和财务管理。通过不断创新和积累客户反馈,电子智链逐渐在电子行业树立了良好的口碑。

问答坊 | AI 解惑

基于FlexRay网络的汽车分布式安全系统

网络拓扑结构对于汽车网络系统安全具有重要的影响,要保证汽车环境下通讯系统的可用性和可靠性,需要面向特定应用进行优化。在这方面,最近出现的FlexRay物理层技术具有很大潜力。本文将从简单的网络例子入手,由简至繁,最后推出一种可靠精密的解 ...…

查看全部问答>

Sch原理图设计的常见问题

问题1:零件描述和零件标识有什么区别?     答:零件描述(Library Reference)是零件在零件库里的名称,将外形和引脚功能相同的零件取的一个通用名称;零件标识是电路图里用户根据需要自行设计的名称,当然也不能随意乱取。一般情况 ...…

查看全部问答>

EVC下如何加载JPEG图片文件?

EVC下如何加载JPEG图片文件,并且控制图片定位,大小? 有没有相关的库?…

查看全部问答>

关于AD转换器AD7731与单片机

谁能提供AD7731的中文资料?网上只搜到了E文的,可惜自己E文不好 目前正想用89C51和AD7731实现直流表的功能 C51开发,很多东西正在整理学习中 希望和这方面有经验的前辈们学习,得到大家的宝贵指导 谢谢 我的邮件和MSN是 janphee@hotmail.com ...…

查看全部问答>

sd卡读写问题,有的文件能写进去,有的文件不能写进去

    如题,sd卡读写问题,有的文件能写进去,有的文件不能写进去。。。     高手指点一下,文件系统用的是EFSL     ARM7---EasyArm2200…

查看全部问答>

调试出现反汇编界面跳不出来

如题,我程序在debuge的时候点着点着就进入反汇编界面了,再怎么点单步运行也出不来了(我怀疑可能是程序跑飞了),这是为什么?怎么解决,请高手不吝赐教,先谢谢了! …

查看全部问答>

做过vxworks下webserver的兄弟们请进!

敝人最近正在做一个vxworks下的webserver!以前重来没有接触过webserver方面的东西!昨天在网上溜达了一天!在vxworks 下就两种:1、利用自带组件(敝人没有找到网上介绍的network protocols-> network applications下选择http server即可>)2、利用 ...…

查看全部问答>

求助——RFID的天线阻抗自动匹配问题

RFID中,用的是2个螺线管耦合的方式来传送数据。但是当有物体靠近螺线管,螺线管的电感就产生变化,这样谐振频率也会发生变化,但信号的频率没变。信号的接受与发射就不好了。现在要做一个东西,让电容自动改变,使电感再改变的情况下,谢振频率不 ...…

查看全部问答>

AVR studio 中断

我现在的程序有一段是单片机串口接收到数据后会产生中断,将数据存下来进行处理,可是在AVR studio 环境下,跑到接收数据那就跑不下去了,请问这种情况应该怎么处理呢? 请大家帮忙!谢谢谢谢!…

查看全部问答>

电源问题

图中电感L1起什么作用?它的外形和变压器一样,画法也和变压器一样,是不是它就是变压器呢?本人是菜鸟,请大侠们不要见笑。谢谢!…

查看全部问答>