?? i2c.asm
字號:
ACK BIT 10H ;應答標志位
SLA DATA 50H ;器件地址字
SUBA DATA 51H ;器件子地址
NUMBYTE DATA 52H ;讀/寫字節數
SDA BIT P1.5
SCL BIT P1.4 ;I2C總線定義
MTD EQU 30H ;發送數據緩存區首地址(30H-3FH)
MRD EQU 40H ;接收數據緩存區首地址(40H-4FH)
AJMP MAIN
ORG 80H
;*********************************************************************
;名稱:IWRNBYTE
;描述:向器件指定子地址寫N個數據
;入口參數:器件地址字SLA,子地址SUBA,發送數據緩沖區MTD,發送字節數NUMBYTE
;*********************************************************************
IWRNBYTE:
MOV R3,NUMBYTE
LCALL START ;啟動總線
MOV A,SLA
LCALL WRBYTE ;發送器件地址字
LCALL CACK
JNB ACK,RETWRN ;無應答則退出
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYTE ;開始寫入數據
LCALL CACK
JNB ACK,IWRNBYTE
INC R1
DJNZ R3,WRDA ;判斷是否寫完
RETWRN: LCALL STOP
RET
;*********************************************************************
;名稱:IRDNBYTE
;描述:從器件指定子地址讀取N個數據
;入口參數:器件地址字SLA,子地址SUBA,接收數據緩存區MRD,接收字節數NUMBYTE
;*********************************************************************
IRDNBYTE:
MOV R3,NUMBYTE
LCALL START
MOV A,SLA
LCALL WRBYTE ;發送器件地址字
LCALL CACK
JNB ACK,RETRDN
MOV A,SUBA ;指定子地址
LCALL WRBYTE
LCALL CACK
LCALL START ;重新啟動總線
MOV A,SLA
INC A ;準備進行讀操作
LCALL WRBYTE
LCALL CACK
JNB ACK,IRDNBYTE
MOV R1,#MRD
RON1: LCALL RDBYTE ;讀操作開始
MOV @R1,A
DJNZ R3,SACK
LCALL MNACK ;最后一字節發非應答位
RETRDN: LCALL STOP
RET
SACK: LCALL MACK
INC R1
SJMP RON1
;*********************************************************************
;名稱:STRRT
;描述:啟動I2C總線子程序—發送I2C總線起始條件
;*********************************************************************
START: SETB SDA ;發送起始條件數據信號
NOP ;起始條件建立時間大于4.7us
SETB SCL ;發送起始條件的時鐘信號
NOP
NOP
NOP
NOP
NOP ;起始條件鎖定時間大于4.7us
CLR SDA ;發送起始信號
NOP
NOP
NOP
NOP ;起始條件鎖定時間大于4.7us
CLR SCL ;鉗住I2C總線,準備發送或接收數據
NOP
RET
;*********************************************************************
;名稱:STOP
;描述:停止I2C總線子程序—發送I2C總線停止條件
;*********************************************************************
STOP: CLR SDA ;發送停止條件的數據信號
NOP
NOP
SETB SCL ;發送停止條件的時鐘信號
NOP
NOP
NOP
NOP
NOP ;起始條件建立時間大于4.7us
SETB SDA ;發送I2C總線停止信號
NOP
NOP
NOP
NOP
NOP ;延遲時間大于4.7us
RET
;*********************************************************************
;名稱:MACK
;描述:發送應答信號子程序
;*********************************************************************
MACK: CLR SDA ;將SDA置0
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP ;保持數據時間,大于4.7us
CLR SCL
NOP
NOP
RET
;*********************************************************************
;名稱:MNACK
;描述:發送非應答信號子程序
;*********************************************************************
MNACK: SETB SDA ;將SDA置1
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL ;保持數據時間,大于4.7us
NOP
NOP
RET
;*********************************************************************
;名稱:CACK
;描述:檢查應答位子程序,返回值:ACK=1時表示有應答
;*********************************************************************
CACK: SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判斷應答位
CEND: NOP
CLR SCL
NOP
RET
;*********************************************************************
;名稱:WRBYTE
;描述:發送字節子程序,字節數據放入ACC
;*********************************************************************
WRBYTE: MOV R0,#08H
WLP: RLC A ;取數據位
JC WRI
SJMP WRO ;判斷數據位
WLP1: DJNZ R0,WLP
NOP
RET
WRI: SETB SDA ;發送1
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
WRO: CLR SDA ;發送0
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;*********************************************************************
;名稱:RDBYTE
;描述:讀取字節子程序,讀出的數據存放在ACC
;*********************************************************************
RDBYTE: MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL ;時鐘線為高,接收數據位
NOP
NOP
MOV C,SDA ;讀取數據位
MOV A,R2
CLR SCL ;將SCL拉低,時間大于4.7us
RLC A ;進行數據位的處理
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP ;未夠8位,繼續讀入
RET
MAIN: MOV R4,#0F0H ;延時,等待其它芯片復位完成
DJNZ R4,$
;發送數據緩存區初始化,將16個連續字節分別賦值為00H到0FH
MOV A,#0
MOV R0,#30H
S1: MOV @R0,A
INC R0
INC A
CJNE R0,#40H,S1
;向24C01C中寫數據,數據存放在24C01C中30H開始的16個字節中
MOV SLA,#0A0H ;24C01C地址字,寫操作
MOV SUBA,#30H ;目標地址
MOV NUMBYTE,#16 ;字節數
LCALL IWRNBYTE ;寫數據
DELAY: MOV R5,#20
D1: MOV R6,#248
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
;從24C01C中讀數據,數據送AT89C51中40H開始的16個字節中
MOV SLA,#0A0H ;24C01C地址字,偽寫入操作
MOV SUBA,#30H ;目標地址
MOV NUMBYTE,#16 ;字節數
LCALL IRDNBYTE ;寫數據
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -