?? 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 + -