天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

用16F877完成i2c通訊程序

更新時間: 2019-03-26
閱讀量:1736

16F877完成的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


联系我们: 客服| 珠海市| 土默特右旗| 南召县| 太谷县| 体育| 迁西县| 依安县| 巨野县| 肥城市| 吉木萨尔县| 宜阳县| 巴彦淖尔市| 宜州市| 临沂市| 抚宁县| 尉氏县| 乌拉特中旗| 塔城市| 华蓥市| 海晏县| 石渠县| 珲春市| 阳城县| 偃师市| 永年县| 西平县| 三原县| 福泉市| 日喀则市| 营口市| 耒阳市| 和田县| 南安市| 建水县| 延长县| 镇远县| 高唐县| 辽宁省| 阜宁县| 垫江县|