AT93C46/56/57/66 EEPROM 芯片通用读写程序

发布者:艺泉阁最新更新时间:2018-01-07 来源: eefocus关键字:AT93C46  EEPROM  读写程序 手机看文章 扫描二维码
随时随地手机看文章

AT93C46/56/57/66 EEPROM 芯片通用读写程序

; 模块包含: 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 


关键字:AT93C46  EEPROM  读写程序 引用地址: AT93C46/56/57/66 EEPROM 芯片通用读写程序

上一篇:利用ds18b20检测当前温度isd1420语音芯片的温度报警程序
下一篇:AT93C46汇编读写示例程序

推荐阅读最新更新时间:2024-03-16 15:51

linux I2C读写EEPROM
/************************************************************/ //文件名:app_at24c02.c //功能:测试linux下iic读写at24c02程序 /************************************************************/ //包含头文件 #include stdio.h #include stdlib.h #include unistd.h #include sys/ioctl.h #include sys/types.h #include sys/stat.h #include fcntl.
[单片机]
msp430 FLASH 字节读写程序
/***** 430 FLASH 字节读写程序 *************************/ 430的数据RAM 与FLASH的读写 #define FLASH_ADDRESS 0x1000 //定义FLASH信息区地址B段 void flash_erase(unsigned char*); void read_flash(unsigned char *pc_byte, unsigned char *array,unsigned char amount); void write_flash(unsigned char *pc_byte,unsigned char *array,unsign
[单片机]
STM32系统学习——I2C (读写EEPROM
I2C 通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流, 协议层则规定我
[单片机]
STM32系统学习——I2C (读写<font color='red'>EEPROM</font>)
EEPROM 存储电台PLL子程序
这是一个单片机控制的收音机程序完整代码和原理图下载地址: http://www.51hei.com/bbs/dpj-19294-1.html 下面我我截图的一个子程序. #include STC12C5620AD.H #include EEPROM.H #include Channel_Handle.H /********************** 声明外部变量**************************/ /********************** EEPROM 存储电台PLL*************************/ void EEPROM_Save_PLL(uchar Index,uint Udata
[单片机]
【蓝桥杯单片机组】AT2C02 EEPROM
这个也是iic总线结构! 在此总结一下iic的程序结构 在同一个函数内读、写操作(以读eeprom为例) (1)开启总线 (2)写地址字,等待回应(写命令) (3)写要读的地址,等待回应 (4)再次开启总线 (5)写地址字,等待回应(读命令) (6)读要读的地址 (7)发出回应 (8)结束总线 放上代码: unsigned char read_eeprom(unsigned char add) { unsigned char dat; IIC_Start(); //(1)开启总线 IIC_SendByte(SlaveAddrW); //(2)写地址字,等待回应(写命令) II
[单片机]
AVR IAR EEPROM 读写
IAR中关键字及其用法: __eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存放 __tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间控制数据存放 __ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放 __regvar 放置一个变量在工作寄存器中 @ 用于变量的绝对地址定位。也可以用#pragma location 命令 #pragma vector 提供中断函数的入口地址 __root 保证没有使用的函数或者变量也能够包含在目标代码中 __no_init 禁止系统
[单片机]
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ、写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对 EEPROM(AT24Xxx) 进行读写操作的过程。 上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。 本文主要内容: STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。 实例实验效果: 1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来 2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来 实验说明: 1.多字节读写 实验为什么是从66地址写? 为什么是写入12
[单片机]
STM32F10x_硬件I2C读写<font color='red'>EEPROM</font>(标准外设库版本)
ATmega16L-EEPROM读写操作实验
/*************************************** 读写AVR单片机EEPROM实验。 先向单片机EEPROM写入254,然后读出254, 并在数码管上显示出来 ***************************************/ #include iom16v.h const unsigned char duanma ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; const unsigned char weima ={0xfe,0xfd,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved