中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

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

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

開發(fā)工具

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

技術(shù)支持

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

新品推廣

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

新聞中心

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

PIC16F877單片機(jī)硬件IIC編程實(shí)例

更新時(shí)間: 2019-03-22
閱讀量:2931

單片機(jī)方案開發(fā)商深圳英銳恩分享PIC16F877單片機(jī)硬件IIC編程實(shí)例。

;****************************************************
;* 877I2CA.asm                                      *
;* Very simple I2C sample program without Display   *
;****************************************************
;*                                                  *
;* Written by:  Calvin Ho                           *
;*              Senior Applications Engr.           *
;*              Microchip Technology Inc.           *
;* Date:        12 April 2000                       *
;* Revision: 1.00                                *
;****************************************************

;*********************************************************************************************
; This source code provides a demonstration of the MSSP peripheral
; on the PIC16F877 MCU. 
; The additional external subroutine are used for LCD Module
; PIC16F877 磅︽繵瞯 : 4 Mhz
;
; The subroutines for I2C
; :I2C_BYTE_READ  ; Read a Byte from Address I2C_Addr and put into I2C_Data
; :I2C_BYTE_WRITE  ; Write to I2C_Addr with data @ I2C_Data
; :I2C_ACK_CHECK  ; Wait until I2C device can accept further command
; :InitI2C  ; Initial I2C Module
; :StartI2C  ; Set START Condition !!
; :StopI2C  ; Set STOP Condition
; :RstartI2C  ; Set Restart Condition
; :RecI2C   ; Enable I2C Receive
; :ACKI2C   ; Initial ACK response
; :NACKI2C   ; Initial NACK response
; :WaitI2C  ; Wait until SSPIF Set 

;*********************************************************************************************

 list p=16f877
 #include

   CBLOCK 0x20

  I2C_Data 
  I2C_Addr 
  
  ENDC

w_temp  EQU 0x72
status_temp EQU 0x73
pclath_temp EQU 0x74

 
;********************************************
; Locates startup code @ the reset vector
;********************************************

Reset_Addr
 org 0x00
 nop
 goto Prog_Main
 nop
 nop
 
 ;***************************************************************************
 ;**** The Start Address of ISR is 0x004
 ;**** "PUSH" & "POP" ㄏノ絛ㄒ : 続ノ鉤 PIC16F877 ΤSHARE BANK  PIC
 ;***************************************************************************

PUSH  
  movwf   w_temp            ; save off current W register contents
  movf STATUS,w          ; move status register into W register
  movwf status_temp       ; save off contents of STATUS register
  movf PCLATH,W

 movwf pclath_temp
 

POP
  movf pclath_temp,W
  movwf PCLATH
  movf    status_temp,w     ; retrieve copy of STATUS register
  movwf STATUS            ; restore pre-isr STATUS register contents
  swapf   w_temp,f
  swapf   w_temp,w          ; restore pre-isr W register contents
  retfie                    ; return from interrupt 
   
 
;----------------------------------------------------------------------

Prog_Main  

 BANKSEL TRISB   ; Select Bank 1
 movlw b'11000000'  ; setup PORTB
 movwf TRISB 

BSF     OPTION_REG,NOT_RBPU   ; Disable PORTB pull-ups
 BCF     STATUS, RP0      ; Select Bank 0

        call    InitI2C
   
Main:
 
 BANKSEL I2C_Addr
 movlw 0x18
 movwf I2C_Addr ;

 BANKSEL I2C_Data ; Bank Switching, in case its bank is differ than I2C_Addr !!
 movlw 0x99
 movwf I2C_Data ;
 call I2C_BYTE_WRITE ; Write to I2C Device when Address & Data are set OK

 call I2C_ACK_CHECK ; Check the ACK response, Wait until the Device Acknowledge 

 ; Issue !! The subroutine will not return until the device send ACK !!

 BANKSEL I2C_Addr
 movlw 0x18
 movwf I2C_Addr ;
 call I2C_BYTE_READ

 nop   ;
 nop   ;
 goto $


;****************************************************************************
I2C_BYTE_READ:   ; Read a Byte @ I2C_Addr to Buffer I2C_Data
;****************************************************************************

  call StartI2C ; Set SSPCON2.SEN
 call WaitI2C  ; Wait PIR1,SSPIF

BANKSEL SSPBUF
 movlw B'10100000' ; Write Command
 movwf SSPBUF
 call WaitI2C

 BANKSEL I2C_Addr ; The "BANKSEL" may not necessary if I2C_Addr is @ the same bank with SSPBUF
 movf I2C_Addr,W ; The Address you wish to "READ" from

 BANKSEL SSPBUF
  movwf SSPBUF
 call WaitI2C
 
  call RstartI2C ; Restart Condition !!
 call WaitI2C  ; Wait Until Restart OK !!

 BANKSEL SSPBUF
 movlw B'10100001' ; Write Read Command
 movwf SSPBUF
 call WaitI2C

