《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > PIC的一個讀寫I2C程序

PIC的一個讀寫I2C程序

2009-01-16
關(guān)鍵詞: I2C PIC

PIC的一個讀寫I2C程序

TITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x "
;
 LIST P=16C54
;
;************************************************************
;**  Two wire/I2C Bus READ/WRITE Sample Routines of Microchip's
;**  24Cxx / 85Cxx serial CMOS EEPROM interfacing to a
;**  PIC16C54 8-bit CMOS single chip microcomputer
;**  Revsied Version 2.0 (4/2/92).
;**
;**     Part use = PIC16C54-XT/JW                                          
;**  Note:  1) All timings are based on a reference crystal frequency of 2MHz
;**            which is equivalent to an instruction cycle time of 2 usec.
;**         2) Address and literal values are read in octal unless otherwise
;**            specified.
;********************************************************
;
;-----------------------------------------------------------------------------
;       Files Assignment
;-----------------------------------------------------------------------------
;
PC      EQU     2               ; Program counter
STAT    EQU     3               ; PIC status byte
FSR     EQU     4               ; File Select Register
RA      EQU     5               ; Port A use to select device address
RB      EQU     6               ; RB7 = SDA, RB6 = SCL
;
STATUS  EQU     08              ; Status register
FLAG    EQU     09              ; Common flag bits register
EEPROM  EQU     0A              ; Bit buffer
ERCODE  EQU     0B              ; Error code (to indicate bus status)
ADDR    EQU     10              ; Address register
DATAI   EQU     11              ; Stored data input register
DATAO   EQU     12              ; Stored data output register
SLAVE   EQU     13              ; Device address (1010xxx0)
TXBUF   EQU     14              ; TX buffer
RXBUF   EQU     15              ; RX buffer
COUNT   EQU     16              ; Bit counter
;
TIMER0  EQU     18              ; Delay timer0
TIMER1  EQU     19              ; Delay timer1
;
;
;-----------------------------------------------------------------------------
;                     Bit Assignments
;-----------------------------------------------------------------------------
;
; Status bits
;
Z       EQU     2
C       EQU     0
;
; FLAG Bits
;
ERROR   EQU     0               ; Error flag
;
; EEPROM Bits
;
DI      EQU     7               ; EEPROM input
DO      EQU     6               ; EEPROM output
;
; I2C Device Bits
;
SDA     EQU     7               ; RB7, data in/out
SCL     EQU     6               ; RB6, serial clock
;
;END FILES/BITS EQUATE
 PAGE
;
;-----------------------------------------------------------------------------
;       Two wire/I2C - CPU communication error status table and subroutine
;-----------------------------------------------------------------------------
;  input  :     W-reg   = error code
;  output :     ERCODE  = error code
;           FLAG(ERROR) = 1
;
;         code          error status mode
;       -------         ------------------------------------------------------
;           1   :       SCL locked low by device (bus is still busy)
;           2   :       SDA locked low by device (bus is still busy)
;           3   :       No acknowledge from device (no handshake)
;           4   :       SDA bus not released for master to generate STOP bit
;-----------------------------------------------------------------------------
;
;Subroutine to identify the status of the serial clock (SCL) and serial data
;(SDA) condition according to the error status table. Codes generated are
;useful for bus/device diagnosis.
;
ERR
 BTFSS   FLAG,ERROR      ; Remain as first error encountered
 MOVWF   ERCODE          ; Save error code
 BSF     FLAG,ERROR      ; Set error flag
 RETLW   0
;
;-----------------------------------------------------------------------------
;       START bus communication routine
;-----------------------------------------------------------------------------
;       input   : none
;       output  : initialize bus communication
;-----------------------------------------------------------------------------
;
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART
 MOVLW   B'00111111'     ; Put SCL, SDA line in output state
 TRIS    RB
;**************************************************************
 bsf     RB,SDA          ;make sure sda is high
;*******************************************************
 BSF     RB,SCL          ; Set clock high
 MOVLW   1               ; Ready error status code 1
 BTFSS   RB,SCL          ; Locked?
 CALL    ERR             ; SCL locked low by device
 BCF     RB,SDA          ; SDA goes low during SCL high
 NOP                     ; Timing adjustment
 NOP
 NOP
 BCF     RB,SCL          ; Start clock train
 RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       STOP bus communication routine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       Bus communication, STOP condition
;-----------------------------------------------------------------------------
;
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
;
BSTOP
;*********************************************************
 MOVLW   B'00111111'     ; Put SCL, SDA line in output state
 TRIS    RB
;**************************************************************
 BCF     RB,SDA          ; Return SDA to low
 BSF     RB,SCL          ; Set SCL high
 nop
 nop
 nop
 MOVLW   1               ; Ready error code 1
 BTFSS   RB,SCL          ; High?
 CALL    ERR             ; No, SCL locked low by device
 BSF     RB,SDA          ; SDA goes from low to high during SCL high
 MOVLW   4               ; Ready error code 4
 BTFSS   RB,SDA          ; High?
 CALL    ERR             ; No, SDA bus not release for STOP
 RETLW   0
