📄 24c02.asm
字号:
;******************************************************************
;******************** WWW.QLMCU.COM **********************
;***************** AT24C02串行E2PROM的读写实验 ******************
;********************** FOSC= 11.0592MHz ********************
;******************** design by benladn911 ************************
;*********************** 2005/05/05 ***************************
;****************** Email:lanbing51@126.com *********************
;!!!!!!!!!!!!!!!!!!!!!!!!!读写操作成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在AT89C51试验开发板上它们都接地,
;第 8 脚和第 4 脚分别为正、负电源。
;第 5 脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在实验开发板上和单片机的 P2.7 连接。
;第 6 脚SCL为串行时钟输入线,在实验开发板上和单片机的 P3.6 连接。
;SDA和SCL都需要和正电源间各接一个 4.7K 的电阻上拉。第 7 脚需要接地。
;程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,
;只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。
;另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
;AT24系列EEPROM在开始状态后需紧接一个8位器件地址,以进行应读写操作。
;设备寻址码的高4位为1、0、1、0,对于AT24C01/02,寻址码高4位后面的三位是器件寻址码,
;与它们的硬连线管脚相对应。最低应是读写选择位即方向位(R/W)。
;(R/W)为“0”表示发送,即主器件把信息写到所选择的从器件;
;(R/W)为“1”表示主器件将从从器件读信息。
;具体的格式如下:
;1010 A2 A1 A0 R/W
; 1010 0000B-----写卡器件地址 !!!!!!!!!!!!!!!!!!!!
; 1010 0001B-----读卡器件地址 !!!!!!!!!!!!!!!!!!!!
; 24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动加1 !!!!!!!!!!
; 以实现对下一个存储单元的读写,所有字节均以单一操作方式读取
; 为降低总的写入时间, 一次操作可写入多达 8 个字节的数据!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; AT24C01/02的页面为 8 字节!!!
; AT24C04/08/16的页面为 16 字节!!!
;************************************************************************************
;***************************字节写入模式写数据(WRITE_BYTE)
;************下列程序中的参数为:R6= =目的地址,A= =数据;数据如下:
;*********************************************************************操作成功!!!
SCL EQU P3.6
SDA EQU P2.7 ;端口定义
ORG 0000H
LJMP START
ORG 0100H
START:
MOV DPTR,#TAB
MOV R6,#00H ;写入字节地址的设置
LCALL XXX ;写入第一页(8个字节的数据,24C01/02一次最多只能写 8 个字节!!!)
LCALL DELAY ;调用大概 1mS 延时,此延时程序非常必要!!!
LCALL DELAY
LCALL DELAY
LCALL DELAY
;----------------------READ THE FIRST BYTE--------------
RRRR: MOV R1,#00H ;THE FIRST BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
CLR P3.7 ;***选通LED的公共端
MOV P0,80H
LCALL DELAY1
;----------------------READ THE SECOND BYTE-------------
LOOPPP:INC R1 ;THE SECOND BYTE'S ADDRESS
LCALL DDD
LCALL DELAY
LCALL DELAY
CLR P3.7 ;***选通LED的公共端
MOV P0,80H
LCALL DELAY1
MOV R1,#00H
LJMP RRRR
;--------------------------------写入数据//2005.05.05
XXX:
MOV P1,#0FFH
MOV A,#00H
PUSH ACC ;保存A中的数据
LCALL START_IC ;发开始信号
MOV A,#0A0H ;写入器件地址设置为 A0H
LCALL WR_BYTE
MOV A,R6 ;写入字节地址
LCALL WR_BYTE
POP ACC ;恢复A中数据
LCALL WRITE_BYTE ;写入第一页的数据
LCALL STOP_IC
RET
;--------------------------------读取一个数据//2005.06.27// OK!!!
DDD:
MOV A,#00H
PUSH ACC ;保存A中的数据
LCALL START_IC ;发开始信号
MOV A,#0A0H ;写入器件地址,表示选中该器件
LCALL WR_BYTE
MOV A,R1 ;写入字节地址---------------地址设置!!!!!!!
LCALL WR_BYTE
POP ACC ;恢复A中数据
MOV P2,#0FFH
MOV P3,#0FFH
LCALL START_IC
MOV A,#0A1H ;*****读器件时地址必须设置为 A1H !!!!!
LCALL WR_BYTE
LCALL RD_BYTE ;读出第一个字节
MOV 80H,A
NOP
NOP
LCALL STOP_IC
RET
;---------------------------------------------------------------------
WRITE_BYTE: ;字节写入模式写数据(WRITE_BYTE)
MOV R7,#08 ;欲写入数据个数的设定,一次最多只能写入 8 各字节的数据(对24C01/02而言!!!!)
LOOP: MOV A,#00H
MOVC A,@A+DPTR
LCALL WR_BYTE ;写入数据
INC R6 ;增加字节地址!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
INC DPTR
DJNZ R7,LOOP
RET
;----------------------------------------------------------------------
;*******************************************************************************
;*********************************以下为各功能子程序****************************
;*******************************************************************************
;-------------------------------------------------------------------
;-----------------------------开始条件------------------------------
START_IC:
CLR SCL ; SCL低电平时才允许SDA更改
NOP ;加入空指令延时以确保信号可靠
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
NOP
RET
;----------------------------------------------------------------------------------
;-------------------写一字节数据到EEPROM,程序中已包含应答子程序!!!-----------------
;----------------------------------------------------------------------------------
WR_BYTE:
MOV R5,#08 ;一字节8位数据
CLR SCL
NOP
NOP
WR_BYTE1:RLC A ;带进位位左移,A.8->C
MOV SDA,C ; SCL低电平时改变SDA上的数据
NOP
SETB SCL ;拉高SCL把数据发送出去
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,WR_BYTE1; 依次发送A中的8位数据
SETB SDA
SETB SCL
JB SDA,$ ; 等待IC卡确认信号
CLR SCL
NOP
nop
RET
;---------------------------------------------------------------------------
;--------------------------从EEPROM读一字节(RD_BYTE)//2005.06.27 ---------
;---------------------------------------------------------------------------
RD_BYTE:
MOV R5,#08
SETB SDA;设备SDA为读状态
CLR A;清空A寄存器
RD_BYTE1:
MOV C,SDA;读一位数据到进位位
RLC A;左移数据到A.0
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,RD_BYTE1;依次读出8位数据到A中
RET;无应答信号
;利用该程序可将读出的数据存放在A中。需要注意的是:读数据的器件不是通过确认状态来应答的,
;而是随后产生一个停止状态。
;-----------------------------------------------------------------------
;------------------------------------停止条件
STOP_IC:
CLR SCL
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA
RET
;-------------------------------------------------------------------------
TAB:
DB 01H,02H,04H,08H,05H,06H,07H,08H
;-------------------------------------------------------------------------
DELAY: MOV R4,#2;延时程序,延时1000微秒= 1mS FOSC=6MHz
DD3:MOV R5,#124
DJNZ R5,$
DJNZ R4,DD3
RET
DELAY1: MOV R4,#10H ;一秒延迟子程序
DELAY11:MOV R5,#255
DELAY41:MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,DELAY41
DJNZ R4,DELAY11
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -