org 0000h
sbit SDA = P1^1; // connect to SDA pin (Data)
sbit SCL = P1^0; // connect to SCL pin (Clock)
#define ACK 1
#define NO_ACK 0
#define ACK_Bit NO_ACK
main:
acall serial_init
mov a,#0Ch ;// clear hyper terminal
acall TX
mov r5,#00h ; High Byte
mov r6,#03h ; Low Byte
mov r7,#99h ; Data
acall writeBYTE
acall delay
mov r5,#00h ; High Byte
mov r6,#02h ; Low Byte
mov r7,#88h ; Data
acall writeBYTE
acall delay
mov r5,#00h ; High Byte
mov r6,#01h ; Low Byte
mov r7,#05h ; Data
acall writeBYTE
acall delay
mov r5,#00h
mov r6,#03h
mov dptr,#addr3
acall tx_string
acall readBYTE
acall transmit
mov a,#0Ah
acall TX
mov r5,#00h
mov r6,#02h
mov dptr,#addr2
acall tx_string
acall readBYTE
acall transmit
mov a,#0Ah
acall TX
mov r5,#00h
mov r6,#01h
mov dptr,#addr1
acall tx_string
acall readBYTE
acall transmit
mov a,#0Ah
acall TX
sjmp $
start:
setb SDA
setb SCL
jnb SDA,exit
jnb SCL,exit2
nop
clr SDA
nop
nop
nop
nop
nop
clr SCL
clr cy
sjmp exit2
exit: setb cy
exit2: ret
stop:
clr SDA
nop
nop
setb SCL
nop
nop
nop
nop
setb SDA
ret
writeI2C:
mov r4,#8
again: mov a,r0
anl a,#80h
jnz one ;;;;;;;;;;;;;;;;;;;;;
clr SDA
sjmp out
one: setb SDA
out: setb SCL
clr SCL
mov a,r0
rl a
mov r0,a
djnz r4,again
setb SCl
nop
nop
clr SCL
ret
readI2C:
setb SDA
mov r4,#8
mov r1,#00h
again2: setb SCL
mov a,r1
; rl a
jb SDA,loop
clr acc.7
sjmp loop2
loop:setb acc.7
loop2:rl a
mov r1,a
clr SCL
nop
djnz r4,again2
jnb ACK_Bit,no
clr SDA
sjmp out2
no:
setb SDA
out2:
nop
nop
setb SCL
nop
nop
nop
nop
clr SCL
ret
readBYTE:
acall start
mov r0,#0A0h
acall writeI2C
mov a,r5
mov r0,a
acall writeI2C
mov a,r6
mov r0,a
acall writeI2C
acall start
mov r0,#0A1h
acall writeI2C
acall readI2C
acall stop
mov a,r1
ret
writeBYTE:
acall start
mov r0,#0A0h
acall writeI2C
mov a,r5
mov r0,a
acall writeI2C
mov a,r6
mov r0,a
acall writeI2C
mov a,r7
mov r0,a
acall writeI2C
acall stop
ret
transmit:
mov a,r1
anl a,#0f0h
swap a
mov r2,a
clr cy
subb a,#9
jc add30
jz add30
mov a,r2
add a,#37h
sjmp tr
add30: mov a,r2
add a,#30h
tr:acall TX
mov a,r1
anl a,#0fh
mov r2,a
clr cy
subb a,#9
jc add30a
jz add30a
mov a,r2
add a,#37h
sjmp tr2
add30a: mov a,r2
add a,#30h
tr2:acall TX
/*jnc add37
add30: mov a,r2
add a,#30h
sjmp loop3
add37:jz add30
mov a,r2
add a,#37h
loop3:acall TX
mov a,r1
anl a,#0fh
mov r2,a
clr cy
subb a,#9
jnc add37b
add30a: mov a,r2
add a,#30h
sjmp loop4
add37b:jz add30a
mov a,r2
add a,#37h
loop4: acall TX*/
ret
/////////////////////////////////////////////////////////////////////////////
/* SERIAL COMMUNICATION ROUTINES */
////////////////////////////////////////////////////////////////////////////
serial_init:
mov TMOD,#20h
mov SCON,#50h
mov TH1,#-3
setb TR1
ret
TX:
clr ti
mov sbuf,a
jnb ti,$
ret
RX: jnb ri,$
clr ri
mov a,sbuf
ret
tx_string:
push acc
ag:
clr a
movc a,@a+dptr
inc dptr
cjne a,#0h,ag1
pop acc
ret ;return if end of String
ag1: lcall TX
sjmp ag
//////////////////////////////////////////////////////////////
delay:
mov r2,#025h
here:mov r3,#07fh
djnz r3,$
djnz r2,here
ret
addr1: db "Address 0x0001:",0
addr2: db "Address 0x0002:",0
addr3: db "Address 0x0003:",0
end

No comments:
Post a Comment