;
;END SUB
;
;-----------------------------------------------------------------------------
;       Serial data send from PIC to serial EEPROM, bit-by-bit subroutine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
;
BITIN
 MOVLW   B'10111111'     ; Force SDA line as input
 TRIS    RB
 BSF     RB,SDA          ; Set SDA for input
 BCF     EEPROM,DI
 BSF     RB,SCL          ; Clock high
 MOVLW   1
 BTFSC   RB,SCL          ; Skip if SCL  is high
 GOTO    BIT1
 BTFSS   FLAG,ERROR      ; Remain as first error encountered
 MOVWF   ERCODE          ; Save error code
 BSF     FLAG,ERROR      ; Set error flag
BIT1
 BTFSC   RB,SDA          ; Read SDA pin
 BSF     EEPROM,DI       ; DI = 1
 NOP                     ; Delay
 BCF     RB,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   B'00111111'     ; Set SDA, SCL as outputs
 TRIS    RB
 BTFSS   EEPROM,DO
 GOTO    BIT0
 BSF     RB,SDA          ; Output bit 0
 MOVLW   2
 BTFSC   RB,SDA          ; Check for error code 2
 GOTO    CLK1
 BTFSS   FLAG,ERROR      ; Remain as first error encountered
 MOVWF   ERCODE          ; Save error code
 BSF     FLAG,ERROR      ; Set error flag
 GOTO    CLK1            ; SDA locked low by device
;
BIT0
 BCF     RB,SDA          ; Output bit 0
 NOP                     ; Delay
 NOP
 NOP
CLK1
 BSF     RB,SCL
 MOVLW   1               ; Error code 1
 BTFSC   RB,SCL          ; SCL locked low?
 GOTO    BIT2            ; No.
 BTFSS   FLAG,ERROR      ; Yes.
 MOVWF   ERCODE          ; Save error code
 BSF     FLAG,ERROR      ; Set error flag
BIT2
 NOP
 NOP
 BCF     RB,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           ; 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           ; 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           ; Rotate TXBUF left
 SKPC                    ; f(6) ---> f(7)
 BCF     TXBUF,0         ; f(7) ---> carry
 SKPNC                   ; carry ---> f(0)
 BSF     TXBUF,0
 DECFSZ  COUNT           ; 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
 goto    wrt_end
;
;
;
;-----------------------------------------------------------------------------
;       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.
 goto    rd_end
;
;Test program to read and write ramdom
start
 movlw   0AE             ;set A2=A1=A0=1
 movwf   SLAVE           ;       /
 movlw   2               ;set r/w loc. = 2
 movwf   ADDR            ;       /
 movlw   55              ;write 55 to SEEPROM
 movwf   DATAO           ;       /
 goto    WRBYTE          ;write a byte
wrt_end
 call    delay           ;wait for write
    ;operation (internal)
 goto    RDBYTE          ;read back data
rd_end
 movlw   55              ;test if read
 xorwf   DATAI,W         ;correct?
 btfss   STAT,Z          ;yes then skip
wrong  
 goto    wrong
correct
 goto    correct
;
;At 2.0Mhz, delay = approx. 3mS.
delay
 clrf    1F              ;clear last location
dly1
 nop
 nop
 nop
 decfsz  1F              ;reduce count
 goto    dly1            ;loop
 retlw   0
;
 org     0x1FF
 goto    start
;
 END

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品区一区| 亚洲电影毛片| 欧美国产91| 久久久水蜜桃av免费网站| 午夜在线观看欧美| 亚洲天堂免费观看| 一区二区国产日产| 99riav久久精品riav| 999亚洲国产精| 亚洲精品黄色| 日韩视频免费在线| 日韩视频免费在线| av成人免费在线| 一本色道久久综合精品竹菊| 亚洲精品中文字| 亚洲狼人综合| 亚洲美女淫视频| 日韩午夜在线| 99ri日韩精品视频| 正在播放亚洲| 亚洲永久免费精品| 亚洲欧美99| 欧美一区视频| 欧美在线不卡| 久久手机免费观看| 老牛国产精品一区的观看方式| 久久天天躁夜夜躁狠狠躁2022| 久久美女艺术照精彩视频福利播放| 久久国产精品一区二区三区四区| 久久se精品一区精品二区| 久久精品99国产精品日本| 久久精品国产一区二区三| 久久久蜜桃精品| 久久午夜视频| 欧美不卡视频一区发布| 欧美激情一区二区| 国产精品mm| 国产麻豆9l精品三级站| 久久综合伊人77777蜜臀| 亚洲最黄网站| 欧美成人黑人xx视频免费观看| 亚洲精品中文字幕有码专区| 亚洲精品韩国| 亚洲性色视频| 欧美绝品在线观看成人午夜影视 | 国产精品成人一区| 国产精品视频九色porn| 国产一区二区三区在线观看网站| 激情综合色丁香一区二区| 亚洲激情第一页| 中文在线资源观看网站视频免费不卡| 亚洲欧美日韩一区二区| 久久精品一二三| 日韩视频在线一区| 亚洲欧美区自拍先锋| 久久精品国产精品亚洲综合| 欧美jjzz| 欧美性做爰猛烈叫床潮| 国产色视频一区| 最新高清无码专区| 亚洲欧美日韩国产精品| 91久久黄色| 午夜精品久久99蜜桃的功能介绍| 久久久久久亚洲综合影院红桃| 欧美激情第1页| 国产精品一区二区黑丝| 欧美日韩免费一区| 国产一区二区三区无遮挡| 亚洲精品乱码| 欧美亚洲三区| 亚洲视频欧洲视频| 久久天堂av综合合色| 欧美色123| 激情另类综合| 亚洲一区在线播放| 亚洲日本久久| 欧美在线播放视频| 欧美日韩亚洲一区三区 | 欧美性久久久| 亚洲第一精品夜夜躁人人爽| 亚洲一区二区在线免费观看| 亚洲欧洲日本专区| 欧美中文字幕| 欧美日韩免费一区二区三区| 激情视频一区二区三区| 亚洲视频一区在线观看| 亚洲精品影院在线观看| 久久九九99| 国产精品成人va在线观看| 亚洲成人中文| 性欧美18~19sex高清播放| 一本在线高清不卡dvd| 麻豆精品一区二区av白丝在线| 国产精品久久久亚洲一区| 亚洲人成人一区二区三区| 亚洲国产毛片完整版| 午夜精品三级视频福利| 欧美日本亚洲韩国国产| 在线欧美亚洲| 欧美一区二区在线| 午夜在线观看免费一区| 欧美日韩一区二区在线| 亚洲丰满在线| 久久国产福利国产秒拍| 欧美一区二粉嫩精品国产一线天| 欧美另类高清视频在线| 在线不卡a资源高清| 欧美亚洲网站| 欧美一级二区| 国产精品久久久久一区二区三区| 亚洲麻豆一区| 亚洲精品日本| 蜜桃视频一区| 激情一区二区| 久久精品欧洲| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲精品国产日韩| 女女同性精品视频| 一区久久精品| 久久激情视频久久| 久久久久久久综合日本| 国产女主播在线一区二区| 亚洲亚洲精品在线观看 | 亚洲图片欧美一区| 一区二区三区|亚洲午夜| 欧美国产三级| 亚洲激情影视| 亚洲美女淫视频| 欧美另类在线播放| 亚洲精品社区| 一本大道av伊人久久综合| 欧美黑人在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲欧美不卡| 欧美一区二区啪啪| 国产午夜精品一区理论片飘花| 亚洲女性喷水在线观看一区| 欧美在线视频播放| 国产精品一区三区| 欧美一区二区福利在线| 久久精品人人| 樱桃国产成人精品视频| 91久久精品国产91久久性色tv| 欧美成人激情视频| 亚洲日本欧美日韩高观看| 99精品国产福利在线观看免费| 欧美日韩国产影院| 在线一区观看| 欧美在线999| 一区二区在线观看av| 亚洲精品之草原avav久久| 欧美色图五月天| 亚洲网站视频| 久久精品成人一区二区三区蜜臀 | 国产日韩欧美一区二区三区在线观看 | 国产精品系列在线播放| 性欧美大战久久久久久久久| 久久精品二区| 在线观看国产精品淫| 日韩视频在线你懂得| 国产精品久久久久77777| 午夜天堂精品久久久久 | 精品1区2区| 99av国产精品欲麻豆| 国产精品久久久久久久午夜| 午夜久久99| 欧美高清视频一区二区三区在线观看| 亚洲精品日本| 欧美一区二区视频网站| 伊人精品成人久久综合软件| 日韩一级在线观看| 国产精品日韩精品欧美在线| 久久国产精品久久国产精品| 欧美电影专区| 亚洲午夜激情在线| 久久精品国产久精国产一老狼| 在线电影国产精品| 欧美一区二区免费| 欧美激情一区二区三区在线 | 亚洲一区中文| 红桃视频一区| 亚洲一品av免费观看| 国产一区深夜福利| 99精品福利视频| 国产午夜精品一区理论片飘花| 日韩亚洲不卡在线| 国产欧美精品在线观看| 亚洲欧洲日本国产| 国产精品久久久久久模特| 亚洲高清不卡在线| 国产精品swag| 亚洲欧洲综合另类在线| 国产精品视频自拍| 日韩午夜在线| 国产在线视频不卡二| 在线视频欧美一区| 精品二区久久| 午夜精品久久久久久| 亚洲大片在线观看| 久久高清一区|