;SCL EQU P17
;D15US,D1MS子程序分别为15uS和1mS延时程序,请根据你的晶体自行编写。
;
;24C01写初始(传递的数据在R7中)
;
sda bit p17
scl bit p16
org 0000
ajmp star
org 00040
star:
mov p3,#00H
mov 30H,#01H
mov 31h,#88h
nop
nop
nop
acall at2401w
nop
nop
nop
nop
nop
ajmp $
AT2401W: MOV P1,#0FFH ;置SDA/SCL=1
LCALL R2STAR ;写开始状态字
MOV R7,#10100000B ;SET 2401=写
LCALL R2SEND ;送
MOV ACC,30H ;30H指向2401数据的起始地址
MOV R7,ACC ;将要写2401的起始地址送到R7
LCALL R2SEND
MOV ACC,31H ;取第一个号
MOV R7,ACC ;数据传递到R7
LCALL R2SEND ;写具体号码
LCALL R2STOP ;停止
LCALL D1MS ;等待一定时间使24C01内部写完成
RET
;------------------------------------------
;写到2401 本程序开始及结束SDA & SCL 均=0 ,发送数据在R7
;------------------------------------------
R2SEND: PUSH ACC ;保存ACC
MOV ACC,R7 ;将R7中的数发送出去
MOV R6,#08H ;往2401发送数据
R2SLOP1: RLC A ;将ACC中的数据移到数据线上
MOV SDA,C ;送出数据
LCALL D15US
SETB SCL ;发送串行时钟进行写 *** 作
LCALL D15US
CLR SCL
DJNZ R6,R2SLOP1 ;串行发送8 BIT
SETB SDA ;准备接收ACK
LCALL D15US
SETB SCL ;接收ACK的时钟
LCALL D15US
R2SLOP2: MOV C,SDA ;写完后等待确认信号 ACK
JC R2SLOP2
CLR SCL ;为下一步其它 *** 作做准备
CLR SDA
POP ACC ;还原ACC
LCALL D1MS ;等待内部写完
RET
;
;2401读初始
;------------------------------------------------------------------
AT2401RC: LCALL R2STAR ;写状态字
MOV R7,#10100000B ;SET 2401=WRI
LCALL R2SEND ;送出状态字
MOV A,30H ;上程序传来的读取地址
MOV R7,A ;地址数据送R7
LCALL R2SEND ;送出数据
MOV P1,#11111111B ;保证SDA/SCL起始=1
LCALL R2STAR
MOV R7,#10100001B ;0A1H ;读状态
LCALL R2SEND
LCALL R2READ ;读所需的数
LCALL R2STOP
RET
;
;设置开始 ,初始SDA &SCL=1,结束 SDA & SCL=0
;--------------------------------------------------------------
R2STAR: LCALL D15US ;对2401 *** 作开始
CLR SDA ;在SCL=1时,SDA由1变为0表示开始
LCALL D15US
CLR SCL
LCALL D15US
RET
;----------------------------------------------------------------
;读取2401数据
;----------------------------------------------------------------
R2READ: PUSH ACC ;保存ACC
MOV R6,#08H
R2RLOP1: SETB SDA ;置数据线=1
LCALL D15US
SETB SCL ;输出一个串行时钟
LCALL D15US
MOV C,SDA ;读数据线上的数据到 C
RLC A ;移到 ACC
LCALL D15US
CLR SCL
DJNZ R6,R2RLOP1 ;读 8 BIT 数据
LCALL D15US
CLR SDA
MOV R7,ACC ;将接收到的数据保存到R7
POP ACC ;还原ACC
RET
;----------------------------------------------------------------
;设置结束 在SEND & READ 后DSA & SCL均=0 ,本程序退出后 SDA & SCL=1
;----------------------------------------------------------------
R2STOP: LCALL D15US ;对2401 *** 作结束
SETB SCL ;在SCL=1时,SDA由0变为1表示结束
LCALL D15US
SETB SDA
LCALL D15US
RET
d1ms: mov r2,#0F8h
a_1: djnz r2,a_1
nop
ret
d15us: mov r3,#0fh
b_1: djnz r3,B_1
ret
上面的程序是把C51,,31H的88数写在24CXX的01地址上,
用的是6M的晶体,用P1。7==SDA数据线
P1。6是SCL时钟线
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)