📄 at24c02b.asm
字号:
WP EQU P1.0
SCL EQU P1.1
SDA EQU P1.2
DIR EQU P1.7
COUNTER DATA 7FH ;数据线上的位计数器
COUNTER1 DATA 7EH ;延时计数器
RI2CDATA DATA 7DH ;从24c02读出的数据暂存器
WI2CDATA DATA 7CH ;向24c02写入的数据暂存器
QADDR DATA 7BH ;24c02的地址寄存器
CADDR DATA 7AH ;24c02中的存储器地址
MADDR DATA 79H ;单片机内存地址
ADDR DATA 77H ;本机地址寄存器
COUNT DATA 78H ;触发个数计数器
ORG 0000H
MAIN: MOV SP,#60H
MOV R5,#04H
MOV R6,#00H
RE2: MOV 58H, R6
INC R6
MOV R1,#20H
MOV R2,#18H
RE1: MOV @R1,58H
INC R1
INC 58H
DJNZ R2,RE1
CLR WP
MOV MADDR,#20H
MOV CADDR,#00H
MOV QADDR,#0A0H
LCALL PWRITE
MOV MADDR,#28H
MOV CADDR,#08H
MOV QADDR,#0A0H
LCALL PWRITE
MOV MADDR,#30H
MOV CADDR,#10H
MOV QADDR,#0A0H
LCALL PWRITE
MOV MADDR,#40H
MOV CADDR,#00H
MOV QADDR,#0A0H
LCALL READ24
DJNZ R5,RE2
SJMP $
;==================================================
; 延时子程序
SOMENOP : MOV COUNTER1,#00H
SOMENOP1: DJNZ COUNTER1,SOMENOP1
RET
;==================================================
START : CLR WP ;取消写保护
SETB SDA ;释放数据线
SETB SCL ;将时钟线置高
LCALL SOMENOP ;调用延时子程序
CLR SDA ;SDA产生一个由高到低的跳变
LCALL SOMENOP ;调用延时子程序
CLR SCL ;将时钟线置低
RET
;作用:用于产生总线上的数据传输起始信号
;入口:无
;出口:无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================
STOP :SETB SCL ;将时钟线置高
CLR SDA ;将数据线线置低
LCALL SOMENOP ;调用延时子程序
SETB SDA ;SDA产生一个由低到高的跳变
LCALL SOMENOP ;调用延时子程序
SETB WP ;设置写保护
RET
;作用:用于产生总线上的数据传输结束信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================
WACK :CLR SCL ;将时钟线置低
SETB SDA ;释放数据线
LCALL SOMENOP ;延时等待ACK信号出现
SETB SCL ;将时钟线置高
LCALL SOMENOP ;准备读取ACK信号
MOV C,SDA ;读取应答信号
JC WACK ;判断应答信号
CLR SDA ;将数据线线置低
CLR SCL ;将时钟线置低
RET
;作用:等待接受器发来应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:PSW
;=============================================
ACK :CLR SDA ;产生低电平的ACK信号
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
CLR SCL ;将时钟线置低
RET
;作用:向发送器发送应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;=================================================
NACK : SETB SDA ;产生高电平的NACK信号
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
CLR SCL ;将时钟线置低
RET
;作用:向发送器发送NACK信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===========================================
SBYTE : MOV COUNTER,#8H ;发出8个数据位
SBYTE1 : CLR SCL ;将时钟线置为低电平
RLC A ;最高位移入C中
MOV SDA,C ;送入数据线
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置为高电平
LCALL SOMENOP ;延时
DJNZ COUNTER,SBYTE1 ;判断8个数据位是否发送完毕
CLR SCL ;发送完毕将时钟线置为低电平
RET
;作用:向接受器发送一个字节数据
;入口:ACC(待发送的数据)
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER
;==================================================
RBYTE :MOV COUNTER,#8H ;共接收8个数据位
CLR A ;将A清零
SETB SDA ;释放数据线
RBYTE1 :CLR SCL ;将时钟线置低
LCALL SOMENOP ;延时
SETB SCL ;将时钟线置高
LCALL SOMENOP ;延时
MOV C,SDA ;读入一位数据
RLC A ;移入A中
SETB SDA ;释放总线
DJNZ COUNTER,RBYTE1;判断是否接收完8位数据
MOV RI2CDATA,A ;接受完后存入读数据暂存器
CLR SCL ;将时钟线置低
RET
;作用:从发送器接收一个字节的数据
;入口:无
;出口: RI2CDATA
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER,RI2CDATA
;=====================================================
WRITE : PUSH ACC ;保护现场
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A,CADDR ;将要写入的存储器地址送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A, WI2CDATA ;将要写入的数据送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL STOP ;结束本次数据传输
LCALL SOMENOP ;等待24C02的内部写操作
POP ACC ;恢复现场
RET
;作用:向任一24c02的任一地址写入一个字节的数据
;入口:WI2CDATA(写数据暂存器),QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK
;寄存器占用:ACC,PSW,WI2CDATA ,QADDR ,CADDR
;===================================================================
READ : PUSH ACC ;保护现场
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A, CADDR ;将要读的的存储器地址送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL START ;发出数据传输起始信号
MOV A,#1H
ORL A,QADDR ;将该24C02的读命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL RBYTE ;取走数据
LCALL NACK ;发出非应答信号
LCALL STOP ;结束数据传输
POP ACC ;恢复现场
RET
;作用:从任一24c02的任一地址读出一个数据放入RI2CDATA中
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: RI2CDATA
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW,RI2CDATA ,QADDR ,CADDR
;========================================================
PWRITE: PUSH 00H
PUSH 02H
PUSH ACC ;保护现场
MOV R0, MADDR ;待写入数据存储器首地址送入R0
MOV R2,#08H ;写入数据个数
LCALL START ;发出数据传输起始信号
MOV A,#0FEH
ANL A,QADDR ;将该24C02的写命令字送入A中
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
MOV A,CADDR ;要写入的24C02的存储器首地址
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
PWRITE1:
MOV A, @R0
LCALL SBYTE ;发出
LCALL WACK ;等待24C02的应答
LCALL SOMENOP ;延时
INC R0 ; 数据存储器地址加一
DJNZ R2 , PWRITE1;8个数据是否写完
LCALL STOP ;结束数据传输
LCALL SOMENOP ;等待24C02的内部写操作
POP ACC
POP 02H
POP 00H ;恢复现场
RET
;作用:向任一24c02的任一起始地址开始连续写入8个以MADDR为首地址的数据
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器首地址),MADDR(待写入数据存储器首地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW ,QADDR ,CADDR ,MADDR ,R0,R2
;===========================================================================
READ24: PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC ;保护现场
CLR WP ;取消写保护
MOV R0, #08H ;待存入的数据存储器首地址送入R0
MOV R1, #02h ;24C02中要读出的数据首地址送入R1
MOV QADDR,#0A0H
MOV R2,#18H ;读取数据的个数送入R2
READ241:MOV CADDR,R1
INC R1 ;要读出的数据地址加一
LCALL READ ;读出数据
MOV @R0, RI2CDATA ;将数据存入单片机内
INC R0 ;调整内存地址
DJNZ R2, READ241 ;判断是否操作完
POP ACC
POP 02H
POP 01H
POP 00H ;恢复现场
RET
;作用:从任一24c02读出以CADDR为首地址的24 个数据存放在以MADDR为首地址的数据存储区
;入口:QADDR(24C02的地址) ,CADDR(24C02中要读出的数据首地址),MADDR(待存入的数据存储器首地址)
;出口: 以MADDR为首地址的24个存储单元
;子程序调用:read
;寄存器占用:ACC,QADDR ,CADDR ,MADDR ,R0,R1,R2 ,RI2CDATA
;==========================================================================
READ24: PUSH 00H
PUSH 01H
PUSH 02H
PUSH ACC ;保护现场
MOV R0, MADDR ;待存入的数据存储器首地址送入R0
MOV R1,CADDR ;24C02中要读出的数据首地址送入R1
MOV R2,#18H ;读取数据的个数送入R2
READ241:MOV CADDR,R1
INC R1 ;要读出的数据地址加一
LCALL READ ;读出数据
MOV @R0, RI2CDATA ;将数据存入单片机内
INC R0 ;调整内存地址
DJNZ R2, READ241 ;判断是否操作完
POP ACC
POP 02H
POP 01H
POP 00H ;恢复现场
RET
;作用:从任一24c02读出以CADDR为首地址的24 个数据存放在以MADDR为首地址的数据存储区
;入口:QADDR(24C02的地址) ,CADDR(24C02中要读出的数据首地址),MADDR(待存入的数据存储器首地址)
;出口: 以MADDR为首地址的24个存储单元
;子程序调用:read
;寄存器占用:ACC,QADDR ,CADDR ,MADDR ,R0,R1,R2 ,RI2CDATA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -