?? i2c.asm
字號:
;********************************************************
;名稱: I2C軟件模擬程序包 *
;語言: 51匯編 *
;日期: 2007-12-15 *
;描述: 適用于PHILIPS的LPC900,最高晶振頻率為12MHz. *
; 符合100Kbit/S總線標準模式. *
;********************************************************
;需定義的:
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;I2C_SDA BIT ;I2C數據線 <
;I2C_SCL BIT ;I2C時鐘線 <
;I2C_ACK BIT ;應答標記(為“0”表示非應答,為“1”表示應答) <
;I2C_SLA DATA ;器件從地址 <
;I2C_SUBA DATA ;器件子地址 <
;I2C_NUM DATA ;讀/寫的字節數 <
;I2C_MTD DATA ;發送數據緩沖首地址 <
;I2C_MRD DATA ;接收數據緩沖首地址 <
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;可調用和增減的子程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;I2C_SEND_NOSUB 無子地址器件發送1個字節子程序 >
;I2C_RCV_NOSUB 無子地址器件接收1個字節子程序 >
;I2C_SEND_NN0SUB 無子地址器件發送N字節數據子程序 >
;I2C_RCV_NN0SUB 無子地址器件接收N字節數據子程序 >
;I2C_SEND_STR 有子地址器件發送N字節數據子程序 >
;I2C_RCV_STR 有子地址器件接收N字節數據子程序 >
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;************
;外部子程序:*
;************
;無子地址器件發送1個字節子程序
;//////////////////////////////////////////////////////////////////////////////////
;描述:發送無子地址器件的1字節數據
I2C_SEND_NOSUB: PUSH ACC
LCALL I2C_START
MOV ACC,I2C_SLA
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SNSUB_END
POP ACC
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
LCALL I2C_STOP
RET
SNSUB_END: POP ACC
LCALL I2C_STOP
RET
;//////////////////////////////////////////////////////////////////////////////
;無子地址器件接收1個字節子程序
;/////////////////////////////////////////////////////////////////////////////
;描述:接收無子地址器件的1個字節數據
I2C_RCV_NOSUB: LCALL IC2_START
MOV A,I2C_SLA
INC A
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,RNSUB_END
LCALL I2C_RCV_BYTE
LCALL I2C_MNACK
RNSUB_END: LCALL I2C_STOP
RET
;////////////////////////////////////////////////////////////////////////////
;無子地址器件發送N字節數據子程序
;////////////////////////////////////////////////////////////////////////////
;描述:向無子地址器件發送N字節數據
I2C_SEND_NN0SUB:MOV A,I2C_NUM
MOV R0,A
MOV A,I2C_SLA
LCALL I2C_START
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SNNSUB_END
MOV R1,#I2C_MTD
SNNSUB1: MOV A,@R1
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SNNSUB_END
INC R1
DJNZ R0,SNNSUB1
SNNSUB_END: LCALL I2C_STOP
RET
;////////////////////////////////////////////////////////////////////////
;無子地址器件接收N字節數據子程序
;//////////////////////////////////////////////////////////////////////////
;描述:接收無子地址器件的N字節數據。
I2C_RCV_NNOSUB: MOV A,I2C_NUM
MOV R0,A
MOV A,IC2_SLA
INC A
LCALL I2C_START
LCALL I2C_CACK
JNB I2C_ACK,RNNSUB_END
MOV R1,I2C_MDR
RNNSUB1: LCALL I2C_RCV_BYTE
MOV @R1,A
DJNZ R0,RNNSUB2
LCALL I2C_MNACK
LCALL I2C_STOP
RET
RNNSUB2: LCALL I2C_MACK
INC R1
SJMP RNNSUB1
;/////////////////////////////////////////////////////////////////////////
;有子地址器件發送N字節數據子程序
;////////////////////////////////////////////////////////////////////////
;描述:向有子地址器件的指定地址發送N字節數據
I2C_SEND_STR: MOV A,I2C_NUM
MOV R0,A
MOV A,I2C_SLA
LCALL I2C_START
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SS_END
MOV A,I2C_SUBA
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SS_END
MOV R1,I2C_MTD
SS1: MOV A,@R1
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,SS_END
INC R1
DJNZ R0,SS1
SS_END LCALL I2C_STOP
RET
;////////////////////////////////////////////////////////////////////////
;有子地址器件接收N字節數據子程序
;////////////////////////////////////////////////////////////////////////
;描述:接收有子地址器件指定的N字節數據
I2C_RCV_STR: MOV A,I2C_NUM
MOV R0,A
MOV A,I2C_SLA
LCALL I2C_START
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,RS_END
MOV A,I2C_SUBA
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
MOV A,I2C_SLA
INC A
LCALL I2C_START
LCALL I2C_SEND_BYTE
LCALL I2C_CACK
JNB I2C_ACK,RS_END
MOV R1,I2C_MRD
RS1: LCALL I2C_RCV_BYTE
MOV @R1,A
DJNZ R0,RS2
LCALL I2C_MNACK
RS_END: LCALL I2C_STOP
RET
RS2: INC R1
LCALL I2C_MACK
SJMP RS1
;////////////////////////////////////////////////////////////////////////
;************
;內部子程序 *
;************
;延時子程序(延時5uS)
;............................................................................
I2C_DELAY: MOV R0,#15
DJNZ R0,$
RET
;............................................................................
;啟動I2C總線子程序
;............................................................................
;描述:SDA在SCL為高時由高到低跳變.
I2C_START: SETB I2C_SDA
NOP
SETB I2C_SCL
LCALL I2C_DELAY ;起始條件建立時間大于4.7uS
CLR I2C_SDA
LCALL I2C_DELAY ;起始條件鎖定時間大于4uS
CLR I2C_SCL ;鉗住總線,準備發送數據
NOP
RET
;............................................................................
;結束總線子程序
;............................................................................
;描述:SDA在SCL為高時由低向高跳變.
I2C_STOP: CLR I2C_SDA
NOP
SETB I2C_SCL
LCALL I2C_DELAY ;總線結束時間大于4uS
SETB I2C_SDA
LCALL I2C_DELAY ;保證結束信號和起始信號空閑時間大于4.7uS
RET
;...............................................................................
;發送應答信號子程序
;...............................................................................
;描述:應答信號由"接收器"產生;每成功接收到1個字節后,如還需要接收數據則發送
; 一個應答;"接收器"在第9個時鐘周期將SDA拉低(應答).
I2C_MACK: CLR I2C_SDA
NOP
NOP
SETB I2C_SCL
LCALL I2C_DELAY ;保持數據時間大于4.7uS
CLR I2C_SCL
NOP
NOP
RET
;..................................................................................
;發送非應答信號子程序
;..................................................................................
;描述: 應答信號由“接收器”產生;每成功接收到1個字節后,如不再接收新發送
; 一個非應答;"接收器"在第9個時鐘周期將SDA拉高(非應答).
I2C_MNACK: SETB I2C_SDA
NOP
NOP
SETB I2C_SCL
LCALL I2C_DELAY ;保持數據時間大于4.7uS
CLR I2C_SCL
NOP
NOP
RET
;..................................................................................
;檢查應答信號子程序
;..................................................................................
;描述:獲得"接收器"發出的應答或非應答信號;如應答ACK=1,否則(非應答)ACK=0.
I2C_CACK: SETB I2C_SDA
NOP
NOP
SETB I2C_SCL
CLR I2C_ACK
NOP
NOP
MOV C,SDA
JC CACK_END
SETB I2C_ACK ;應答
CACK_END: CLR I2C_SCL
NOP
NOP
RET
;..................................................................................
;發送一字節數據
;..................................................................................
;描述:將ACC中的數據發送出去.
I2C_SEND_BYTE: MOV R0,#8
SB3: RLC A
JC SB1
SJMP SB0
SB4: DJNZ R0,
NOP
NOP
RET
SB1: SETB I2C_SDA
NOP
NOP
SETB I2C_SCL
LCALL I2C_DELAY
CLR I2C_SCL
SJMP SB4
SB0: CLR I2C_SDA
NOP
NOP
SETB I2C_SCL
LCALL I2C_DELAY
CLR I2C_SCL
SJMP SB4
;................................................................................
;接收一字節數據
;................................................................................
;描述:將接收到的數據存入ACC中.
I2C_RCV_BYTE: MOV R0,#8
MOV A,#0
RB1: SETB I2C_SDA
NOP
NOP
SETB I2C_SCL
NOP
NOP
MOV C,I2C_SDA
RLC A
NOP
NOP
CLR I2C_SCL
NOP
NOP
DJNZ R0,RB1
RET
;..................................................................................
;********************************************************************************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -