📄 daima38.asm
字号:
SCL BIT P1.0 ;EEPROM数据输入输出口
SDA BIT P1.1 ;EEPROM时钟口线
EEP_ADDR EQU 20H ;地址缓冲区
ORG 0000H ;程序开始
LJMP MAIN ;主程序
ORG 0100H ;主程序开始 30H
MAIN: MOV SP,#050H ;设置堆栈
LCALL INIT ;初始化
……
;************************** 写127字节的程序 **************************
WR127: MOV EEP_ADDR,#00H ;数据在AT24C04中的首地址
MOV R1,#00H ;待存数据首偏址
MOV R0,#127 ;需要存储的数据数量
LOOP1: MOV A,R1 ;获得首地址
MOV DPTR,#5000H ;查数据表
MOVC A,@A+DPTR ;得到数据
MOV B,A ;寄存
MOV R2,EEP_ADDR ;数据在AT24C04中的地址
LCALL WT_MEM ;写入一个字节数据
INC EEP_ADDR ;准备下一个地址
INC R1 ;偏址加1
DJNZ R0,LOOP1 ;准备下一个数据,重复写入
;************************** 读127字节的程序 **************************
RD127: MOV R1,#00H ;待读数据首地址
MOV R0,#127 ;需要读取的数据数量
MOV DPTR,#5000H ;要写到RAM地址
LOOP2: MOV A,R1
MOV R2,A ;要读取的数据地址放到R2
MOV B,#00H ;寄存器清零
LCALL RD_MEM ;从AT24C04读一个字节数据
ADD DPTR,R1 ;RAM地址
MOV @DPTR,B ;把读取的数据存到RAM里
INC R1 ;地址加1
DJNZ R0,LOOP2 ;重复读出数据
……
SJMP $ ;停止
INIT: NOP ;初始化子程序
CLR SCL ;时钟为低
CLR SDA ;数据为低
RET
;********************** 写AT24CXX字节子程序 *************************
WT_MEM: NOP ;写入的地址在R2中,数据在B中
ACALL MEM_START ;给AT24C04开始信号
MOV A,#0A0H ;"写"命令字+片选地址信息
ACALL WR1 ;写入以上信息
MWRITE2:MOV A,R2 ;准备写入片内地址信息
ACALL WR1 ;写入
MOV A,B ;准备数据
ACALL WR1 ;写入数据
ACALL MEM_STOP ;发送停止信号,
;如果要重复写,可以不发结束信号,返回MWRITE2继续
;写下一个数据,写完后发送结束信号。
RET ;返回,一个字节写结束
;******************* AT24CXX读字节子程序 *********************
; 要读入的地址信息在R2中,返回的读取数据在B中
RD_MEM: ACALL MEM_START ;发送开始信号
MOV A,#0A0H ;"写"命令字+片选地址信号
ACALL WR1 ;写入以上信息
MOV A,R2 ;准备片内信息
ACALL WR1 ;写入片地址信息
ACALL MEM_START ;重复发送开始信号,这里和写不同
MOV A,#0A1H ;准备命令字(读)+片选地值
ACALL WR1 ;写入以上信息
CLR A ;准备接收读取的数据
MOV R3,#08H ;数据位数
CLR SCL ;时钟为低
RD1: SETB SCL ;时钟上跳
NOP ;等待数据出现
LCALL MDELAY ;延时等待
MOV C,SDA ;数据移入C
RLC A ;数据移入寄存器A
CLR SCL ;时钟下跳,准备读取下一位数据
LCALL MDELAY
DJNZ R3,RD1 ;没有读完则继续,否则返回
MOV B,A ;数据送B
ACALL MEM_STOP ;发送结束信号
RET ;返回
WR1: MOV R6,#08H ;写入8个字节数
WR2: RLC A ;A带进位左移
MOV SDA,C ;数据输出一位
SETB SCL ;向AT24C04锁存数据
ACALL MDELAY ;等待
CLR SCL ;准备写入下一个字节数据
ACALL MDELAY ;等待
DJNZ R6,WR2 ;没有写完,继续
WR4: LCALL MDELAY ;等待写完8字节信息
SETB SCL ;发送第9个时钟作为应答信号
LCALL MDELAY ;等待,AT24C04应答信号
CLR SCL ;完成,清除时钟
RET ;返回
;*********** 发送开始信号 ********************
;开始信号:在时钟为高电平,数据线出现下跳;
MEM_START:
SETB SDA ;数据线高电平
SETB SCL ;时钟提高
NOP ;等待电平稳定
CLR SDA ;数据下跳作为开始信号
ACALL MDELAY ;延时
CLR SCL ;时钟下跳
ACALL MDELAY ;等待一段时间
RET ;返回
;************************** 发送停止信号 **************************
;停止信号:在时钟为高电平,数据线出现上跳;
MEM_STOP:
SETB SCL ;时钟线高
ACALL MDELAY ;等待电平稳定
SETB SDA ;数据线高,停止信号
ACALL MDELAY ;等待
LCALL DELAY20MS ;写周期延时
RET ;返回
;************************** 短时间延时 **************************
MDELAY: MOV R7,#04H
MDELAY1:NOP
DJNZ R7,MDELAY1
RET
;************************** 20ms延时 **************************
DELAY20MS:
MOV R5,#40
DELAY1: MOV R4,#00H
DELAY2: DJNZ R4,DELAY2
DJNZ R5,DELAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -