本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本人写的一个简单的E2PROM读写程序
SCL1 EQU P1.0 ;时钟
SDA1 EQU P1.1 ;数据
SCL2 EQU P1.2
SDA2 EQU P1.3
L1 EQU P1.4 ;操作成功指示,低电平点亮
L2 EQU P1.5
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: SETB L1
SETB L2
JB P1.6 ,$
ACALL START1
MOV R2,#0XA1 ;将控制字"1010 0001"传到R2,最后一位表示读
ACALL WRITE ;写入控制字
MOV R2,#00 ;设置要读地址
ACALL READ ;调用读命令
ACALL ASK1 ;应答
MOV 0X40,R2 ;将读得的数据传到40H
ACALL STOP1 ;停止读操作
ACALL START2
MOV R2,#0XA0 ;写控制字,表示以下这写操作
ACALL WRITE
MOV R2,#0X01 ;设置地址
ACALL WRITE
MOV R2,0X40 ;将上面读得的数据写入到01单元
ACALL WRITE
ACALL STOP2 ;停止操作
ACALL DELAY ;等待写完成
ACALL START2 ;启动
MOV R2,#0XA1 ;写入控制字,表示以下为读操作
ACALL WRITE
MOV R2,#01 ;写入读的起始地址
ACALL READ
ACALL ASK2
MOV 0X40,R2 ;以下连续读出了两个字节
ACALL READ
ACALL ASK1
MOV 0X41,R2
ACALL READ
ACALL ASK2
ACALL STOP2
MOV A,0X41 ;以下为比较读出结果与写入是否相等
CJNE A,0X40,ENDALL
CLR P1.4
ACALL DELAY
ENDALL: CLR P1.5
RET
START1: CLR SCL1 ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
SETB SDA1
NOP
NOP
SETB SCL1
NOP
NOP
CLR SDA1
NOP
NOP
RET
START2: CLR SCL2
NOP
NOP
SETB SDA2
NOP
NOP
SETB SCL2
NOP
NOP
CLR SDA2
NOP
NOP
RET
STOP1: CLR SCL1 ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA1
NOP
NOP
SETB SCL1
NOP
NOP
SETB SDA1
NOP
NOP
RET
STOP2: CLR SCL2 ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA2
NOP
NOP
SETB SCL2
NOP
NOP
SETB SDA2
NOP
NOP
RET
;应答函数
ASK1: CLR SCL1 ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA1 ;发低电平应答
NOP
NOP
SETB SCL1
NOP
NOP
RET
ASK2: CLR SCL2 ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA2 ;发低电平应答
NOP
NOP
SETB SCL2
NOP
NOP
RET
;写一个字节
;R2为要写的数据,R3为每字节的位数,这儿为8位
;返回时C为应答信号,可以不理会这个值
WRITE: MOV R3,#8
MOV A,R2
WRLOOP: CLR SCL2
RLC A
NOP
MOV SDA2,C
NOP
NOP
SETB SCL2
NOP
NOP
DJNZ R3,WRLOOP
CLR SCL2 ;以下处理AT24C02的应答信号
NOP
NOP
SETB SDA2 ;置高SDA,用作输入,如果AT24C02拉低,表示正确
NOP
NOP
SETB SCL2
NOP
NOP
MOV C,SDA2 ;读取应答信号
RET
;读一个字节
;返回时R2为读得的数
READ: MOV R3,#8
RDLOOP1: CLR SCL1
NOP
NOP
SETB SDA1 ;拉高SDA,用作输入
NOP
NOP
SETB SCL1
NOP
NOP
MOV C,SDA1
RLC A
DJNZ R3,RDLOOP1
MOV R2,A
RET
RDLOOP2: CLR SCL2
NOP
NOP
SETB SDA2 ;拉高SDA,用作输入
NOP
NOP
SETB SCL2
NOP
NOP
MOV C,SDA2
RLC A
DJNZ R3,RDLOOP2
MOV R2,A
RET
;延时,用以保证写操作完成,写地址信号不用延时
DELAY: MOV 0X31,#20
AA: MOV 0X32,#200
DJNZ 0X32,$
DJNZ 0X31,AA
RET
END |