2404 是一个4KB的EEPROM,具有1,000,000次擦写周期,数据保存100年不变,非挥发性存 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
;介质,I2C总线形式,页面存储方式,能方便地读写数据,数据保存安全可靠。
;本程序主要为AT24C04的读写程序,具有单字节读、写;多字节连续读、写等方式。
BEEP BIT P3.7 ;蜂鸣器定义
MDIO BIT P2.5 ;EEPROM数据输入输出口
MCLK BIT P2.4 ;EEPROM时钟口线
MEM_R1 EQU 0BH ;延时寄存器1
MEM_R2 EQU 0CH ;延时寄存器2
WP BIT P2.3 ;EEPROM写保护,高电平保护
AD0 BIT P2.0 ;EEPROM地址A0
AD1 BIT P2.1 ;EEPROM地址A1
AD2 BIT P2.2 ;EEPROM地址A2
DATA_A EQU 20H ;地址缓冲区
ORG 00H ;程序开始
JMP MAIN ;主程序
ORG 30H ;主程序开始 30H
MAIN: MOV SP,#30H ;设置堆栈
LCALL REST ;初始化
MOV DATA_A,#00H ;数据在AT24C04中的首地址
MOV R1,#0 ;待存数据首地址
MOV R0,#255 ;需要存储的数据数量
LP: MOV A,R1 ;获得首地址
MOV DPTR,#TAB ;查数据表
MOVC A,@A+DPTR ;得到数据
JZ LPE ;如果为0返回
MOV B,A ;寄存
MOV DPH,DATA_A ;数据在AT24C04中的地址
Lcall wt_mem ;写入一个字节数据
INC DATA_A ;准备下一个地址
INC R1 ;准备下一个数据
JMP LP ;重复写入
LPE: MOV DPH,#00H ;要读取的数据地址
MOV B,#00H ;寄存器清零
LCALL RD_MEM ;读取数据从AT24C04
MOV P1,B ;数据从P1口反映出来
JMP $ ;停止
REST: ;初始化
CLR AD0 ;给AT24C04的地址端清零
CLR AD1 ;
CLR AD2 ;
CLR WP ;清除写保护
CLR MCLK ;时钟为低
CLR MDIO ;数据为低
MOV P0,#00H ;禁止数码管显示
CLR BEEP ;禁止蜂鸣器
RET
;**************** AT24C04 操作程序 ****************
WT_MEM: ;写入的地址在DPH中,数据在B中
ACALL MEM_START ;给AT24C04开始信号
MOV A,#0A0H ;"写"命令字+片选地址信息
ACALL WR1 ;写入以上信息
MWRITE2:
MOV A,DPH ;准备写入片内地址信息
ACALL WR1 ;写入
MOV A,B ;准备数据
ACALL WR1 ;写入数据
ACALL MEM_STOP ;发送停止信号,
;如果要重复写,可以不发结束信号,
;返回MWRITE2继续写下一个数据
;写完后发送结束信号。
RET ;返回,一个字节写结束
;********** AT24CXX 读字节程序 ***************************
; 要读入的地址信息在DPH中,返回的读取数据在B中
RD_MEM:
ACALL MEM_START ;发送开始信号
MOV A,#0A0H ;"写"命令字+片选地址信号
ACALL WR1 ;写入以上信息
MOV A,DPH ;准备片内信息
ACALL WR1 ;写入片地址信息
ACALL MEM_START ;重复发送开始信号,这里和写不同
MOV A,#0A1H ;准备命令字(读)+片选地值
ACALL WR1 ;写入以上信息
CLR A ;准备接收读取的数据
MOV DPL,#08H ;数据位数
CLR MCLK ;时钟为低
RD1: SETB MCLK ;时钟上跳
NOP ;等待数据出现
LCALL MDELAY ;延时等待
MOV C,MDIO ;数据移入C
RLC A ;数据移入寄存器A
CLR MCLK ;时钟下跳,准备读取下一位数据
LCALL MDELAY
DJNZ DPL,RD1 ;没有读完则继续,否则返回
MOV B,A ;数据送B
ACALL MEM_STOP ;发送结束信号
RET ;返回,
WR1: MOV MEM_R1,#08H ;写入8个字节数
WR2: RLC A ;A带进位左移
MOV MDIO,C ;数据输出一位
SETB MCLK ;向AT24C04锁存数据
ACALL MDELAY ;等待
CLR MCLK ;准备写入下一个字节数据
ACALL MDELAY ;等待
DJNZ MEM_R1,WR2 ;没有写完,继续
;
WR4: LCALL MDELAY ;等待写完8字节信息
SETB MCLK ;发送第9个时钟作为应答信号
LCALL MDELAY ;等待,AT24C04应答信号
CLR MCLK ;完成,清除时钟
RET ;返回
;*********** 发送开始信号 ********************
;开始信号:在时钟为高电平,数据线出现下跳;
MEM_START: SETB MDIO ;数据线高电平
SETB MCLK ;时钟提高
NOP ;等待电平稳定
CLR MDIO ;数据下跳作为开始信号
ACALL MDELAY ;延时
CLR MCLK ;时钟下跳
ACALL MDELAY ;等待一段时间
RET ;返回
;********** 发送停止信号 *********************
;停止信号:在时钟为高电平,数据线出现上跳;
MEM_STOP: SETB MCLK ;时钟线高
ACALL MDELAY ;等待电平稳定
SETB MDIO ;数据线高,停止信号
ACALL MDELAY ;等待
LCALL DELAY20MS ;写周期延时
; LCALL DELAY20MS ;延时
RET ;返回
MDELAY: ;短时间延时
MOV MEM_R2,#04H
LOOP: NOP
DJNZ MEM_R2,LOOP
RET
DELAY20MS: ;20ms延时
MOV R5,#40
DELAY1: MOV R4,#00H
DELAY2: DJNZ R4,DELAY2
DJNZ R5,DELAY1
RET
; ************ 这张表格位要写入AT24C04的数据 ***********************
; " HEJOIN "
; " LiZaoping"
; " ZHEJIANGHAIYAN"
; " HTTP://WWW.HEJOIN.COM"
; " Email:Hejoin@163.net"
TAB: DB ‘H‘, ‘E‘, ‘J‘, ‘O‘, ‘I‘, ‘N‘, 0AH
DB ‘L‘, ‘i‘, ‘Z‘, ‘a‘, ‘o‘, ‘p‘, ‘i‘, ‘n‘, ‘g‘, 0AH
DB ‘Z‘, ‘H‘, ‘E‘, ‘J‘, ‘I‘, ‘A‘, ‘N‘, ‘G‘, ‘H‘, ‘A‘, ‘I‘, ‘Y‘, ‘A‘, ‘N‘,0AH
DB ‘H‘, ‘T‘, ‘T‘, ‘P‘, ‘/‘, ‘/‘, ‘:‘, ‘W‘, ‘W‘, ‘W‘, ‘.‘, ‘H‘, ‘E‘, ‘J‘, ‘O‘, ‘I‘, ‘N‘, ‘.‘, ‘C‘, ‘O‘, ‘M‘,0AH
DB ‘E‘, ‘m‘, ‘a‘, ‘i‘, ‘l‘, ‘:‘, ‘H‘, ‘e‘, ‘j‘, ‘o‘, ‘i‘, ‘n‘, ‘@‘, ‘1‘, ‘6‘, ‘3‘, ‘.‘, ‘n‘, ‘e‘, ‘t‘,0AH
db 00h
END
文章评论(0条评论)
登录后参与讨论