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

📄 i2cmem1.asm

📁 proteus 仿真实例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                 LIST    p=16F877
                 #include "P16F877.INC"

SDO              EQU 7
CLK              EQU 6

                 ORG   0
entrypoint       goto  start

                 ORG   4
intvector        goto    intvector

                 CBLOCK 0x30
                    address, value, byte, bit, ack
                    lc1, lc2, lc3
                 ENDC


set_sdo_high     bcf    STATUS,RP0
                 bcf    PORTC,SDO
                 bsf    STATUS,RP0
                 bsf    TRISC,SDO
                 bcf    STATUS,RP0
                 return

set_sdo_low      bcf    STATUS,RP0
                 bcf    PORTC,SDO
                 bsf    STATUS,RP0
                 bcf    TRISC,SDO
                 bcf    STATUS,RP0
                 return

;-----------------------------------------------------------
set_clk_high     bcf    STATUS,RP0
                 bsf    PORTC,CLK
                 bsf    STATUS,RP0
                 bcf    TRISC,CLK
                 bcf    STATUS,RP0
                 return

;-----------------------------------------------------------
set_clk_low      bcf    STATUS,RP0
                 bcf    PORTC,CLK
                 bsf    STATUS,RP0
                 bcf    TRISC,CLK
                 bcf    STATUS,RP0
                 return

;-----------------------------------------------------------
wait_quarter_bit movlw  0x06
                 movwf  lc1
wqb0:            decfsz lc1,F
                 goto   wqb0
                 return

;-----------------------------------------------------------
wait_half_bit    movlw  0x10
                 movwf  lc1
whb0:            decfsz lc1,F
                 goto   wqb0
                 return

;-----------------------------------------------------------
init             movlw 0xFF
                 movwf PORTC
                 movlw 0x00
                 bsf   STATUS,RP0
                 movwf TRISC
                 bcf   STATUS,RP0
                 return

;-----------------------------------------------------------
wr_start         call  set_clk_high
                 call  wait_half_bit
                 call  set_sdo_low
                 call  wait_half_bit
                 call  set_clk_low
                 call  wait_half_bit
                 call  wait_half_bit
                 call  wait_half_bit
                 return
;-----------------------------------------------------------
wr_stop          call  wait_half_bit
                 call  set_clk_low
                 call  wait_half_bit
                 call  set_sdo_low
                 call  wait_half_bit
                 call  set_clk_high
                 call  wait_half_bit
                 call  set_sdo_high
                 call  wait_half_bit
                 return

;-----------------------------------------------------------
wr_restart       call   set_clk_low
                 call   wait_half_bit
                 call   set_sdo_high
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_sdo_low
                 call   wait_half_bit
                 call   set_clk_low
                 call   wait_half_bit
                 return

;-----------------------------------------------------------
wr_ack           call   set_clk_low
                 call   wait_half_bit
                 call   set_sdo_low
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low
                 call   wait_half_bit
                 call   set_sdo_high
                 call   wait_half_bit
                 return

;-----------------------------------------------------------
wr_no_ack        call   set_clk_low
                 call   wait_half_bit
                 call   set_sdo_high
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low
                 call   wait_half_bit
                 call   wait_half_bit
                 return

;-----------------------------------------------------------
; Generate a reset by generating a stop followed by at least
; eight clock pulses.
wr_reset         call   wait_half_bit
                 call   set_clk_low
                 call   wait_half_bit
                 call   set_sdo_low
                 call   wait_half_bit
                 call   set_clk_high

                 movlw  0x40
                 movwf  lc1
wrr0:            decfsz lc1,F
                 goto   wrr0

                 call   set_sdo_high

                 movlw  0x40
                 movwf  lc1
wrr1:            decfsz lc1,F
                 goto   wrr1

                 call   set_clk_low             ; clk 0
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 1
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 2
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 3
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 4
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 5
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 6
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 7
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit
                 call   set_clk_low             ; clk 8
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_half_bit

                 return


;-----------------------------------------------------------
wr_bit           bcf   STATUS,RP0
                 call  wait_quarter_bit
                 movf  bit,w
                 andwf byte,w
                 btfsc STATUS,Z
                 goto  bit_is_0

bit_is_1         call  set_sdo_high
                 goto  wbit0

bit_is_0         call  set_sdo_low
                 goto  wbit0


wbit0            bcf   STATUS,RP0
                 call  wait_quarter_bit
                 call  set_clk_high
                 call  wait_half_bit
                 call  set_clk_low
                 return

;-----------------------------------------------------------
wr_byte          movwf byte
                 movlw 0x80
                 movwf bit

wbyte0           call  wr_bit
                 bcf   STATUS,C
                 rrf   bit,F
                 movf  bit,F
                 btfss STATUS,Z
                 goto  wbyte0

                 call  wait_quarter_bit
                 call  set_sdo_high
                 call  wait_quarter_bit
                 call  set_clk_high
                 call  wait_quarter_bit
                 movf  PORTC,W
                 andlw (1<<SDO)
                 xorlw (1<<SDO)
                 movwf ack
                 call  wait_quarter_bit
                 call  set_clk_low
                 call  wait_quarter_bit
                 return

;-----------------------------------------------------------
wr_halfbyte      movwf byte
                 movlw 0x08
                 movwf bit

whbyte0          call  wr_bit
                 bcf   STATUS,C
                 rrf   bit,F
                 movf  bit,F
                 btfss STATUS,Z
                 goto  whbyte0

                 call  wait_quarter_bit

⌨️ 快捷键说明

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