call RecI2C  ; Enable I2C Receive
 call WaitI2C  ; Wait Until Buffer Received
 BANKSEL SSPBUF
 movf SSPBUF,W ; Save to I2C_Data First !! 
 BANKSEL I2C_Data
 movwf I2C_Data

 call NACKI2C  ; Initial NACK Response !!
 call WaitI2C  ; Wait until NACK sent out
 call StopI2C  ; Initial STOP Condition
 call WaitI2C  ; Wait Until STOP Condition Terminated
 return

;****************************************************************************
I2C_ACK_CHECK:   ; Read a Byte @ I2C_Addr to Buffer I2C_Data
;****************************************************************************

  call StartI2C ; Set SSPCON2.SEN
 call WaitI2C  ; Wait PIR1,SSPIF
 
 BANKSEL SSPBUF
 movlw B'10100001' ; Read Command
 movwf SSPBUF
 call WaitI2C
 

BANKSEL SSPCON2
 btfss SSPCON2,ACKSTAT ; Check ACKSTAT bit , 0 = ACK , 1 = NACK
 goto ACK_Return
 call StopI2C
 call WaitI2C
 goto I2C_ACK_CHECK
 
ACK_Return:
 call StopI2C  ; Initial STOP Condition
 call WaitI2C  ; Wait Until STOP Condition Terminated
 return

;****************************************************************************
I2C_BYTE_WRITE:   ; Write a Byte to I2C_Addr with I2C_Data
;****************************************************************************

call StartI2C ; Set SSPCON2.SEN
 call WaitI2C  ; Wait PIR1,SSPIF
 
 BANKSEL SSPBUF
 movlw B'10100000' ; Write Command
 movwf SSPBUF
 call WaitI2C

 BANKSEL I2C_Addr ; The "BANKSEL" may not necessary if I2C_Addr is @ the same bank with SSPBUF
 movf I2C_Addr,W ; The Address you wish to "READ" from
 BANKSEL SSPBUF
  movwf SSPBUF
 call WaitI2C

 BANKSEL I2C_Data
 movf I2C_Data,W 
 BANKSEL SSPBUF
 movwf SSPBUF
 call WaitI2C

  call StopI2C  ; Initial STOP Condition
 call WaitI2C  ; Wait Until STOP Condition Terminated
 return

;**********************************************************************
; The following subroutines perform commonly used I2C functions.
;**********************************************************************

InitI2C:   ; The subroutine of I2C Initialization
 BANKSEL TRISC
  movlw B'00011000' ; Initial PortC,bit 3 & 4 as Input
 movwf TRISC  ; RC3 = SCL  ,  RC4 = SDA

 BANKSEL PORTC
 movlw 0xff
 movwf PORTC

        movlw   0x09            ; This gives 100KHz I2C clock @ 4MHz
        banksel SSPADD
        movwf   SSPADD

   movlw   b'10000000'     ; Disable slew rate control.
        banksel SSPSTAT
        movwf   SSPSTAT
        movlw   b'00000000'     ;
        movwf   SSPCON2         ; Setup MSSP for continuous reception.
        movlw   b'00101000'     ; Enable MSSP and setup for I2C master
        banksel SSPCON          ; mode.
        movwf   SSPCON
 return


StartI2C   ; Initiate the I2C START condition.
        banksel SSPCON2
        bsf     SSPCON2,SEN
        return
       
StopI2C    ; Initiate the I2C STOP condition.
        banksel SSPCON2
        bsf     SSPCON2,PEN
        return
       
RstartI2C   ; Initiate the I2C restart condition.
        banksel SSPCON2
        bsf     SSPCON2,RSEN
        return
        

NACKI2C
        banksel SSPCON2
        bsf     SSPCON2,ACKDT    ; Set the ACK bit
        bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
        return
       
ACKI2C
        banksel SSPCON2
        bcf     SSPCON2,ACKDT    ; Clear the ACK bit
        bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
        return

RecI2C
        banksel SSPCON2         ;
        bsf     SSPCON2,RCEN    ; Set the receive enable bit.
        return


WaitI2C    ; Poll for SSPIF
        banksel PIR1
FLoop   btfss   PIR1,SSPIF
        goto    FLoop
        bcf     PIR1,SSPIF
        return

 
;----------------------------------------------------------------------
 
 end  ; *********** End Of Program !!!!!

大洼县| 健康| 澎湖县| 金溪县| 建始县| 韶山市| 许昌市| 萍乡市| 穆棱市| 洛隆县| 共和县| 峨山| 南澳县| 连平县| 攀枝花市| 三穗县| 浦东新区| 宁陵县| 攀枝花市| 梅州市| 宣汉县| 鄂伦春自治旗| 韶山市| 青铜峡市| 清镇市| 灵武市| 开原市| 二连浩特市| 淅川县| 巴林左旗| 台南县| 巫溪县| 尖扎县| 汕头市| 合江县| 江永县| 定南县| 察隅县| 砚山县| 南皮县| 桐庐县|