?? i2c.asm
字號:
;I2C 讀寫程序
;BYTE WRITR AND RANDOM READ (字節寫,任意讀)
;用來寫一個指定的數據到一個指定的地址,或用來讀一個指定的地址的數據。
;晶振4MHZ,HT46R47
#include ht46r47.inc
data .section 'data'
WORD_ADDRESS EQU [071H] ;寫入或讀出數據的存儲器地址
WRITE_IN EQU [072H] ;寫入存儲中的數據暫存器
READ_OUT EQU [073H] ;讀出存儲器中的數據暫存器
DATA_8 EQU [074H] ;移位用臨時變量
COUNT1 EQU [075H] ;定時用臨時變量
COUNT2 EQU [076H] ;定時用臨時變量
TIME_6US MACRO ;宏延遲6US,
NOP
NOP
NOP
NOP
NOP
NOP
ENDM
;-----------------------------------------------
code .section at 0 'code'
SCL EQU PA.0 ;存儲器CLK
SCL_C EQU PAC.0
SDA EQU PB.3 ;存儲器DATA
SDA_C EQU PBC.3
org 00h
nop
nop
nop
jmp star
org 04h ;外部中斷
RETI
org 08h
reti ;定時/計數中斷
ORG 0CH
RETI ;AD中斷
star:
clr intc ;清除中斷控制寄存器
clr tmrc ;清除定時/計數控制寄存器
clr tmr ;清除定時/計數器
CLR STATUS
clr pac ;將PA口設為輸出,防止輸入懸空
clr pbc ;將PB口設為輸出,防止輸入懸空
clr pdc ;將PD口設為輸出,防止輸入懸空
clr pa ;將PA口設為L,
clr pb ;將PB口設為L
CLR PD
MAIN:
MOV A,02EH
MOV WRITE_IN,A ;要寫入的數據
MOV A,001H
MOV WORD_ADDRESS,A ;要將數據存入的地址位置,或要從那地址讀數據
CALL WRITE_ROM
CALL READ_ROM
nop
MOV A,READ_OUT ;檢驗寫數據是否正確
NOP
JMP MAIN
;--------------------------------------------------------------------------
WRITE_ROM:
;寫ROM;
;MOV A,001H
;MOV WRITE_IN,A ;要寫入的數據
;MOV A,001H
;MOV WORD_ADDRESS,A ;要把數據寫在ROM的什么位置
;START......ACK......寫地址......ACK......寫數據......ACK......STOP (5MS--24LC02B)寫數據時間
;START......ACK......寫地址......ACK......寫數據1......ACK......寫數據2......STOP (5MS--24LC02B)寫數據時間
CLR SDA_C ;設SDA為輸出
CLR SCL_C ;設SCL為輸出
SET SDA
SET SCL
TIME_6US
CLR SDA ;START
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US
SET SCL
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;A2=0
TIME_6US ;為零時可不用
SET SCL
TIME_6US
CLR SCL
CLR SDA ;A1=0
TIME_6US ;為零時可不用
SET SCL
TIME_6US
CLR SCL
CLR SDA ;A0=0
TIME_6US ;為零時可不用
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0 寫模式
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
SET SDA_C ;設IC地址ACK ;設SDA為輸入模式 ;之前地址對會自動為零,若不對會馬上為高,后面程序執行不下去
SET SCL
IC_ADDRESS_ACK: ;等待應答信號,確認IC地址是否正確 ;判斷地址對不對,對-過關,不對-死機
SZ SDA
JMP IC_ADDRESS_ACK
CLR SCL ; 此語句之后,SDA會很快的自動產生一個上升沿
CLR SDA_C ;設輸出為L SDA產生下降沿
MOV A,08H ;設傳輸數據長度
MOV DATA_8,A
WRITE_ADDRESS_IN: ;輸入寫入地址 ;寫地址
CLR SDA
SZ WORD_ADDRESS.7
SET SDA
TIME_6US
SET SCL
TIME_6US
CLR SCL
RL WORD_ADDRESS
SDZ DATA_8
JMP WRITE_ADDRESS_IN
SET SDA_C ;設寫地址ACK ;設SDA為輸入模式
SET SCL
WRITE_ADDRESS_ACK: ;確認寫地址是否正確;等待應答信號
SZ SDA
JMP WRITE_ADDRESS_ACK
CLR SCL
CLR SDA_C ;設輸出為L
MOV A,08H ;設傳輸數據長度
MOV DATA_8,A
WRITE_DATA_IN: ;寫數據
CLR SDA
SZ WRITE_IN.7
SET SDA
TIME_6US
SET SCL
TIME_6US
CLR SCL
RL WRITE_IN
SDZ DATA_8
JMP WRITE_DATA_IN
SET SDA_C ;設寫數據ACK ;設SDA為輸入模式
SET SCL
WRITE_DATA_ACK: ;確認寫數據是否正確;等待應答信號
SZ SDA
JMP WRITE_DATA_ACK
CLR SCL
CLR SDA_C
CLR SDA
SET SCL
TIME_6US
SET SDA ;STOP
TIME_6US
CLR SCL ;為了結束置低
CLR SDA ;為了結束置低
;DELAY5MS: ;為了給寫足夠的時間,24LC02B=5MS ;延時 (2*R2+3)*R1+2=(2*27+3)*98+2=6000us 約6ms
mov a,27
mov count1,a
ROM_D1:
mov a,98
mov count2,a
ROM_D2:
sdz count2
jmp ROM_D2
sdz count1
jmp ROM_D1
RET
;---------------------------------------------------------
READ_ROM:
;讀ROM
;MOV A,001H
;MOV WORD_ADDRESS,A ;讀地址
; START...IC認證...ACK...寫地址......ACK...START...IC認證...ACK...讀數據......STOP
CLR SDA_C ;設SDA為輸出
CLR SCL_C ;設SCL為輸出
SET SDA
SET SCL
TIME_6US
CLR SDA ;START
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US ;可不用(24AA02工作在2.5V以下時要用)以下同
SET SCL
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
; CLR SDA ;A2=0 ;可以不用,已經為L
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
; CLR SDA ;A1=0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
; CLR SDA ;A0=0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0 寫模式
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
SET SDA_C ;設IC地址ACK ;設SDA為輸入模式
;TIME_6US
SET SCL
;TIME_6US
R_IC_ACK: ;等待ACK應答信號,確認IC地址是否正確
SZ SDA
JMP R_IC_ACK
CLR SCL
CLR SDA_C ;設輸出為L
MOV A,08H ;設傳輸數據長度
MOV DATA_8,A
READ_ADDRESS_IN: ;讀入地址 ;讀地址
CLR SDA
SZ WORD_ADDRESS.7
SET SDA
TIME_6US
SET SCL
TIME_6US
CLR SCL
RL WORD_ADDRESS
SDZ DATA_8
JMP READ_ADDRESS_IN
SET SDA_C ;設輸入
SET SCL
R_ADDRESS_ACK:
SZ SDA ;等待ACK應答信號,確認讀地址是否正確 SZ SDA
JMP R_ADDRESS_ACK
CLR SCL
CLR SDA_C ;設SDA為輸出
REREADROM:
SET SDA
SET SCL
TIME_6US
CLR SDA ;START
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
SET SDA ;1
TIME_6US
SET SCL
TIME_6US
CLR SCL
CLR SDA ;0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
;CLR SDA ;A2=0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
;CLR SDA ;A1=0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
;CLR SDA ;A0=0
TIME_6US ;可不用
SET SCL
TIME_6US
CLR SCL
SET SDA ;1 讀模式
TIME_6US
SET SCL
TIME_6US
CLR SCL
SET SDA_C ;設IC地址ACK ;設SDA為輸入模式
SET SCL
RE_IC_ACK:
SZ SDA ;等待ACK應答信號,確認IC地址是否正確
JMP RE_IC_ACK
MOV A,08H
MOV DATA_8,A
RE_DATA_OUT: ;讀數據輸出
CLR SCL
TIME_6US
CLR READ_OUT.7
SZ SDA
SET READ_OUT.7
TIME_6US
SET SCL
TIME_6US
RL READ_OUT
SDZ DATA_8
JMP RE_DATA_OUT
CLR SCL
CLR SDA_C
CLR SDA
SET SCL
TIME_6US
SET SDA ;STOP
TIME_6US
CLR SCL ;為了結束置低
CLR SDA ;為了結束置低
RET
;---------------------------------------
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -