📄 at24c128.asm
字号:
;*************************************************************************
;文件:at24c128.asm
;功能:读/写24c128
;设计:裴洪广
;时间:2006年4月5日
;说明: 注意事项:
;1. 24c128每次最多读/写256个字节
;2. 在连续读/写时,如果数据地址已经到FFH时,将返回到00H操作,所以
; 256-数据地址>=字节数
;3. 24c128共有256页(每页64字节),地址为0~0x3fff
;*************************************************************************
;子程序定义
;bit wr24c128(uchar num,uint addr,uchar *da);//字节数,块地址,数据地址
;bit rd24c128(uchar num,uint addr,uchar *da);//操作成功返回1,否则返回0
; 参数:
; R7 字节数
; R4,R5 存储起始地址(R4:地址高8位,R5:地址低8位)
; R1,R2,R3 数据缓冲地址(MEM TYPE IN R3,MSB R2,LSB R1)
; T0计数器 写超时计时(16位计时,不能小于10MS)
I2C_SCL BIT P1.1 ;时钟线引脚
I2C_SDA BIT P1.2 ;数据线引脚
DATA_WP BIT P1.0 ;写保护引脚
;================================================
; 定义代码段
?PR?_wr24c128?at24c128 segment code
?PR?_rd24c128?at24c128 segment code
; 定义数据段
?DT?_wr24c128?at24c128 segment data overlayable
?BI?_wr24c128?at24c128 segment bit overlayable
public _wr24c128 ;输出函数名
public _rd24c128
EXTRN CODE (delayms)
EXTRN DATA (?delayms?BYTE)
rseg ?DT?_wr24c128?at24c128
?_wr24c128?BYTE:
pagenum: DS 1 ;页数(每页64字节)
sparebyte: DS 1 ;最后一页字节数
rseg ?BI?_wr24c128?at24c128
?_wr24c128?bit:
no_ack_f: dbit 1 ;应答标志位
c_pagenum_f: dbit 1 ;计算页号标志位
wr_end_f: dbit 1 ;写结束标志位
;================================================
;向24c128存入数据
rseg ?PR?_wr24c128?at24c128
;cseg at 100h
_WR24c128:
CLR DATA_WP ;写允许
CLR C_PAGENUM_F ;复位计算页号
CLR WR_END_F ;复位写结束
WR_PAGE_LOOP:
MOV A,#0A0H
LCALL SEND_START ;发送块号及写控制字
JB NO_ACK_F,SD_EX ;没有应答则跳出
mov a,r4
lcall send_byte ;发送地址1
JB NO_ACK_F,SD_EX ;没有应答则跳出
MOV A,R5
LCALL SEND_BYTE ;发送地址2
JB NO_ACK_F,SD_EX ;没有应答则跳出
JB WR_END_F,SD_LOOP ;写结束?
LCALL C_PAGENUM
SD_LOOP:
MOV A,@R1
LCALL SEND_BYTE;发送数据
INC R1
JB NO_ACK_F,SD_EX ;没有应答则跳出
DJNZ R7,SD_LOOP
LCALL SEND_STOP
mov ?delayms?byte,#20 ;写延时10MS
lcall delayms
JB WR_END_F,SD_EX;写结束?
DJNZ pagenum,WR_PAGE_LOOP
SETB WR_END_F ;置位写结束
MOV A,sparebyte
JZ SD_EX
MOV r7,A
AJMP WR_PAGE_LOOP
SD_EX:
LCALL SEND_STOP
CPL NO_ACK_F
MOV C,NO_ACK_F ;成功:返回1
SETB DATA_WP ;写保护
RET
;计算页号
C_PAGENUM:
MOV A,R5
MOV B,#64
DIV AB
MOV A,#64
CLR C
SUBB A,B
PUSH ACC
MOV B,A
JB C_PAGENUM_F,C_PAGENUM_END
MOV A,R7
CLR C
SUBB A,B
JZ LASTPAGE ;若A=B,则只有一页
JC LASTPAGE ;若A<B,则只有一页
MOV B,#64
DIV AB
ADD A,#1
MOV pagenum,A ;写满页的次数
MOV sparebyte,B ;写最后一页的字节数
SETB C_PAGENUM_F
C_PAGENUM_END:
POP ACC
MOV R7,A ;写页的字节数
ADD A,R5
MOV R5,A ;计算起始地址
RET
LASTPAGE:
SETB WR_END_F ;置位写结束
POP ACC
RET
;================================================
;从24c128读出数据
rseg ?PR?_rd24c128?at24c128
_RD24c128:
MOV A,#0A0H
LCALL SEND_START ;发送块号及写控制字
JB NO_ACK_F,RD_EX
MOV A,R4
LCALL SEND_BYTE ;地址1
JB NO_ACK_F,RD_EX
MOV A,R5
LCALL SEND_BYTE ;地址2
JB NO_ACK_F,RD_EX
MOV A,#0A1H
LCALL SEND_START ;发送块号及读控制字
JB NO_ACK_F,RD_EX
RD_LOOP:
LCALL RECV_BYTE ;接收数据
MOV @R1,A
INC R1
DJNZ R7,RD_LOOP
RD_EX:
LCALL SEND_STOP
CPL NO_ACK_F
MOV C,NO_ACK_F ;成功:返回1
RET
;================================================
;启动24c128
SEND_START:
CLR NO_ACK_F
LCALL RELEASE_SCL_HIGH
SETB I2C_SDA
CLR I2C_SDA
LCALL DELAY_2US
CLR I2C_SCL
LCALL DELAY_2US
LCALL SEND_BYTE
RET
;================================================
;送出一个字节数据
SEND_BYTE:
MOV R2,#8
SB_LOOP:
RLC A
MOV I2C_SDA,C
LCALL RELEASE_SCL_HIGH
LCALL DELAY_2US
CLR I2C_SCL
LCALL DELAY_2US
DJNZ R2,SB_LOOP
SETB I2C_SDA
LCALL RELEASE_SCL_HIGH
LCALL DELAY_3US
JNB I2C_SDA,SB_EX
SETB NO_ACK_F
SB_EX:
CLR I2C_SCL
LCALL DELAY_2US
RET
;================================================
;接收一个字节数据
RECV_BYTE:
MOV R2,#8
RB_LOOP:
LCALL RELEASE_SCL_HIGH
LCALL DELAY_2US
MOV C,I2C_SDA
RLC A
CLR I2C_SCL
LCALL DELAY_2US
DJNZ R2,RB_LOOP
PUSH ACC
MOV A,R7
CJNE A,#1,RB_ACK
SETB I2C_SDA
AJMP RB_ACLK
RB_ACK:
CLR I2C_SDA
RB_ACLK:
LCALL RELEASE_SCL_HIGH
POP ACC
LCALL DELAY_2US
CLR I2C_SCL
SETB I2C_SDA
LCALL DELAY_3US
RET
;================================================
;停止发送
SEND_STOP:
CLR I2C_SDA
LCALL RELEASE_SCL_HIGH
LCALL DELAY_2US
SETB I2C_SDA
RET
;================================================
;延时
DELAY_3US: ;3US
NOP
NOP
DELAY_2US: ;2US
NOP
NOP
RET
;================================================
;将时钟引脚置为高电平
RELEASE_SCL_HIGH:
SETB I2C_SCL
JNB I2C_SCL,$
RET
;//////////////////////////////////////////////////////////////////////
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -