十年專注單片機方案開發的方案公司英銳恩,分享PIC16F877單片機完成i2c通訊程序。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
用PIC16F877完成的I2C通訊
W_TEMP EQU 72H ;W的臨時寄存器
STATUS_TEMP EQU 73H
DATA_W EQU 74H ;數據寫入寄存器
DATA_R EQU 75H ;數據讀出寄存器
SCL EQU 3 ;時鐘的位地址
SDA EQU 4
WP EQU 2 ;寫保護線
ADDRESS EQU 26H ;定義地址常數
VALUE EQU 55H ;計劃寫入的值
;----------------------------------------
ORG 0000H
NOP
CLRF PCLATH ;確保頁選位為0
CALL INIT_I2C ;I2C的初始化程序
CLRF DATA_R ;清數據讀取寄存器
MOVLW VALUE
MOVWF DATA_W
CALL WRITE ;調用寫子程序
CALL DELAY10MS ;延時
CALL READ ;調用讀子程序
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 ;檢測應答信號
SENDADDRESS
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測寄存器滿標志位
GOTO $-1
MOVLW ADDRESS ;寫一個單元地址字節
BANKSEL SSPBUF
MOVWF SSPBUF ;開始一次字節寫操作
CALL WRTACKTEST ;檢測應答信號
SENDDATA ;發送數據字節
BANKSEL SSPSTAT
BTFSC SSPSTAT,0 ;BF 檢測寄存器滿標志位
GOTO $-1
MOVF DATA_W,0 ;寫一個數據字節
BANKSEL SSPBUF
MOVWF SSPBUF ;開始一個字節寫操作
CALL WRTACKTEST ;檢測應答信號
BANKSEL PIR1
BCF PIR1,3 ;SSPIF 清除MSSP的中斷標志位
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