• <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频|成人a站免费|日本黄色片|久久久久无码AV

    技術(shù)熱線: 4007-888-234
    設(shè)計(jì)開發(fā)

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

    開發(fā)工具

    提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享

    技術(shù)支持

    從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!

    新品推廣

    提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力

    新聞中心

    提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)

    PIC單片機(jī)通訊EEPROM源程序(來(lái)源:21BBS)

    更新時(shí)間: 2019-03-21
    閱讀量:568

    ;=======================================        

    ;PIC16C74B單片機(jī)與AT24C64通訊

    ;該程序?qū)崿F(xiàn)的功能是:

    ;將I2C_A,I2C_B.....I2C_K內(nèi)容寫入EEPROM中

    ;同時(shí)在EEPROM中讀出數(shù)據(jù)從新寫入各個(gè)寄存器

    ;=======================================

            LIST  P=16C74B

            #include

            ERRORLEVEL  -302

    I2C_A    EQU      0X20    

    I2C_B    EQU      0X21

    I2C_C    EQU      0X22

    I2C_D    EQU      0X23

    I2C_E    EQU      0X24

    I2C_F    EQU      0X25

    I2C_G    EQU      0X26    

    REG1     EQU      0X2B

    REG2     EQU      0X2C

    COUNT    EQU      0X71            ;I2C

    BCOUNT   EQU      0X72            ;I2C

    TXBUF    EQU      0X73            ;I2C

    RXBUF    EQU      0X74            ;I2C

    BUSCON   EQU      0X75            ;I2C

    BUSSTA   EQU      0X76            ;I2C

    I2CBUF   EQU      0X77            ;I2C

    SLAVEADDR        EQU    0XA0      ;I2C

    DATAADDRH        EQU    0X01      ;I2C

    DATAADDRL        EQU    0X00      ;I2C

    ;---------------------------------------    

    ;BUSCON

    ;---------------------------------------    

    SLAVE_RW        EQU       7

    LAST_BYTE_RX    EQU       6

    SLAVE_ACTIVE    EQU       5

    TIME_OUT        EQU       4

    ;---------------------------------------    

    ;BUSSTA

    ;---------------------------------------

    BUS_BUSY          EQU       7

    TX_PROGRESS       EQU       6

    RX_PROGRESS       EQU       5

    TX_SUCCESS        EQU       4

    RX_SUCCESS        EQU       3

    FATAL_ERROR       EQU       2    ;SLAVE EEPROM 

    ABORT             EQU      1

    ACK_ERROR         EQU       0

    ;---------------------------------------

    R_NOT_W  EQU       0           

    TRUE     EQU       1

    FALSE    EQU       0

    SDA      EQU     0X04            ;I2C

    SCL      EQU     0X03            ;I2C

    ;=======================================

            ORG     0X00

            GOTO    START

            ORG     0X20

    START   BCF     STATUS,RP1

            BCF     STATUS,RP0

            CLRF    RA

            CLRF    RB

            CLRF    RC

            CLRF    RD

            CLRF    RE      

            BSF     STATUS,RP0

            CLRF    TRISA

            CLRF    TRISB                      

            CLRF    TRISC

            CLRF    TRISD

            CLRF    TRISE

            MOVLW   0X02

            MOVWF   I2C_A

            MOVLW   0X04

            MOVWF   I2C_B

            MOVLW   0X03

            MOVWF   I2C_C

            MOVLW   0X03

            MOVWF   I2C_D

            MOVLW   0X05

            MOVWF   I2C_E

            MOVLW   0X06

            MOVWF   I2C_F

            MOVLW   0X04

            MOVWF   I2C_G

    ;=======================================        

    START1  

            CALL   I2CBUS_INIT

            CALL   REGTOI2CBUF

            CALL   I2CWRITE

            CALL   CLRI2CBUF

            CALL   D10

            CALL   I2CREAD      

            CALL   I2CBUFTOREG

            GOTO   START1

    ;=======================================    

    ;CLRI2CBUF

    ;---------------------------------------

    CLRI2CBUF

            BCF        STATUS,RP0

            MOVLW      I2CBUF

            MOVWF      FSR

            MOVLW      0X08

            MOVWF      COUNT

    CLRLOOP CLRF       INDF

            INCF       FSR,F

            DECFSZ     COUNT,F

            GOTO       CLRLOOP

            RETURN

    ;---------------------------------------    

    ;將各個(gè)REGSTER數(shù)據(jù)寫入 I2CBUF 緩沖區(qū)

    ;---------------------------------------

    REGTOI2CBUF

            BCF        STATUS,RP0

            MOVLW      I2CBUF

            MOVWF      FSR

            MOVF       I2C_A,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_B,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_C,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_D,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_E,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_F,W

            MOVWF      INDF

            INCF       FSR,F

            MOVF       I2C_G,W

            MOVWF      INDF

            RETURN

    ;---------------------------------------

    ;將 I2CBUF 緩沖區(qū)數(shù)據(jù)寫入各個(gè)REGSTER 

    ;---------------------------------------        

    I2CBUFTOREG

            BCF        STATUS,RP0

            MOVLW      I2CBUF

            MOVWF      FSR

            MOVF       INDF,W

            MOVWF      I2C_A

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_B

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_C

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_D

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_E

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_F

            INCF       FSR,F

            MOVF       INDF,W

            MOVWF      I2C_G

            RETURN

    ;=======================================    

    ;將I2CBUF緩沖區(qū)內(nèi)的數(shù)據(jù)寫入EEPROM

    ;=======================================

    I2CWRITE

            CALL       I2CSTART

            BTFSS      BUSSTA,BUS_BUSY

            GOTO       TX_FAIL

            BCF        BUSCON,SLAVE_RW

            CALL       TX_SLAVE_ADDR

            BTFSS      BUSSTA,TX_SUCCESS    ;SUCESSFULL?

            GOTO       TX_FAIL

            CALL       TX_DATA_ADDR

            BTFSS      BUSSTA,TX_SUCCESS

            GOTO       TX_FAIL

            MOVLW      I2CBUF

            MOVWF      FSR

            MOVLW      07

            MOVWF      COUNT

    T_BYTE_LOOP

            MOVF       INDF,W

            MOVWF      TXBUF

            CALL       I2CTXB

            BTFSS      BUSSTA,TX_SUCCESS

            GOTO       TX_FAIL

            INCF       FSR,F

            DECFSZ     COUNT,F

            GOTO       T_BYTE_LOOP

            GOTO       TX_PASS

    TX_FAIL CALL       I2CSTOP

            BCF        BUSSTA,TX_PROGRESS

            BCF        BUSSTA,TX_SUCCESS

            RETLW      FALSE

    TX_PASS

            CALL       I2CSTOP

            BCF        BUSSTA,TX_PROGRESS

            RETLW      TRUE

    ;---------------------------------------            

    ;從 EEPROM 中讀出數(shù)據(jù)到 I2CBUF 寄存器

    ;---------------------------------------

    I2CREAD BCF        STATUS,RP0

            BCF        BUSSTA,RX_SUCCESS

            CALL       I2CSTART

            BTFSS      BUSSTA,BUS_BUSY

            GOTO       RX_FAIL

            BCF        BUSCON,SLAVE_RW

            CALL       TX_SLAVE_ADDR

            BTFSS      BUSSTA,TX_SUCCESS   

            GOTO       RX_FAIL

            CALL       TX_DATA_ADDR

            BTFSS      BUSSTA,TX_SUCCESS

            GOTO       RX_FAIL

            CALL       I2CSTART

            BSF        BUSCON,SLAVE_RW

            CALL       TX_SLAVE_ADDR

            BTFSS      BUSSTA,TX_SUCCESS 

            GOTO       RX_FAIL

            BCF        BUSSTA,LAST_BYTE_RX

            MOVLW      I2CBUF

            MOVWF      FSR

            MOVLW      07

            MOVWF      COUNT 

    R_BYTE_LOOP

            MOVLW      0X01

            XORWF      COUNT,W

            BTFSC      STATUS,Z

            BSF        BUSSTA,LAST_BYTE_RX

            CALL       I2CRXB

            BTFSS      BUSSTA,RX_SUCCESS

            GOTO       RX_FAIL

            MOVF       RXBUF,W     

            MOVWF      INDF

            INCF       FSR,F

            DECFSZ  COUNT,F

            GOTO       R_BYTE_LOOP 

            GOTO       RX_PASS

    RX_FAIL CALL       I2CSTOP

            BCF        BUSSTA,RX_PROGRESS

            BCF        BUSSTA,RX_SUCCESS

            RETLW      FALSE  

    RX_PASS CALL       I2CSTOP

               BCF        STATUS,RP0

            BCF        BUSSTA,TX_PROGRESS

            BCF        BUSSTA,RX_PROGRESS

            BSF        BUSSTA,RX_SUCCESS

            RETLW      TRUE

    ;=======================================        

    ; I2C 初始化

    ;=======================================

    I2CBUS_INIT

            BCF        STATUS,RP0

            MOVF       RC,W

            ANDLW      0X18

            MOVWF      RC

            CLRF       BUSSTA

            CLRF       BUSCON

            RETURN         

    ;=======================================    

    ; 傳送設(shè)備地址

    ;入口:  BUSCON

    ;出口:  BUSSTA

    ;=======================================

    TX_SLAVE_ADDR

            BCF        STATUS,RP0

            BCF        BUSSTA,ACK_ERROR

            MOVLW      SLAVEADDR

            MOVWF      TXBUF

            BTFSC      BUSCON,SLAVE_RW

            BSF       TXBUF,R_NOT_W

            CALL       I2CTXB           

            BTFSC      BUSSTA,TX_SUCCESS 

            GOTO       TXADDR_SUCCESS

            CLRWDT

            BTFSS      BUSSTA,ACK_ERROR

            CALL       I2CSTOP

            GOTO       TXADDR_END

    TXADDR_SUCCESS

            CLRWDT

    TXADDR_END

            RETURN

    ;=======================================    

    ;TX_DATA_ADDR   發(fā)送寫/讀的地址

    ;=======================================

    TX_DATA_ADDR

            BCF        STATUS,RP0

            MOVLW      DATAADDRH

            MOVWF      TXBUF

            CALL       I2CTXB

            BCF        STATUS,RP0

            BTFSS      BUSSTA,TX_SUCCESS

            GOTO       TX_DATA_ADDR_ERROR

            MOVLW      DATAADDRL

            MOVWF      TXBUF

            CALL       I2CTXB

            BCF        STATUS,RP0

            BTFSS      BUSSTA,TX_SUCCESS

            GOTO       TX_DATA_ADDR_ERROR

            GOTO       TX_DATA_END

    TX_DATA_ADDR_ERROR

            BCF        BUSSTA,TX_PROGRESS

            BCF        BUSSTA,TX_SUCCESS

            BSF        BUSSTA,ACK_ERROR

    TX_DATA_END

            RETURN

    ;=======================================    

    ;向 EEPROM 輸出一個(gè)8位數(shù)據(jù),并檢測(cè)EEPROM的ACK信號(hào)

    ;入口:  TXBUF  寄存器

    ;       BUSSTA 寄存器

    ;出口:  EEPROM 存儲(chǔ)器

    ;       BUSSTA 寄存器

     ;======================================    

    I2CTXB  BCF        STATUS,RP0

            BSF        BUSSTA,TX_PROGRESS

            BCF        BUSSTA,TX_SUCCESS

            MOVLW      0X08

            MOVWF      BCOUNT

    TXLOOP  CLRWDT                

            BSF        STATUS,RP0     

            BCF        TRISC,SCL 

            NOP    

            BCF        TRISC,SDA     

            BCF        STATUS,RP0    

            RLF        TXBUF,F       

            BSF        STATUS,RP0

            BTFSC      STATUS,C

            BSF        TRISC,SDA

            NOP

            BSF        TRISC,SCL

            NOP

            NOP

            BCF        STATUS,RP0

            DECFSZ     BCOUNT,F

            GOTO       TXLOOP

    ;---------------------------------------

    ;檢測(cè)是EEPROM否有ACK信號(hào)產(chǎn)生,產(chǎn)生為正常

    ;檢測(cè)方法:

    ;   1. 將RC口的SCL.SDA分別設(shè)置為輸出和輸入狀態(tài)

    ;   2. 延時(shí)2個(gè)指令周期,將SCL設(shè)置為高電平

    ;   3. 延時(shí)2個(gè)指令周期,檢測(cè)RC口SDA的狀態(tài)

    ;   4. 如果為高電平,設(shè)置錯(cuò)誤狀態(tài),返回

    ;   5. 如果為低電平,延時(shí)2個(gè)指令周期后,將RC口SCL設(shè)置為低電平,繼續(xù)執(zhí)行

    ;---------------------------------------

            BSF        STATUS,RP0

            BCF        TRISC,SCL

            BSF        TRISC,SDA

            NOP

            NOP

            BSF        TRISC,SCL

            NOP

            BCF        STATUS,RP0

            BTFSC      RC,SDA

            GOTO       TX_ERR

            BSF        STATUS,RP0

            BCF        TRISC,SCL

            BCF        STATUS,RP0

            BCF        BUSSTA,TX_PROGRESS

            BSF        BUSSTA,TX_SUCCESS

            BCF        BUSSTA,ACK_ERROR

            GOTO       TX_END

    TX_ERR  BCF        BUSSTA,TX_PROGRESS

            BCF        BUSSTA,TX_SUCCESS

            BSF        BUSSTA,ACK_ERROR

    TX_END  RETURN

    ;=======================================

    ;從EEPROM中讀出 8 位的數(shù)據(jù),并發(fā)送發(fā)送ACK信號(hào)

    ;入口:  EEPROM  存儲(chǔ)器

    ;       BUSCON  寄存器

    ;出口:  RXBUF   寄存器

    ;       BUSSTA  寄存器

    ;=======================================

    I2CRXB  BCF        STATUS,RP0

            BSF        BUSSTA,RX_PROGRESS

            BCF        BUSSTA,RX_SUCCESS

            MOVLW      0X08

            MOVWF      BCOUNT

    RXLOOP  CLRWDT

            BSF        STATUS,RP0

            BCF        TRISC,SCL          ;定義TRISC為輸出

            BSF        TRISC,SDA          ;定義TRISC為輸入       

            NOP              

            NOP

            BSF        TRISC,SCL          ;TRISC輸出高電平

            NOP

            BCF        STATUS,RP0

            BCF        STATUS,C

            BTFSC      RC,SDA             ;原指令為BTFSC TRISC,SDA

            BSF        STATUS,C

            RLF        RXBUF,F

            DECFSZ     BCOUNT,F

            GOTO       RXLOOP

    ;---------------------------------------

    ;發(fā)送ACK信號(hào)到EEPROM

    ;判斷接收的是否為最后一個(gè)字節(jié)

    ;LAST_BYTE_RX為1,是    SDA發(fā)送一個(gè)高電平,結(jié)束

    ;LAST_BYTE_RX為0,不是  SDA發(fā)送一個(gè)低電平ACK,繼續(xù)接收

    ;---------------------------------------

            BSF        STATUS,RP0

            BCF        TRISC,SCL      

            BCF        TRISC,SDA      

            BTFSC      BUSCON,LAST_BYTE_RX      ;檢測(cè)是否是最后一個(gè)字節(jié)

            BSF        TRISC,SDA                ;是最后一個(gè)字節(jié)

            NOP                             ;發(fā)送ACK信號(hào)

            BSF        TRISC,SCL

            NOP

            NOP

            NOP

            NOP

            BCF        TRISC,SCL

            BCF        STATUS,RP0

            BCF        BUSSTA,RX_PROGRESS   

            BSF        BUSSTA,RX_SUCCESS

            RETURN

    ;=======================================

    ;I2C 開始信號(hào)

    ;輸入:  無(wú)

    ;輸出:  BUFSSTA

    ;=======================================

    I2CSTART

            BSF     STATUS,RP0

            BSF     TRISC,SDA    ;1US

            NOP                     ;1US

            BSF     TRISC,SCL       ;1US

            NOP

            NOP

            BCF     TRISC,SDA

            NOP

            NOP

            BCF     STATUS,RP0

            BSF     BUSSTA,BUS_BUSY

            RETURN

    ;=======================================

    ;I2C 結(jié)束信號(hào)

    ;輸入:  無(wú)

    ;輸出:  BUSSTA

    ;=======================================

    I2CSTOP

            BSF     STATUS,RP0

            BCF     TRISC,SCL

            BCF     TRISC,SDA

            BSF     TRISC,SCL

            NOP

            NOP

            BSF     TRISC,SDA

            NOP

            BCF     STATUS,RP0

            BCF     BUSSTA,BUS_BUSY              

            RETURN

    ;=======================================

    ; D10 @

    ;  clock in 4Mhz

    ;  delay 10ms

    ;=======================================    

    D10    MOVLW    0X0D        

        MOVWF    REG1

    LOOP2    MOVLW    0XFF        

        MOVWF    REG2

    LOOP1    DECFSZ    REG2,f

        GOTO    LOOP1

        DECFSZ    REG1,f

        GOTO    LOOP2

        RETURN

    ;=======================================

    I2CERR  CLRWDT

            NOP

            NOP

            NOP

            RETURN 

           END

                       SSP控制寄存器SSPCON


    WCOL    SSPOV    SSPEN    CKP    SSPM3    SSPM2    SSPM1    SSPM0    地址:14h上電值:00h

        │        │      │      │     │                        │

        │        │      │      │     ├────────────┘

        │        │      │      │     │            

        │        │      │      │     └── 同步串行口(SSP)模式選擇

        │        │      │      │              0000= SPI主控模式,時(shí)針=OSC/4

        │        │      │      │              0001= SPI主控模式,時(shí)針=OSC/16

        │        │      │      │              0010= SPI主控模式,時(shí)針=OSC/64

        │        │      │      │              0011= SPI主控模式,時(shí)鐘=TMR2輸出/2

        │        │      │      │              0100= SPI從屬模式,時(shí)鐘=SCK腳輸入,SS腳使能

        │        │      │      │              0101= SPI從屬模式,時(shí)鐘=SCK腳輸入,SS腳關(guān)閉

        │        │      │      │              0110=I2C從屬模式,7位地址

        │        │      │      │              0111=I2C從屬模式,10位地址

        │        │      │      │              1011=I2C主控模式(從屬模式關(guān)閉)

        │        │      │      │              1110=I2C從屬模式,7位地址,并支持主控模式

        │        │      │      │              1111=I2C從屬模式,10位地址,并支持主控模式

        │        │      │      └───── 時(shí)鐘極性選擇

        │        │      │                       &middot;SPI模式

        │        │      │                          1=下降沿發(fā)送,上升沿接收

        │        │      │                          0=上升沿發(fā)送,下降沿接收

        │        │      │                       &middot;I2C模式

        │        │      │                          1=時(shí)鐘使能(時(shí)鐘線釋放)

        │        │      │                          0=時(shí)鐘線鎖定為低電平,以保證數(shù)據(jù)建立時(shí)間

        │        │      └────── 同步串行口(SSP)使能位

        │        │                        &middot;SPI模式

        │        │                          1=使能SPI模塊,并定義SCK,SDO和SDI為傳輸線

        │        │                          0=關(guān)閉SPI模塊,釋放SCK,SDO和SDI為一般I/O線

        │        │                        &middot;I2C模式:

        │        │                          1=使能I2C模塊,并定義SDA和SCL為傳輸線

        │        │                          0=關(guān)閉I2C模塊,釋放SDA和SCL為一般I/O線

        │        │                          注:當(dāng)使能SPP時(shí),這些傳輸線應(yīng)由用戶定義為正確的

        │        │                              輸入/輸出方向,詳見各相應(yīng)章節(jié)。

        │        └────────── 接收溢出位。

        │                                  1=發(fā)生接收溢出,詳見具體章節(jié)介紹。

        │                                  0=未發(fā)生接收溢出。

        └─────────────── 寫操作沖突標(biāo)志位

                                            1=在傳送過(guò)程中又有數(shù)據(jù)試圖寫入SSPBUF寄存器。

                                               該位需由軟件清零。

                                            0=未發(fā)生寫操作沖突。

     SSP狀態(tài)寄存器SSPSTAT


                       R     R     R     R     R     R

             ─  ─   D/A    P     S    R/W    UA    BF    地址:94h上電值:00h

             │  │   │    │    │    │    │    │

             └┬┘   │    │    │    │    │    └──── 緩沖區(qū)滿

               │     │    │    │    │    │               &middot;接收(SPI和I2C模式)

               │     │    │    │    │    │                  1=接收完成,SSPBUF滿

               │     │    │    │    │    │                  0=接收未完成,SSPBUF空

               │     │    │    │    │    │               &middot;發(fā)送(I2C模式)

               │     │    │    │    │    │                  1=發(fā)送正在進(jìn)行,SSPBUF滿

               │     │    │    │    │    │                  0=發(fā)送已經(jīng)完成,SSPBUF空

               │     │    │    │    │    └────── 地址更新(10位I2C從屬模式)

               │     │    │    │    │                      1=通知用戶更新SSPADD中的地址

               │     │    │    │    │                      0=地址尚不需更新

               │     │    │    │    └───────── 讀/寫信息位(I2C模式),該位記錄I2C

               │     │    │    │                            的讀/寫狀態(tài)。用戶需用這個(gè)位來(lái)判

               │     │    │    │                            斷發(fā)送和接收狀態(tài)。

               │     │    │    │                              1=讀

               │     │    │    │                              0=寫

               │     │    │    └────────────── 起始位(I2C模式)

               │     │    │                                     1=I2C線上檢測(cè)到起始位

               │     │    │                                     0=I2C線上未檢測(cè)到起始位

               │     │    └───────────────── 停止位(I2C模式)

               │     │                                           1=I2C線上檢測(cè)到停止位

               │     │                                           0=I2C線上未檢測(cè)到停止位

               │     └──────────────────── 數(shù)據(jù)/地址位(I2C模式)

               │                                                  1=最后收到的字節(jié)是數(shù)據(jù)

               │                                                  0=最后收到的字節(jié)是地址

               └──────────────────────── 未用

    久久黄色 视频|我草AV|AV在线网站导航|色色97激情|无码人妻一区二区有奶水|日韩精品|大香蕉97视频
  • <tbody id="w8jhq"><dfn id="w8jhq"><pre id="w8jhq"></pre></dfn></tbody>
  • <fieldset id="w8jhq"><pre id="w8jhq"></pre></fieldset>