wrloop:Mov a,@r0
Mov r7,a
Inc r0
Lcall send
Djnz r5, wrloop ;把3个字节的数据发送出去
lcall stop ;停止
lcall d1s
mov r5,#Numdata ; 要读取的字节数重新赋值
Mainre:lcall start ;启动
Mov r7,#0a0h
Lcall send ;发送写24C02的寻址字节
Mov r7,#2402data
Lcall send ;发接受缓冲区首址
Lcall start ; 再次启动
Mov r7,#0a1h
Lcall send ;发送读24C02的寻址字节
Reloop: Lcall read ;调用读取一个字节数据的子程序
mov p0,r7 ;把读进来的数送到p0口显示
lcall d1s
lcall d1s
Djnz r5,reloop
Lcall stop ;3字节读取完毕发出停止信号
Ajmp $
init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码
mov 30h,#48h
mov 31h,#0ebh
mov 32h,#52h
ret
start: setb sda ;启动信号子程序,大家可以参考开始信号的时序图
setb scl
lcall d5u
clr sda
lcall d5u
clr scl
ret
stop: clr sda ;停止信号子程序
setb scl
lcall d5u
setb sda
lcall d5u
clr sda
clr scl
ret
;send是发送一个字节子程序
send: mov r6,#08h
mov a,r7 ;要发送的数在r7中
sendlop1 : rlc a ;左环移,把A的最高位移入cy
mov sda,c ;把cy的值通过sda发送出去
setb scl ;在scl上产生一个时钟
lcall d5u
clr scl
djnz r6, sendlop1 ;重复8次,发送一个字节
;cack是检查应答信号的子程序
cack: setb sda ;主机首先拉高sda
setb scl ;发出一个时钟
lcall d5u
sendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答
jc sendlop2
clr scl ;接受到应答位,结束时钟
ret
read: mov r6,#08h ;读取一个字节子程序
readlop1: setb sda ;置sda为输入方式
setb scl ;发出一个时钟
lcall d5u
mov c,sda ;读入sda状态
rlc a ;把该位的状态移入A中
clr scl ;结束时钟
djnz r6,readlop1 ;重复8次,读入一个字节
mov r7,a ;读进来的数放在r7中
;sack是发送应答位子程序
sack: clr sda ;拉低sda线
setb scl ;发出时钟信号
lcall d5u
clr scl
setb sda
ret
d5u: nop ;延时5us子程序
nop
nop
nop
nop
ret
d1s: mov r1,#100 ;延时1s子程序
del1: mov r4,#20
del2: mov r3,#0ffh
del3: djnz r3,del3
djnz r4,del2
djnz r1,del1
ret
end
大家把这个程序下载到测试板上面,发现数码管依次显示数字0、1、2