;******************************************************************************
; uart转iic程序
;******************************************************************************
org 0000h
ajmp start
org 0100h
;=============================
; 初始化串口(UART)
;=============================
start:
mov scon,#50h ;serial mode1
mov tmod,#20h ;timer1 mode2
mov th1,#0fdh ;baud rate: 9600
mov tl1,#0fdh ;
setb tr1 ;tcon.6 timer1 connect and work
mov pcon,#00h ;smod=0
mov r0,#30h ;串口接收数据缓冲区起始地址
mov r1,#60h ;串口发送数据缓冲区起始地址
mov r6,#0 ;收数计数器
mov r5,#5
setb p1.4 ;程序指示灯
;===========================
; 等待UART发送数据
;===========================
receive1:
jbc ri,receive21 ;receive interrupt
ajmp receive1
receive21:
mov a,sbuf
inc r6 ;收数计数器
mov @r0,a
inc r0
dl:
mov 4ah, #02h ;延时,等待接受后面的数据
dl0:
mov 4bh, #0efh
dl1:
djnz 4bh,dl1
djnz 4ah,dl0
jbc ri,receive21 ;判断是否完成所有数据的接受
;======================================
; 判断读写及字节,字个数
;======================================
cjne r6,#2,begin
ajmp write00
begin:
mov a,33h ;判断字节数
anl a,#0fh ;cont3:0加1后给r2
add a,#1
mov r2,a
mov a,33h ;判断字操作,还是字节操作
mov c,acc.4
jc loop02 ;=1 word
loop08:
mov a,33h ;判断读写
mov c,acc.5
jc read ;=1 read
;=============================
; 写E2操作
;=============================
write00:
mov r0,#30h
write:
lcall bstart ;起动总线
mov a,@r0 ;发送器件从地址
inc r0
send12:
lcall sendbyte
lcall rack
dec r6 ;发送成功计数器-1
clr p1.3 ;完成第9个种
lcall nop10 ;等待芯片释放SDA
loop01:
mov a, @r0
inc r0
lcall sendbyte
lcall rack
clr p1.3
nop
nop
nop
djnz r6,loop01
lcall bstop
ajmp start
loop02:
ajmp word
;=================================
; 读E2操作
;=================================
read:
push 02h
mov r0,#30h
lcall bstart
loop03:
mov a,@r0
inc r0
lcall sendbyte
lcall rack
clr p1.3
dec r6 ;发送成功计数器-1
cjne r0,#34h,loop03 ;判断是否发送完控制字
;plcall bstop
lcall del00
lcall bstart ;重新起动总线
mov a,30h ;写芯片地址
add a,#1
lcall sendbyte
lcall rack
clr p1.3
rdn1:
lcall readbyte ;读操作开始
djnz r2,retrdn
lcall nack
clr p1.3 ;完成第9种
lcall nop10
mov @r1,a
lcall bstop
;inc r2 ;判断是否接受完成时R2减1,恢复r2值
ajmp send00
retrdn:
lcall tack
clr p1.3
lcall nop10
setb p1.2 ;主机应答后释放SDA
lcall nop10
mov @r1,a ;R1读数据缓冲区起始地址
inc r1
inc r2 ;判断是否接受完成时R2减1,恢复r2值
djnz r2,rdn1
lcall bstop ;并结束总线
send00:
pop 02h
mov r1,#60h
send: ;将iic接收到的E2数据通过串口发给PC
mov a,@r1
mov sbuf,a
inc r1
djnz r2,tint
tint00:
jbc ti,stop
ajmp tint00
stop:
ajmp start
tint:
jbc ti,send
ajmp tint
word:
mov a,r2
rl a
mov r2,a
ajmp loop08
;===================================
; 起始位,启动IIC
;===================================
bstart:
setb p1.3
setb p1.2
lcall nop10
clr p1.2
lcall nop10
clr p1.3
lcall nop10
ret
;==================================
; 单字节写
;==================================
sendbyte:
mov r3,#08h
loop04:
clr p1.3
lcall nop10
rlc a
mov p1.2,c
lcall nop10
cpl p1.3 ;p1.3=1
lcall nop20
djnz r3,loop04
nop
nop
ret
;====================================
; 单字节读
;====================================
readbyte:
mov r3,#08h
clr a
loop05:
clr p1.3
lcall nop20
setb p1.3
lcall nop10
setb p1.2 ;;
;lcall nop10 ;;
mov c,p1.2
rlc a
nop
nop
nop
nop
djnz r3,loop05
ret
;===================================
; 主机发送数据等待接收从机的应答
;===================================
rack: ; rack:
clr p1.3 ;p1.3=0 ; clr p1.3
setb p1.2 ; setb p1.2
lcall nop20 ; lcall nop20
setb p1.3 ; setb p1.3
lcall nop10 ; lcall nop10
loop06: ; jnb p1.2,loop10
setb p1.5 ;无应答指示 ; loop06:
jb p1.2,loop06 ;等待RTC应答 ; setb p1.7
clr p1.5 ; lcall nop20
lcall nop20 ; djnz r5,loop11
ret ; ajmp start
; loop11:
;=================================== ; jb p1.2,loop06
; 主机接收数据回复从机应答 ; loop10:
;=================================== ; clr p1.7
; ret
tack: ;
clr p1.3
lcall nop10
clr p1.2
lcall nop10
cpl p1.3
lcall nop20
ret
;====================================
; 发送非应答信号
;====================================
nack:
clr p1.3
lcall nop10
setb p1.2
lcall nop10
cpl p1.3
lcall nop20
ret
;====================================
; 停止位
;====================================
bstop:
clr p1.3
lcall nop10
clr p1.2
lcall del00
setb p1.3
lcall nop10
setb p1.2
lcall nop10
ret
;=========================================
; 延时子程序
;=========================================
nop10:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret
nop20:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret
del00:
mov r7,#40
loop07:
djnz r7 ,loop07
ret
//改动
tack: ;
clr p1.3
lcall nop10
setb p1.2
lcall nop10
clr p1.2
lcall nop10
setb p1.3
lcall nop20
ret
;====================================
; 发送非应答信号
;====================================
nack:
setb p1.3
lcall nop10
setb p1.2
lcall nop10
clr p1.2
lcall nop10
cpl p1.3
lcall nop20
ret