📄 i2c.asm
字号:
eeprom .section 'data'
scl equ pa.3 ;定义pa.3为时钟脚 pa--I/O寄存器
scl_c equ pac.3
sda equ pa.1 ;定义pa.1为数据脚 pac--I/O控制寄存器 输入相应位置一,否
sda_c equ pac.1 ;则清零
read_out equ [70h] ;读出数据暂存器
write_in equ [71h] ;写入数据暂存器
word_address equ [72h] ;读写地址暂存器
data_8 equ [73h]
delay_5 equ [77h]
delay equ [78h]
eepromc .section 'code'
org 00h
jmp start
org 020h
start:
mov a,55h
mov write_in,a ;写入55H
mov a,14h ;写入14H为要操作的eeprom的地址00010100
mov word_address,a
write_data:
bc sda_c
bc scl_c
bs p6,sda
bs p6,scl
bc p6,sda ;起始信号
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bc p6,sda ;a2,a1,a0=000
bs p6,scl ;0
bc p6,scl
bs p6,scl ;0 1-->0
bc p6,scl
bs p6,scl ;0
bc p6,scl
bs p6,scl ;写0,设定为写入模式
bc p6,scl
bs sda_c
bs p6,scl
wait_ack:
jbc p6,sda ;等待应答信号
jmp wait_ack
bc p6,scl
bc sda_c
mov a,08h ;设传输数据长度8
mov data_8,a
random_write:
bc p6,sda
jbc word_address,7
bs p6,sda
bs p6,scl
bc p6,scl
rlc word_address
djz data_8
jmp random_write
bs sda_c
bs p6,scl
fdev:
jbc p6,sda ;等待应答信号
jmp fdev
bc p6,scl
bc sda_c
mov a,08h
mov data_8,a
dtat_in:
bc p6,sda
jbc write_in,7
bs p6,sda
bs p6,scl
bc p6,scl
rlc write_in
djz data_8
jmp dtat_in
bs p6,scl
bc p6,scl
bc p6,sda
bs p6,scl
bs p6,sda ;停止信号
mov a,30h
mov delay_5,a
mov a,05h
mov delay,a
delay1:
djz delay_5
jmp delay1
djz delay
jmp delay1
;_______________________________
;读
do_read:
clr read_out
bc sda_c
bc scl_c
bs p6,sda
bs p6,scl
bc p6,sda ;起始信号
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bc p6,sda
bs p6,scl ;a0,a1,a2=0
bc p6,scl
bs p6,scl ;0
bc p6,scl
bs p6,scl ;0
bc p6,scl
bc p6,sda ;写模式,写地址
bs p6,scl
bc p6,scl
bs sda_c
bs p6,scl
wait:
jbc p6,sda
jmp wait
bc p6,scl
mov a,08h
mov data_8,a
bc sda_c
read_address_in:
bc p6,sda
jbc word_address,7
bs p6,sda
bs p6,scl
bc p6,scl
rlc word_address
djz data_8
jmp read_address_in
bs sda_c
bs p6,scl
ack:
jbc p6,sda
jmp ack
cbc p6,scl
bc sda_c
read_data:
bs p6,sda
bs p6,scl
bc p6,sda ;start bit
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bs p6,sda ;1
bs p6,scl
bc p6,scl
bc p6,sda ;0
bs p6,scl
bc p6,scl
bc p6,sda ;a2,a1,a0
bs p6,scl
bc p6,scl
bs p6,scl
bc p6,scl
bs p6,scl
bc p6,scl
bs p6,sda ;读模式
bs p6,scl
bc p6,scl
bs sda_c
;set scl
w_ack:
jbc p6,sda
jmp w_ack
;clr scl
bs p6,scl ;down_edge data out
mov a,08h
mov data_8,a
bs sda_c
random_out:
bs p6,scl
call del
bc p6,scl
call del
rlc read_out
bc read_out.0
jbc sda
bs read_out.0
djz data_8
jmp random_out
mov a,read_out ;modify
mov [41h],a ;modify
bc sda_c ;for stop
bs p6,scl
bs p6,sda
bc p6,scl
bc p6,sda
bs p6,sda ;stop end
mov a,055h
xor a,read_out
;sz acc
jbc stts,z
jmp fail_out
jmp OK_end
fail_out:
ret
ok_end:
ret
del: ;for delay
nop
nop
nop
ret
;更改:在读取数据时应该从低位存入,逐次左移
;注意:读取操作的时钟频率不应该太高
;在演示中系统时钟频率为1.5MHz,如果系统时钟频率比较高的话,
;则应该加上延时操作,否则会出现读取数据错误.
;在HT48R30A-1上通过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -