发个我工作中常用的i2c的读和写子程序,初学者直接调用就可以了
1.要写的例子
。
。
mov A,0bH
mov WORD_ADDRESS,A ;要写入24c02d的地址是0bh
mov A,03H
mov WRITE_IN,A ;把要存放的内容(本例是数字3)暂时放在变量WRITE_IN里(这个变量在下面的写子程序里提到)
call ROM_WRITE ;调用写子程序
。 ;其它内容
。
2.要读的例子
。
。
mov A,70H ;要读24c02d的地址是70h
mov WORD_ADDRESS,A ;把要读的地址内容(本例是数字70h)暂时放在变量WORD_ADDRESS里(这个变量在下面的读子程序里提到
call ROM_READ ;调用写子程序
mov A,0AAH
xor A,READ_OUT ;从24c02地址70h读出的内容(即变量READ_OUT里的内容)与数字0AAH 进行xor操作
sz Z ;从地址70H读出的数据等于0AAH吗?
jmp start_BS ;是的,则跳到start_BS处
。 ;不是,则执行下面指令
。
;*******************************************
;*************************读24C02操作*******
ROM_READ PROC
clr read_out
clr sda_c
clr scl_c
set sda
call DELAY_8us
set scl
call DELAY_8us
clr sda ;起始信号
clr scl
set sda ;1
call DELAY_8us
set scl
call DELAY_8us
clr scl
clr sda ;0
set scl
call DELAY_8us
clr scl
set sda ;1
call DELAY_8us
set scl
call DELAY_8us
clr scl
clr sda ;0
set scl
call DELAY_8us
clr scl
clr sda ;a2=0
set scl
call DELAY_8us
clr scl
set scl
call DELAY_8us
clr scl
set scl
call DELAY_8us
clr scl
clr sda
set scl ;写模式
call DELAY_8us
clr scl
set sda_c
set scl
call DELAY_8us
wait:
sz sda ;等待应答信号
jmp wait
clr scl ;写读操作的地址
clr sda_c
mov a,08h
mov data_8,a
read_address_in:
clr sda
sz word_address.7
set sda
call DELAY_8us
set scl
call DELAY_8us
clr scl
rl word_address
sdz data_8
jmp read_address_in
set sda_c
set scl
call DELAY_8us
FDEV1:
sz sda ;等待应答信号
jmp fdev1
clr scl
clr sda_c
read_data:
set sda
call DELAY_8us
set scl
call DELAY_8us
clr sda ;起始信号
clr scl
set sda ;1
call DELAY_8us
set scl
call DELAY_8us
clr scl
clr sda ;0
set scl
call DELAY_8us
clr scl
set sda ;1
call DELAY_8us
set scl
call DELAY_8us
clr scl
clr sda ;0
set scl
call DELAY_8us
clr scl
clr sda ;a2=0
set scl
call DELAY_8us
clr scl
clr sda
set scl
call DELAY_8us
clr scl
clr sda
set scl
call DELAY_8us
clr scl
set sda ;读模式
call DELAY_8us
set scl
call DELAY_8us
clr scl
set sda_c
set SCL
call DELAY_8us
w_ack:
sz sda ;等待应答信号
jmp w_ack
clr scl
set sda_c
mov a,08h
mov data_8,a
random_out:
set scl
clr read_out.7
sz sda
set read_out.7
clr scl
rl read_out
sdz data_8
jmp random_out
clr sda_c
set sda
set scl
clr scl
clr sda ;停止信号
set scl
set sda
ret
ROM_READ ENDP
;***************************************************
;**************************延时8us秒****************
DELAY_8us:
mov a, 1
mov disp_ram,a
D8US:
sdz disp_ram
jmp D8US
ret
ret
|