⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.txt

📁 这是一个有关I2C的读与程序 让初学者有一个对I2C的全面了解
💻 TXT
字号:
;------- read EEPROM-------------------------------------------------------------------------------------
	MOVLW	0AEH
	MOVWF	SLAVE
	MOVLW	.1
	MOVWF	ADDR
	CALL	RDBYTE
	MOVF	DATAI,W
	MOVWF	ADDRESS_L

	MOVLW	0AEH
	MOVWF	SLAVE
	MOVLW	.2
	MOVWF	ADDR
	CALL	RDBYTE
	MOVF	DATAI,W
	MOVWF	ADDRESS_H

	MOVLW	.2
	SUBWF	ADDRESS_H,W
	BTFSS	STATUS,C
	GOTO	MAIN_LOOP
	MOVLW	.1
	MOVWF	ADDRESS_L
	CLRF	ADDRESS_H
;-------------------------------E2PROM        write e2prom-----------------------------------------------
	CLRWDT

	MOVLW	0AEH               ;   WRITE   BIT IS  0    
	MOVWF	SLAVE
	MOVLW	.1
	MOVWF	ADDR
	MOVF	ADDRESS_L,W;    write   low bit DATA
	MOVWF	DATAO
	CALL	WRBYTE
	CALL	DELAY_5
	
	;CLRWDT

	MOVLW	0AEH
	MOVWF	SLAVE
	MOVLW	.2
	MOVWF	ADDR
	MOVF	ADDRESS_H,W
	MOVWF	DATAO
	CALL	WRBYTE
	CALL	DELAY_5

	BCF	FLAG,ADDR_CHANGE
	NOP
	GOTO	MAIN_LOOP

 
;---------------------- I2C  BUS        ------------------------------------------------------------------------------
BSTART
;	MOVLW	00H
;	MOVWF	TRISC
	BCF	TRISC,3
	NOP
	BCF	TRISC,4
	BSF	I2C_SDA
	BSF	I2C_SCL
	MOVLW	.1
	BTFSS	I2C_SCL
	CALL	ERR
	BCF	I2C_SDA
	NOP
	NOP
	NOP
	BCF	I2C_SCL
	RETLW	0

BSTOP
;	MOVLW	00H
;	MOVWF	TRISC
	BCF	TRISC,3
	NOP
	BCF	TRISC,4
	BCF	I2C_SDA
	BSF	I2C_SCL
	NOP
	NOP
	NOP
	MOVLW	.1
	BTFSS	I2C_SCL
	CALL	ERR
	BSF	I2C_SDA
	MOVLW	.4
	BTFSS	I2C_SDA
	CALL	ERR
	RETLW	0
 	
ERR
	BTFSS   FLAG,ERRORS      ; Remain as first error encountered
	MOVWF   ERCODE          ; Save error code
	BSF     FLAG,ERRORS      ; Set error flag
	RETLW   0

;
;-----------------------------------------------------------------------------
;       Serial data send from PIC to serial EEPROM, bit-by-bit subroutine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
;
BITIN
;	MOVLW   B'00010000'     ; Force SDA line as input
;	MOVWF	TRISC
	BCF	TRISC,3
	NOP
	BSF	TRISC,4
	BSF     I2C_SDA          ; Set SDA for input
	BCF     EEPROM,DI
	BSF     I2C_SCL          ; Clock high
	MOVLW   1
	BTFSC   I2C_SCL          ; Skip if SCL  is high
	GOTO    BIT1
	BTFSS   FLAG,ERRORS      ; Remain as first error encountered
	MOVWF   ERCODE          ; Save error code
	BSF     FLAG,ERRORS      ; Set error flag
BIT1
	BTFSC   I2C_SDA          ; Read SDA pin
	BSF     EEPROM,DI       ; DI = 1
	NOP                     ; Delay
	BCF     I2C_SCL          ; Return SCL to low     
	RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       Serial data receive from serial EEPROM to PIC, bit-by-bit subroutine
;-----------------------------------------------------------------------------
;       Input   :       EEPROM file
;       Output  :       From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
;
BITOUT
;	MOVLW   00H     ; Set SDA, SCL as outputs
;	MOVWF	TRISC
	BCF	TRISC,3
	NOP
	BCF	TRISC,4
	BTFSS   EEPROM,DO
	GOTO    BIT0
	BSF     I2C_SDA          ; Output bit 0
	MOVLW   2
	BTFSC   I2C_SDA          ; Check for error code 2
	GOTO    CLK1
	BTFSS   FLAG,ERRORS      ; Remain as first error encountered
	MOVWF   ERCODE          ; Save error code
	BSF     FLAG,ERRORS      ; Set error flag
	GOTO    CLK1            ; SDA locked low by device
;
BIT0
	BCF     I2C_SDA          ; Output bit 0
	NOP                     ; Delay
	NOP
	NOP
