📄 i2cmem1.asm
字号:
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 + -