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

📄 i2cmem1.asm

📁 proteus 仿真实例
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                 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

;-----------------------------------------------------------
rd_bit           bcf    STATUS,RP0
                 call   set_sdo_high
                 call   set_clk_low
                 call   wait_half_bit
                 call   set_clk_high
                 call   wait_quarter_bit
                 movf   PORTC,W
                 andlw  (1<<SDO)
                 btfsc  STATUS,Z
                 goto   rd_bit_clear
                 movf   bit,W
                 iorwf  byte,F
rd_bit_clear     call   wait_quarter_bit
                 call   set_clk_low
                 return

;-----------------------------------------------------------
rd_byte          movlw  0x00
                 movwf  byte
                 movlw  0x80
                 movwf  bit

rbyte0           call   rd_bit
                 bcf    STATUS,C
                 rrf    bit,F
                 movf   bit,F
                 btfss  STATUS,Z
                 goto   rbyte0
                 movf   byte,W
                 return

;-----------------------------------------------------------
; Write W register to PORTD and hang.
wr_error         bcf   STATUS,RP0
                 movwf PORTD
                 bsf   STATUS,RP0
                 clrf  TRISD
                 bcf   STATUS,RP0

wre_flash        bsf    PORTA,0
                 movlw  0xFF
                 call   longwait
                 movlw  0xFF
                 call   longwait
                 bcf    PORTA,0
                 movlw  0xFF
                 call   longwait
                 movlw  0xFF
                 call   longwait
                 goto   wre_flash
                 return

;-----------------------------------------------------------
; Write W register to PORTD and hang.
wr_result        bcf   STATUS,RP0
                 movwf PORTD
                 bsf   STATUS,RP0
                 clrf  TRISD
                 bcf   STATUS,RP0

wrr_flash        bsf    PORTA,0
                 movlw  0x30
                 call   vlongwait
                 bcf    PORTA,0
                 movlw  0x03
                 call   vlongwait
                 goto   wrr_flash
                 return

;-----------------------------------------------------------
vlongwait        movwf  lc1
vlw1             movlw  0xFF
                 movwf  lc2
vlw2             movlw  0xFF
                 movwf  lc3
vlw3             decfsz lc3,F
                 goto   vlw3
                 decfsz lc2,F
                 goto   vlw2
                 decfsz lc1,F
                 goto   vlw1
                 return

;-----------------------------------------------------------
longwait         movwf  lc1
lw1              movlw  0xFF
                 movwf  lc2
lw2              decfsz lc2,F
                 goto   lw2
                 decfsz lc1,F
                 goto   lw1
                 return

;-----------------------------------------------------------
hang             goto  hang


;===========================================================
start            call  init
                 call  wr_reset


                 bcf   STATUS,RP0
                 clrf  PORTA
                 clrf  PORTD

                 bsf   STATUS,RP0
                 movlw 0x06
                 movwf ADCON1
                 movlw 0x20
                 movwf TRISA
                 clrf  TRISD

                 bcf   STATUS,RP0
                 clrf  PORTA
                 clrf  address
                 clrf  value

                 ; Test RA5 to see if we do writes:
                 btfss PORTA,5
                 goto  reset_addr

                 ; Do start condition:
main_wr_loop:    call   wr_start

                 ; Send write command:
                 movlw  0xA6
                 call   wr_byte
                 movlw  0x01
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 ; Send address:
                 movf   address,W
                 call   wr_byte
                 movlw  0x02
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 ; Send value:
                 movf   value,W
                 call   wr_byte
                 movlw  0x03
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 ; Do stop. This starts the write cycle.
                 call   wr_stop

                 ; Now poll for acknowledge:
poll_for_ack     call   wr_start
                 movlw  0xA6
                 call   wr_byte
                 movlw  0x04
                 movf   ack,F
                 btfsc  STATUS,Z
                 goto   poll_for_ack

                 ; Increment address/data and loop round:
                 incf   address
                 incf   value
                 btfss  address,4
                 goto   main_wr_loop

                 ; Cancel sucessful poll command:
                 call   wr_stop

wait             movlw  0x10
                 call   longwait

reset_addr       ; Generate start condition...
                 call   wr_start

                 ; Write command:
                 movlw  0xA6
                 call   wr_byte
                 movlw  0x05
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 ; Send address:
                 clrf   address
                 movf   address,W
                 call   wr_byte
                 movlw  0x06
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 ; Send stop:
                 call   wr_stop

read_bytes       call  wr_start
                 movlw  0xA7
                 call   wr_byte
                 movlw  0x07
                 movf   ack,F
                 btfsc  STATUS,Z
                 call   wr_error

                 bsf    PORTA,1
                 nop
                 nop
                 nop
                 bcf    PORTA,1

                 ; Do read:
main_rd_loop     call   rd_byte

                 ; Is this the value we expected?
                 movf   address,W
                 subwf  byte,W
                 movlw  0x08
                 btfss  STATUS,Z
                 call   wr_error

                 ; Increment address/data and loop round:
                 incf   address
                 btfsc  address,4
                 goto   done

                 ; Not done yet so acknowledge byte and read next one:
                 call   wr_ack
                 goto   main_rd_loop


                 ; Stop condition marks end of sequential read:
done             call   wr_no_ack
                 call   wr_stop

                 ; End of test:
                 call hang

                 END

⌨️ 快捷键说明

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