CLK1
	BSF     I2C_SCL
	MOVLW   1               ; Error code 1
	BTFSC   I2C_SCL          ; SCL locked low?
	GOTO    BIT2            ; No.
	BTFSS   FLAG,ERRORS      ; Yes.
	MOVWF   ERCODE          ; Save error code
	BSF     FLAG,ERRORS      ; Set error flag
BIT2
	NOP
	NOP
	BCF     I2C_SCL          ; Return SCL to low
	RETLW   0
;
;END SUB
 PAGE
;
;
;-----------------------------------------------------------------------------
;       RECEIVE         DATA    subroutine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       RXBUF = Receive 8-bit data
;-----------------------------------------------------------------------------
;
RX
	MOVLW   .8              ; 8 bits of data
	MOVWF   COUNT
	CLRF    RXBUF
;
RXLP
	RLF     RXBUF,F         ; Shift data to buffer
	SKPC
	BCF     RXBUF,0         ; carry ---> f(0)
	SKPNC
	BSF     RXBUF,0
	CALL    BITIN
	BTFSC   EEPROM,DI
	BSF     RXBUF,0         ; Input bit =1
	DECFSZ  COUNT,F         ; 8 bits?
	GOTO    RXLP
	BSF     EEPROM,DO       ; Set acknowledge bit = 1
	CALL    BITOUT          ; to STOP further input
	RETLW   0
;
;END SUB
;
;-----------------------------------------------------------------------------
;       TRANSMIT        DATA    subroutine
;-----------------------------------------------------------------------------
;       Input   :       TXBUF
;       Output  :       Data X'mitted to EEPROM device
;-----------------------------------------------------------------------------
;
TX
	MOVLW   .8
	MOVWF   COUNT
;
TXLP
	BCF     EEPROM,DO       ; Shift data bit out.
	BTFSC   TXBUF,7         ; If shifted bit = 0, data bit = 0
	BSF     EEPROM,DO       ; Otherwise data bit = 1
	CALL    BITOUT          ; Serial data out
	RLF     TXBUF,F         ; Rotate TXBUF left
	SKPC                    ; f(6) ---> f(7)
	BCF     TXBUF,0         ; f(7) ---> carry
	SKPNC                   ; carry ---> f(0)
	BSF     TXBUF,0
	DECFSZ  COUNT,F         ; 8 bits done?
	GOTO    TXLP            ; No.
	CALL    BITIN           ; Read acknowledge bit
	MOVLW   3
	BTFSC   EEPROM,DI       ; Check for acknowledgement
	CALL    ERR             ; No acknowledge from device
	RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       BYTE-WRITE, write one byte to EEPROM device
;-----------------------------------------------------------------------------
;       Input   :       DATAO= data to be written
;                       ADDR    = destination address
;                       SLAVE   = device address (1010xxx0)
;       Output  :       Data written to EEPROM device
;-----------------------------------------------------------------------------
;
;	ORG     080             ; The location for BYTE-WRITE routine can be
;                               ; assigned anywhere between (377-777) octal.
WRBYTE
	MOVF    SLAVE,W         ; Get SLAVE address
	MOVWF   TXBUF           ; to TX buffer
	CALL    BSTART          ; Generate START bit
	CALL    TX              ; Output SLAVE address
	MOVF    ADDR,W          ; Get WORD address
	MOVWF   TXBUF           ; into buffer
	CALL    TX              ; Output WORD address
	MOVF    DATAO,W         ; Move DATA 
	MOVWF   TXBUF           ; into buffer
	CALL    TX              ; Output DATA and detect acknowledgement
	CALL    BSTOP           ; Generate STOP bit
	RETURN
;
;
;
;-----------------------------------------------------------------------------
;       BYTE-READ, read one byte from serial EEPROM device
;-----------------------------------------------------------------------------
;       Input   :       ADDR    = source address
;                       SLAVE   = device address (1010xxx0)
;       Output  :       DATAI   = data read from serial EEPROM
;-----------------------------------------------------------------------------
;
;	ORG     0C0             ; The location for BYTE-READ routine can be
;                               ; assigned anywhere between (377-777) octal.
RDBYTE
	MOVF    SLAVE,W         ; Move SLAVE address 
	MOVWF   TXBUF           ; into buffer (R/W = 0)
	CALL    BSTART          ; Generate START bit
	CALL    TX              ; Output SLAVE address. Check ACK.
	MOVF    ADDR,W          ; Get WORD address
	MOVWF   TXBUF
	CALL    TX              ; Output WORD address. Check ACK.
	CALL    BSTART          ; START READ (if only one device is
	MOVF    SLAVE,W         ; connected to the I2C bus)
	MOVWF   TXBUF
	BSF     TXBUF,0         ; Specify READ mode (R/W = 1)
	CALL    TX              ; Output SLAVE address
	CALL    RX              ; READ in data and acknowledge
	CALL    BSTOP           ; Generate STOP bit
	MOVF    RXBUF,W         ; Save data from buffer
	MOVWF   DATAI           ; to DATAI file.
	RETURN

;----------------------------------I2C END------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -