十年专注单片机方案开发的方案公司英锐恩,分享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