專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享
從全面的產(chǎn)品導(dǎo)入到強大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力
提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)
用16F877完成的I2C通訊
W_TEMP EQU 72H ;W的臨時寄存器
STATUS_TEMP EQU 73H
DATA_W EQU 74H ;數(shù)據(jù)寫入寄存器
DATA_R EQU 75H ;數(shù)據(jù)讀出寄存器
SCL EQU 3 ;時鐘的位地址
SDA EQU 4
WP EQU 2 ;寫保護線
ADDRESS EQU 26H ;定義地址常數(shù)
VALUE EQU 55H ;計劃寫入的值
;----------------------------------------
ORG 0000H
NOP
CLRF PCLATH ;確保頁選位為0
CALL INIT_I2C ;I2C的初始化程序
CLRF DATA_R ;清數(shù)據(jù)讀取寄存器
MOVLW VALUE
MOVWF DATA_W
CALL WRITE ;調(diào)用寫子程序
CALL DELAY10MS ;延時
CALL READ ;調(diào)用讀子程序
GOTO $
;-------------------------------------------------------------------------
WRITE
WETSTART
CALL I2C_IDLE ;I2C的初始化程序
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN 建立啟動時序
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF 啟動時序是否完成
GOTO $-1
SENDWRTCOMM
MOVLW B'10100000' ; 7位地址+1位寫控制位
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST ;檢測應(yīng)答信號
SENDADDRESS
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測寄存器滿標(biāo)志位
GOTO $-1
MOVLW ADDRESS ;寫一個單元地址字節(jié)
BANKSEL SSPBUF
MOVWF SSPBUF ;開始一次字節(jié)寫操作
CALL WRTACKTEST ;檢測應(yīng)答信號
SENDDATA ;發(fā)送數(shù)據(jù)字節(jié)
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測寄存器滿標(biāo)志位
GOTO $-1
MOVF DATA_W,0 ;寫一個數(shù)據(jù)字節(jié)
BANKSEL SSPBUF
MOVWF SSPBUF ;開始一個字節(jié)寫操作
CALL WRTACKTEST ;檢測應(yīng)答信號
BANKSEL PIR1
BCF PIR1,3 ;SSPIF 清除MSSP的中斷標(biāo)志位
WRTSTOP
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN 停止
BANKSEL PIR1
BCF PIR1,3
RETURN
;-----------------------------------------------------------------------
READ
READSTART
CALL I2C_IDLE
BANKSEL PIR1
BCF PIR1,3
BANKSEL SSPCON2
BSF SSPCON2,0
BSF SSPCON2,RSEN
BANKSEL PIR1
BTFSS PIR1,3
GOTO $-1
WRTWRITE
MOVLW 0A0H
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
WRTADDRESS
MOVLW ADDRESS
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
CALL DELAY10MS
RESTART
CALL I2C_IDLE
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BANKSEL SSPCON2
BSF SSPCON2,0 ;SEN
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF
GOTO $-1
WRTREAD
MOVLW 0A1H
BANKSEL SSPBUF
MOVWF SSPBUF
CALL WRTACKTEST
BANKSEL PIR1
BCF PIR1,3 ; SSPIF
STARTREAD
BANKSEL SSPCON2
BSF SSPCON2,3 ;RCEN
READDATA
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BTFSS PIR1,3 ;SSPIF
GOTO $-1
BANKSEL SSPBUF
MOVF SSPBUF,0
MOVWF DATA_R
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
SENDREADNACK
BANKSEL SSPCON2
BSF SSPCON2,5 ;ACKDT
BSF SSPCON2,4 ;ACKEN
BANKSEL PIR1
BTFSS PIR1,3 ;SSPIF
GOTO $-1
READSTOP
BANKSEL SSPCON2
BSF SSPCON2,2 ;PEN
BANKSEL PIR1
BTFSS PIR1,3 ; SSPIF
GOTO $-1
BCF PIR1,3 ;SSPIF
RETURN
;----------------------------------------------------------------------
WRTACKTEST
BANKSEL PIR1
BCF PIR1,3 ;SSPIF
BTFSS PIR1,3
GOTO $-1
RETURN
;-----------------------------------------------------------------------------
I2C_IDLE
BANKSEL SSPSTAT
BTFSC SSPSTAT,2 ;R_W
GOTO $-1
MOVF SSPCON2,0
ANDLW 1FH
BTFSS STATUS,2 ;Z
GOTO $-3
RETURN
;------------------------------------------------------------------------
INIT_I2C
BANKSEL TRISC
BSF TRISC,SDA
BSF TRISC,SCL
BCF TRISE,WP
BANKSEL PORTE
BCF PORTE,WP
BANKSEL SSPADD
MOVLW 9
MOVWF SSPADD
BCF SSPSTAT,6
BSF SSPSTAT,7
BANKSEL SSPCON
MOVLW 38H
MOVWF SSPCON
RETURN
;------------------------------------------------------------------------
DELAY10MS
MOVLW 0FFH
MOVWF 7FH
L1 MOVLW 0FFH
MOVWF 7EH
L2 DECFSZ 7EH,1
GOTO L2
DECFSZ 7FH,1
GOTO L1
RETURN
END